Mokantis programuoti ir bandant savo schemas su mikrokontroleriais dažnai tenka visaip junginėti šviesos diodus, LCD ar kitą elektroniką. Dėl šios priežasties pasidariau nedidelę plokštę su ATmega16, kurios visi išvadai patogiai išvesti.
Pirmąją plokštę padariau 2006 metais, tačiau aprašau tik dabar…
Montažinė plokštė. Paspaudus atsidarys 600dpi vaizdas
Programuoju C kalba. Yra įvairių kompiliatoriu: mokamų, nemokamų, atviro kodo. Išbandžiau keletą, bet apsistojau ties WinAVR. Tai yra GCC http://gcc.gnu.org/ kompiliatorius pritaikytas AVR mikrovaldikliams. Programavimui naudoju WinAVR. Tam reikia įsidiegti WinAVR ir papildomų bibliotekų AVRlib. Visk1 diegit į C: diską (C:\WinAVR ir C:\AVRlib), nes kitaip neveikia. Prašiau trumpą pradžiamokslį, kuris tikiuosi bus kam nors naudingas 🙂
Norint pradėti programuoti, reikia įsijungti Programmers Notepad [WinAVR] ir susikurti nauja projektą (File->New->Project). Projekte turėtų būti programos C (File->New C/C++) failas bei makefile failas. Visus failus reikėtų laikyti viename kataloge.
Makefile perduoti įvairius parametrus kompiliatoriui ir programtoriui. Pvz. Makefile nurodomas koks mikrokontroleris naudojas, kokios bibliotekos, koks kvarcinio generatoriaus dažnis ir t.t. Makefile patogiausia kurti ir redaguoti naudojant MFile [WinAVR]. Įgudus, Makefile galima redaguoti ir su bet kokiu tekstiniu redaktoriumi.
Makefile pagrindinės dalys:
- Code generation – dar neimplementuotas;
- Main file name… – pasirenkamas pagrindinis programos failas be plėtinio;
- MCU type – pasirenkamas mikrokontroleris;
- Output format – išvedimo failo formatas. Pagal nutylėjimą naudojamas ihex (Intel hex);
- Optimization level – pasirenkamas optimizacijos lygmuo. Kuo optimizacija didesnė, tuo kodas kompaktiškesnis, tačiau atsiranda didesnė tikimybė atsirasti kompiliavimo klaidoms;
- Debug format – debug failo išvedimo formatas. Pasirenkamas priklausomai nuo to kokia debuginimo programa bus naudojama;
- C standard level – pasirenkamas C kalbos standartas. Pagal nutylėjimą GNU99;
- C/C++ source file(s) – pasirenkami visi C ar C++ failai įeinantys į projektą. Jeigu failai patalpinti tam pačiam projekto kataloge, užtenka tik jų pavadinimus nurodyti, kitu atveju reikia nurodyti pilną kelią iki jų;
- Assembler source files(s) – nurodomi visi asm failai reikalingi projektui;
- printf() – galimybė pasirinkti printf() funkcijos tipą. Galima pasirinkti mažiau išteklių naudojantį arba pritaikytą specialiai kontroleriams su slankaus kablelio skaičiais;
- scanf() – panašiai kaip printf() tik skaičių įvedimui;
- External RAM options – pasirenkama kai naudojama išorinė RAM atmintis;
- AVRdude – neimplementuota;
- Programmer – pasirenkamas programatoriaus tipas;
- Port – pasirenkamas portas;
- Miscelaneous – kita, bet neimplementuota;
- Enable Editing of Makefile – įgalina makefile redagavimą. Tai kita galimybė atlikti aukščiau minėtas operacijas. Galima tiesiog visą informaciją suvesti rankomis.
Makefile kūrimo būdai yra keli: galima pačiam rašyti nuo nulio, bet tai labai neefektyvu, galima naudotis šablonu, paredaguojant reikiamas vietas. Pirmaisiais kartais siūlau naudoti Makefile, kurį pateikių prie projekto (straipsnelio pabaigoje).
Sukūrus projektą, o jame c ir Makefailus, galima pradėti programuoti. Parašiau paprastą programėlę, kuri valdo PORT D. Aukšta porto būsena pereina vis į paskesnę koją, o po to grįžta. Seniau, rusų laikais, visą tai buvo daroma su loginiais elementais, poslinkio registais, generatoriais ir vadindavosi “Bėganti ugnis” 😉
Mano programa atrodo taip (c failas, žali komentarai):
#include // ivedimo, isvedimo biblioteka #include "timer.h" // naudoju biblioteka, kad galeciau panaudoti uzlaikyma #define laikas 35 // apsirasau konstanta laikas int main(void) // prasideda pagrindine programa { timerInit(); // ijungiu vidini taimeri DDRD = 255; // nustatau portu D kryptys (visi isejimai) while(1) // amzinas ciklas, viskas jame kartojasi { PORTD=0b1; //ijungiu pirmaja porto D koja (PD0) timerPause(laikas); //palaukiu PORTD=0b10; //ijungiu antra porto D koja (PD1) timerPause(laikas); //palaukiu PORTD=0b100; //ijungiu antra porto D koja (PD2) timerPause(laikas); //palaukiu PORTD=0b1000; //ijungiu ketvirta porto D koja (PD3) timerPause(laikas); //palaukiu PORTD=0b10000; //ijungiu penkta porto D koja (PD4) timerPause(laikas); //palaukiu PORTD=0b100000; //ijungiu sesta porto D koja (PD5) timerPause(laikas); //palaukiu PORTD=0b1000000; //ijungiu septinta porto D koja (PD6) timerPause(laikas); //palaukiu PORTD=0b10000000; //ijungiu astunta porto D koja (PD7) timerPause(laikas); //palaukiu } // ciklo pabaiga } //pagrindines programos pabaiga
————
Parašius programą, reikia sukompiliuoti. Tam reikia paspausti Tools -> Make All. Jei programoje nėra klaidų, tai paskutinės Output eilutės turėtų informuoti apie sėkmingą kompiliavimą:
> Process Exit Code: 0
> Time Taken: 00:01
Priešingu atvejų reikės ieškoti klaidų.
Sukompiliavus, galima užprogramuoti mikrokontrolerį . Programavimas dažniausiai atliekas įrašant hex rinkmeną į mikrokontrolerį. Tam galima panaudoti įvairias programas, pvz. PonyProg. Patogiausia naudoti WinAVR palaikoma AVRdude programatorių. Tam turi būti teisingai sukompiliuotas Makefile. Jei tai padaryta, belieka paspausti Tools -> Program. Šiuo atveju, mano Makefile sukonfiguruotas naudoti USBasp programatorių.
Aptarta programa su visais reikalingais failais
Sėkmingo programavimo!
Smalsu pasidarė sužinoti kaip padarei užrašus ant pirmosios pcb, detalių pusės (kur nuotraukose) 🙂 Tiesiog ant kreidinio popieriaus antspausdintus užrašus su lygintuvu pernešei? Ar ką nors ypatingesnio darei?
Aš tai taip pat kaip ir kitą pusę spausdinu.
Kaip ir rašė Tautrimas, naudotas ta pati spausdintuvo/kaitinimo technologija, kaip ir takelių formavimui.
Na va, išbandžiau 🙂 Dar užpurškiu ant užrašu apsauginį laką 🙂 Berods PRF 202 vadinasi 🙂