PORTC pe ATMega32

Scriu acest post pentru că e util să înveți din nopțile pierdute ale altora, ca să ai timp să-ți pierzi nopțile pe altceva, mai interesant :).

Am ajuns târziu ieri la școală, pentru că am fost să dau jos blana, și m-am hotărât să nu plec până nu fac modulul de condus motorul să meargă (o să scriu mai pe larg despre el, în mai multe posturi despre a mea viitoare licență). Evident, treaba părea simplă și a devenit tot mai groasă pe măsură ce treceau orele.

Am scăpat de câteva conexiuni greșite, mi-am dat seama ca am pus diodele de protecție de peste bobinele de la relee pe dos, totul părea ok până într-un punct. Pun un ATMega32 nou nouț în soclu, setez direct AVR Eclipseu la 1MHz ca sa nu mai resetez fuse-uri, programez, super tare, merge. Pun multimetru pe picioarele ATMega, care ar fi trebuit să tragă tot portul C pe ieșire, pe 0. Jumate din pini erau la 0. Restu, la Vcc. WTF?

Îmi dau seama un pic mai târziu că PC0 și PC1 sunt legați la conectorul meu pentru I2C, și sunte legați la Vcc cu niște pull-up-uri ca să meargă cu brick-urile NXT. Bun. Dar restul? Mai erau cel puțini 3 pini care erau strâmbi. Din care unu exact ăla pe care mi-am legat eu ieșirile pentru comanda la motor. Am mai pierdut vreo oră, două întrebându-l pe prof, căutând scurt-uri pe placă …

Am scos porțile logice, am zis ca poate fac alea ceva. Niet, no luck. Am schimbat controller-ul cu cel de la mașinuța pentru Eurobot, aceeași poveste. Într-un final, pe la 6:45 AM, deja mă ridicasem de pe scaun să merg la șaorma, mă gândesc să mă uit eu pe datasheet la ATMega să vad dacă n-au ei ceva șmecherie cu Portu C. Urmeaza partea cu informație utilă din acest post:

Se pare că ATMega32 (și presupun că și alte ATMega-uri) au anumite PORT-uri din portul C care nu pot fi utilizate pentru I/O în momentul în care este activat JTAG-ul pe controller. Este vorba despre pinii PC5, PC4, PC3 și PC2. Soluția, evident, este să se dezactiveze JTAG-ul. Asta se poate face prin de-programarea siguranței (fuse) JTAGEN de pe ATMega. Eu am folosit AVRDude (pentru Linux), pe Windows foloseam PonyProg. Pentru AVRDude, ca să nu cauți referințe grămadă prin datasheet, există site-ul asta, care îți formează automat comanda pentru avrdude.

Back to working on the car

M-am întors la lucrul la mașină, în timp ce încerc, în paralel, să dau câte o idee și la planul pentru Eurobot. Avem momentan două idei, două strategii diferite, fiecare cu bubele ei, dar măcar, de azi avem toate pisele de care avem nevoie. Acum trebuie doar să ne hotărâm cum vrem să le punem laolaltă :)

Pentru mașinuță am mai lucrat la controller-ul de viteză. Am reușit până la urmă, după multe experimente mai mult sau mai puțin reușite, urmărind o idee a domnului profesor, să fac un driver pentru motorul cu perii (motorul de mișcare) al mașinuței, folosind relee de 8A pentru puntea H (pentru direcție) și un pe post de intrerupător (pentru PWM). Schema asta funcționează primind PWM de undeva, dar controller-ul mașinuței encodează și direcția, tot în PWM (adică factor de umplere 50% înseamnă full stop, 0 înseamnă înapoi și 100% înseamnă full înainte).

Ca să pot să-i dau controllerului meu ce are nevoie (un semnal PWM pur, și doi pini de control pentru direcție înainte / înapoi) am folosit un ATMega32, de care mai aveam de la alte proiecte mai vechi. M-am tot câcâit să învăț cum se face un PWM și marți sau miercuri m-am pus și am citit documentația de la ATMega, și am produs un PWM, apoi am folosit Input Capture Unit-ul (guess what that does) să traduc semnalul PWM de la PMS5005 (placa de control a robotului) într-un PWM și o direcție pentru controller-ul meu. Cu sprijinul lui Dan și al osciloscopului am trecut peste o parte din bug-uri, dar încă nu reușesc să variez PWM-ul de la ieșire corect în funcție de PWM-ul de la intrare. Dunno why yet, dar dacă există oameni care știu pitfall-uri în partea asta de Input Capture, please do tell!

AVR plugin pentru Eclipse

De când am făcut marea trecere pe linux, găsesc tot mai multe tooluri la îndemână pentru lumea noastră, a geek-șilor, și tot mai puține pentru lumea ailaltă, știți voi, aia reală. Totuși, nu pot decât să mă bucur când găsesc ceva să-mi simplifice task-urile … creative.

Acum un an am avut o materie numită Proiectarea cu Microcontrollere (sau așa ceva, ideea e că numele de cod este PM), unde, pentru prima oară în 4 ani (atunci) de școala trebuia să construim noi un dispozitiv. Ideea e că am fost puși față în față cu seria ATMega de la Atmel, și ni s-au dat pași concreți spre realizarea unei chestiuțe care să chiar MEARGĂ. De atunci, toate planurile de world domination includ cel puțin un ATMega :).

Anyway, post-ul ăsta există pentru că am găsit ceva util. Procesoarele AVR au mai multe feluri de programatoare (și chiar de Debuggere real-time), există plăci de dezvoltare and stuff like that. (AVRFreaks este site-ul recunoscut ca cea mai bună sursă de informații :P). Îs enșpe mii de variante de procesoare, care se folosesc destul de larg în orice „home brewed” device. Anul trecut, ca să le programăm, sub Windows, trebuia să scriem sursa cumva, să facem un Makefile (care era oarecum complicat, din ce țin eu minte) și să folosim un soft (PonyProg) ca să încărcăm proiectul pe procesor.

Există destul de multe tool-uri pentru lucrul cu AVRuri (WinAVR are și un IDE integrat, am înțeles că există ceva numit CodeVision, mai sunt), dar eu n-am reușit să le fac să-mi meargă pe Windows (parțial pentru că nu există suport pentru programatorul neavansat pe care îl folosim noi, parțial pentru că eram prea tăntălău). Tool-ul general preferat de mine, din anul II, de la tema cu bridge-ul (prietenii știu de ce) este Eclipse, care e extrem de configurabil și sunt sigur că măcar compilarea se putea rezolva de „mână” și înainte.

Dar acum nu mai e nevoie. Există plugin-ul ăsta super, care este construit peste pluginul CDT (partea de C/C++ a Eclipse) și are niște unelte de compilat automat, uploadat pe device direct cu avrdude. Am vazut că avrdude există și pe Windows, deci nu văd de ce tool-ul ăsta n-ar merge la fel de beton cum îmi merge și mie pe linux. Am avut plugin-ul instalat și pe Windows, da nu m-am simțit împins nicicum să-l fac să meargă.

Am găsit prin avrfreaks doua link-uri cu cum să-l aranjezi să-ți meargă (trebuie setat programatorul fizic ce se folosește, noi am folosit SI-Prog, dar am văzut că acum se face la PM o treabă pe USB care nu știu exact cum funcționește … încă!). De ce ar face cineva tutoriale pentru oameni tehnici în format video n-am înțeles, așa că pe scurt despre ce trebuie să faceți să vă programați ATMega-ul dintr-un foc (*credit-ul pentru indicații merge la baieții din link-urile de mai sus, eu doar încerc să-l fac un pic mai cursiv, pentru oameni nerabdători ca mine :P):

1. Vă trebuie compilatorul (avr-gcc), și alte câteva jucării (avrdude e downloader  / uploader, libusb trebuie dacă folosiți un device care se programează pe USB, avr-libc e biblioteca standard)

sudo apt-get install binutils-avr, avr-gcc, avr-libc, avrdude, libusb

Cred că pachetul ăsta se numea altfel mai demult (gcc-avr), dar mie cu ăsta mi-o mers

2. Vă trebuie Eclipse (recomand 3.4, dacă nu aveți motive serioase de a rămâne la 3.3) și CDT >= 4 (eu îl am pe ultimu stable de la Ganymede)

3. Instalați plug-in-ul AVR (care are site de update pentru Eclipse, just add the site to the Eclipse sources list .P)

http://avr-eclipse.sourceforge.net/updatesite/

4. Faceți un proiect C nou în Eclipse, alegeți AVR Cross Target App, Alegeți Toolchain-ul cu avr-gcc (dacă mai aveți și altele), alegeți tipul de device și frecvența (ATMega16/32 au o frecvență bazată pe un oscilator intern, la 1MHz. La PM am învățat cum să-l ducem la maximul potențialului, cu un cristal de 16MHz – trebuie setate niște fuse-uri prin el).

5. Windows > Preferences > AVR > AVRDude. Bifați chestia aia cu Log output to console dacă vreți să vedeți ce face (recomandat). Adăugați o configurație nouă, în funcție de programatorul vostru (avrdude are suport pentru o gramada de configurații, eu folosesc cea mai simplă, probabil, SI-Prog.). Poate e o idee bună să îi spuneți acolo și ce port serial folosiți în cazul în care mai programați pe serială :).

* Pașii 4 și 5 sunt independenți și interschimbabili

6. Project > Preferences > AVRDude > alegeți configurația pe care tocmai ce ați salvat-o.

7. Project > Preferences > C / C++ Build aveți o opțiune Additional Tools in Toolchain, ar trebui să aveți selectat AVRDude și Generate HEX file for Flash Memory cel puțin selectate. Eu am selectat și Print Size și Generate Extended Listing (deși nu știu exact daca nu-s numa chestii de raportare și nu de programare efectiv)

8. Tot acolo aveți posibilitatea să configurați comanda către avrdude (dacă nu îl aveți în path sau dacă aveți nevoie de drepturi de root să folosiți portul pe care vreți să-l folosiți, tipu de la care preiau chestia asta o pus un sudo avrdude acolo. Eu mi-am modificat permisiunile pentru serială)

9. (Recomandat) Setați nivelul de optimizare la AVR Compiler la -Os (size optimization)

10. La următorul build, dacă aveți legat controllerul în programator, avrdude o să descarce hex-ul în controller.

Mai sunt niște viewuri pe-acolo pe care le puteți folosi, și este un buton direct de upload pe device (care pe mine mă enervează că se pune acolo sus in bară și la alte viewuri decât ale pluginului ăstuia)