Velik je broj tema na forumu vezanih uz elektroniku, ali pored teme o Arduinu i Raspberry Pi-u gotovo da i nema teme vezane za programiranje Atmelovih serija 89 i AVR, te Microchip PIC mikrokontrolera. Vrijeme je da se to promijeni, bar kad je 89 serija u pitanju.
Atmel 89x mikrokontroleri
Atmelova 89 serija mikrokontrolera temeljena je na Intel 8051 obitelji 8-bitnih mikrokontrolera i u potpunosti podržava 8051 set instrukcija. Pojedine verzije Atmelovih 89 mikrokontrolera proširuju osnovne mogućnosti serije s integriranim USB, I2C, SPI kontrolerom i hardverskim PWM-om.
Da ne kompliciramo, najbolje je započeti s mikrokontrolerima koji su nam pristupačni i dostupni u lokalnim dućanima el.opreme. Pa evo neki od njihovih karakteristika.
89c2051/89c4051 – 2kB/4kB programske memorije, 128B RAM, 20pin, dva 8-bitna porta (P1 i P3), od kojih je fizički dostupno 15 I/O linija.
89c51/89s51 – 4kB prog.mem, 128B RAM, 40pin, četiri 8-bitna porta (P0-P3), 32 vanjske I/O linije
(s51 verzija podržava SPI što nam olakšava samo fizičko programiranje mikrokontrolera)
89c52/89s52 – 8kB prog.mem, 256B RAM, ostalo kao c51/s51.
Programiranje i programatori
Velika prednost „s“ verzija je upravo mogućnost programiranja putem SPI sučelja, a koje ne zahtjeva povišeni napon kako bi se programiranje izvelo, pa je najbolje da za početak i vježbe nabavite 89s52. Osim toga, programiranje je moguće izvršiti i unutar samog sustava gdje se mikrokontroler koristi (ISP ili In System Programming). Kako bi .hex file mogli „upisati“ u sam mikrokontroler, u slučaju 89s52 će biti dovoljan jeftini USBasp programator, koji se može, baš kao i sami mikrokontroleri jako povoljno nabaviti preko ebay-a.
Ovom prilikom se još jednom želim zahvaliti forumašu Dava na donaciji USBasp i JDM programatora.
Inace, kod nabavke USBasp jedino bi trebalo pripaziti da seller navodi da isti podržava programiranje 89s serije, poput ovoga , jer inače USBasp programator služi za programiranje AVR serije Atmelovih mikrokontrolera.
Ukoliko se odlučite na programiranje „c“ verzija, bit će nužan tzv. paralelni programator, a koji programiranje konkretnih mikrokontrolera vrši naponom od 12V. To značajno komplicira programiranje, jer isto ovisi o pinoutu mikrokontrolera, pa je algoritam programiranja različit za 20 i 40pin izvedenice mikrokontrolera. To ipak nije problem ukoliko se kupuje gotovi programator, ali cijene su za njih nešto više.
Simulator
Ipak, kako nebi ostali zakinuti za programiranje čak i ako trenutno nemate dostupan mikrokontroler, tu je jedan jako moćan, a besplatan komad softvera pod nazivom MCU 8051 IDE, kojeg možete pronaći na http://mcu8051ide.sourceforge.net/ . Isti možemo koristiti kao razvojno sučelje i simulator, a podržava i dosta virtualnog hardvera pomoću kojeg je moguće donekle testirati program koji ste napisali. Ujedno u njemu možemo pronaći .hex i/ili .bin datoteke potrebne za programiranje mikrokontrolera.
Da bi uopće mogli početi programirati potrebno je upoznati se s mogućnostima mikrokontrolera, kao i setom instrukcija s kojima isti raspolaže. Google tu uvijek pomaže, ali evo ako moram izabrati, onda zbog primjera primjene instrukcija bi izdvojia stranice keil.com http://www.keil.com/support/man/docs/is51/is51_instructions.htm .
Zasučimo rukave
Za početak, da ne ubijen sve s pustom teorijom, idemo kreirati ekvivalent „Hello world“ programa, ali za mikrokontrolere. Na jednom od pinova mikrokontrolera ćemo treptati LED.
Pokrenemo MCU 8051 IDE, u meniju Project odabrati New pa odabrati naziv projekta, folder u kojem će se nalaziti i jako bitno, mikrokontroler kojeg ćemo koristiti. U našem slučaju to ce biti 89s52.
U editoru ćemo za početak napisati "org 000h", a zatim ćemo na ikonu „rakete“ pokrenuti, a zatim zaustaviti simulator. Isto je moguće tipkom F2 ili iz menija Simulator. Prvi put kada ga pokrenemo, a upravo zato to i radimo, otvorit će nam se prozor gdje ćemo unijeti naziv .asm datoteke koju ćemo kreirati.
Da bi uopce mogli „vidjeli“što se događa, iz menija Virtual HW ćemo odabrati LED Panel. To je niz od 8 LED kojeg je moguće spojiti na portove mikrokontrolera. Mi ćemo odabrati da je prva (lijeva) LED na portu 1.7, a zadnja (desna) na portu 1.0. LEDice u LED Panel-u „gore“ kada im se dovede logička 0, a ugašene su za logičku 1. To je tzv. negativna logika. Takvo što nam u potpunosti i odgovara, pošto po resetu mikrokontrolera svi portovi sadrže log.1 na svim pinovima porta.
A sad sam program koji će treptati LED na P1.7 i raditi „bolje“ na sporijim računalima, ali samo zato što nismo ubacili kašnjenja i zbog same „sporosti“ simulacije. Kada bi ovakav program neizmjenjen ubacili u mikrokontroler brzina izmjena ON/OFF za LED bi bila prevelika da bi to oko moglo uočiti, ali za ovu primjenu sasvim u redu.
; točka-zarez označava početak komentara u jednoj liniji
org 000h ; naredba koja slijedi biti će stavljena na adresu 000h u programskoj memoriji
start: ; labela se označava dvotočkom iza „proizvoljne“ dopuštene riječi
; poistovjećuje naredbu koja slijedi s mnemoničkom oznakom
clr p1.7 ; postavlja pin 1.7 u log.0 i time „pali“ LED
setb p1.7 ; postavlja pin 1.7 u log.1 i time „gasi“ LED
ajmp start ; skače na labelu start, efektivno program vrti u krug pali-gasi
end ; kraj programa
Kad smo program upisali, porebno je ponovo pokrenuti simulator (F2 ili raketa), a zatim (Animate, F6, ili Play botun). Ukoliko želimo, izvođenje programa možemo promatrati korak po korak (Step, F7 ili botun Koraci).
Uz malo modifikacija program može treptati svim LED na portu 1. Prvo moramo zaustaviti prethodnu simulaciju (F2), a onda modificiramo program.
org 000h
start:
mov p1,#000h ; postavlja svih 8 pinova porta 1 u log.0
mov p1,#0ffh ; postavlja svih 8 pinova porta 1 u log.1
ajmp start
end
Malo pojašnjenje naredbi:
Naredbe clr i setb su tzv. bit-naredbe, odnosno utječu na stanje pojedinog bita, konkretno clr ga „briše“ tj. postavlja u log.0, a setb „postavlja“, tj. postavlja u log.1.
Naredba ajmp služi za bezuvjetni skok unutar 2KB memorijskog bloka, i bila bi nekakav ekvivalent naredbe goto iz viših programskih jezika, npr. basica.
Naredba mov je u pravilu (s jednom iznimkom) byte-naredba, odnosno utječe na stanje čitavog bytea.
p1 označava port (byte) koji mijenjamo, # označava immediate ili neposredno adresiranje (u prijevodu, broj koji slijedi je operand), a h iza broja označava heksadecimalni broj. Osim njega moguće je koristiti b za binarne brojeve i ništa za dekadske. Nekome možda upadne u oko da pišemo tri hex znamenke, od kojih je prva uvijek nula, a to je zbog pravilnog prepoznavanja hex brojeva koji započinju slovom.
Malo o binarnim i hex brojevima
Iz drugog je primjera vidljivo kako „brojevima“ možemo upravljati paljenjem i gašenjem LED na portu. Ali da ipak malo objasnim za one koji se tek s time susreću i još im nije jasno kako.
Svaki port mikrokontrolera sastoji se (u pravilu) od 8 bitova i označeni brojkama npr. P1.7 do P1.0 gdje broj 1 označava broj porta, a brojke 7 do 0 sami pin. Pri tome je pin 7 tzv. MSB (Most significant bit) ili bit najveće težine, a pin 0 tzv. LSB (Least significant bit) ili bit najmanje težine. Tih 8 bitova zajedno predstavljaju 1 byte.
1 byte odnosno 8 bitova omogućuju predstavljanje ukupno 2^8 ili 256 brojeva, konkretno brojke u dekadskom sustavu od 0 do 255. U binarnom sustavu to su brojke 00000000 do 11111111. U heksadecimalnom sustavu to je 00 do FF. Ukoliko bude potrebno, objasnit ću i kako se vrše pretvorbe iz sustava u sustav, ali za prvu ruku, samo da spomenem bitno, a to je da svakoj heksadecimalnoj znamenci odgovaraju 4 bita u binarnom sustavu.
Podsjetimo se da je za paljenje LED potrebno na pojedini pin dovesti 0, a za gašenje 1, pa možemo na 8 pinova porta 1 dovesti kombinaciju kakvu želimo da nam se odgovarajuće ledice upale.
P1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0
0 1 1 1 1 1 1 1
8 4 2 1 8 4 2 1
0+4+2+1 8+4+2+1
7 F
Ako bi sada pisali prvi program koristeći byte naredbe drugog, dobili bi
org 000h
start:
mov p1,#07Fh ; na port 1 postavlja kombinaciju 01111111 (gori LED na P1.7)
mov p1,#0FFh ; na port 1 postavlja kombinaciju 11111111 (ne gore LED)
ajmp start
end
Malo vježbe do slijedećeg puta. Napisati program pomoću kojeg će se LED kretati s lijeva na desno, od P1.7 prema P1.0 (trčeće svjetlo) koristeći prethodni primjer. Bit će vam potrebno ukupno 8 mov naredbi.
Ukoliko i u ovoj početnoj fazi imate pitanja, prijedloge, komentare, slobodno nabacite...