SET INSTRUKCIJA
Ovaj mikrokontroler ima samo 35 naredbi (ili instrukcija) širine 14 bitova, što može da bude prednost, ali i mana. Prednost zato što je lako zapamtiti mali broj naredbi, a mana zato što ne postoji dovoljan komfor u radu sa tako malo naredbi. S druge strane, svaka naredba zauzima samo jednu memorijsku lokaciju i izvršava se u jednom ciklusu (koji traje 4 takta oscilatora), sem onih koji menjaju sadržaj PC registra (skokovi, pozivi potprograma, povratak iz potprograma) koje se izvršavaju za dva ciklusa. MICROCHIP je podelio sve naredbe u 3 grupe: a) one koje rade sa bajtovima, b) one koje rade sa bitovima i c) one koje rade sa konstantama i vrše kontrolu. Ovakva podela je uslovljena formatom naredbi:
a) - bitovi 0-6 sadrže adresu registra (obeležava se slovom f od reči FILE) - bit 7 odredjuje cilj, tj. odredište (obeležava se slovom d od reči DESTINATION) - bitovi 8-13 sadrže kod (šifru) same naredbe b) - bitovi 0-6 sadrže adresu registra (f) - bitovi 7-9 sadrže adresu bita unutar registra - bitovi 10-13 sadrže kod naredbe c) ovde postoje dva slučaja: generalni - bitovi 0-7 sadrže konstantu (broj od 0 - 256), a ostali kod naredbe CALL i GOTO - bitovi 0-10 sadrže konstantu tj. adresu, a ostali kod naredbe.
Slovom f obeležava se lokacija u RAM-u i, s obzirom da u instrukciji postoji samo 7 bitova za tu adresu, možemo da adresiramo samo 128 lokacija. Zato je potrebno obratiti pažnju na kojoj adresi se nalazi registar kome pristupamo i odgovarajućim postavljanjem bita RP0 (o kome je bilo reči u trećem delu ovog teksta) usmeriti se na odgovarajuću banku registara. Slovom d je obeleženo odredište, tj. mesto na koje će biti usmeren rezultat operacije. To nije neki novi registar već jednostavno označava da li će rezultat biti smešten u akumulator (W registar) ili u RAM čija adresa se nalazi u samoj instrukciji, što u tom slučaju znaći da se operacija izvršava nad nekom RAM lokacijom (f) i da se rezultat smešta na isto mesto. Ako se za d stavi 0, rezultat se upisuje u W, a za d=1 rezultat se smešta u registar (RAM loakciju). U slučaju da se u naredbi izostavi ova nula ili jedinica, asembler će podrazumevati da rezultat ide u f (znači kao da je upisana jedinica) i istovremeno će generisati upozorenje. Bolje je, a i preglednije, na pošetku programa definisati neki simbol koji će zameniti jedinicu; šesto ćete na početku programa sretati naredbu SAME EQU 1 (SAME ima značenje "isto") koja će ovo uraditi, pa će npr. instrukcija uvećanja izgledati ovako:
INCF brojac, SAME
koja znači da se sadržaj registra "brojač" uvećava za jedan i rezultat smešta na isto mesto, tj. nazad u registar. Ovakim načinom dobija se na preglednosti. Akumulator tj. W (od WORKING REGISTER) nije smešten u RAM i jedini je registar koji služi za prenos podataka izmedju RAM lokacija i koji vrši matematičko-logičke operacije sa RAM lokacijama. To konkretno znači da, ako hoćemo npr. da upišemo neku vrednost u RAM, moramo prvo tu vrednost da smestimo u W, a zatim da je drugom naredbom prebacimo iz W u željenu RAM lokaciju (registar). Iako je podela na 3 grupe logičnija, lično mi se više svidja podela na 5 grupa koju je napravio Voja Antonić u broju 32 časopisa "PC":
MNEMONIK
|
OPIS
|
OPERACIJA
|
FLEGOVI
|
CIK
|
PRIM.
|
PREPIS PODATAKA |
|||||
MOVF f, d MOVWF f MOVLW k CLRF CLRW SWAP f, d |
prepiši f u d prepiši W u f upiši konstantu u W upiši 0 u f upiši 0 u W prepiši unakrsno niblove iz f u d |
f ->d W ->f k -> W 0 -> f 0 -> W f(7:4),(3:0)->d(3:0),(7:4) |
Z Z Z |
1 1 1 1 1 1 |
1,2 2 1,2 |
ARITMETIKA I LOGIKA |
|||||
ADDWF f, d ADDLW k SUBWF f, d SUBLW k INCF f, d DECF f, d IORWF f, d ANDWF f, d XORWF f, d IORLW k ANDLW k XORLW k COMF f, d |
saberi W i f saberi W sa konstantom oduzmi W od f oduzmi W od konstante uvećaj f umanji f logičko ILI W sa f logičko I W sa f logičko ISKLUČIVO ILI W sa f logičko ILI W sa konstantom logičko I W sa konstantom logičko ILI W sa konstantom komplementiraj f |
f + W -> d k + W -> W f - W -> d k - W -> W f + 1 -> d f -1 -> d f v W -> d f ^ W -> d f xor W -> d k v W -> W k ^ W -> W k xor W -> W f -> d |
C, DC, Z C, DC, Z C, DC, Z C, DC, Z Z Z Z Z Z Z Z Z Z |
1 1 1 1 1 1 1 1 1 1 1 1 1 |
1, 2 1, 2 1, 2 1, 2 1, 2 1, 2 1, 2 1,2 |
OPERACIJE SA BITOVIMA |
|||||
BCF f, b BSF f, b RLF f, d RRF f, d |
resetuj bit b u f setuj bit b u f rotiraj f nalevo kroz CARRY rotiraj f nadesno kroz CARRY |
0 -> f(b) 1 -> f(b) |
C C |
1 1 1 1 |
1, 2 1, 2 1, 2 1, 2 |
UPRAVLJANJE TOKOM PROGRAMA |
|||||
BTFSC f, b BTFSS f, b INCFSZ f, d DECFSZ f, d GOTO k CALL k RETURN RETLW k RETFIE |
test bit b u f, preskoči ako je = 0 test bit b u f, preskoči ako je = 1 uvećaj f, preskoči ako je = 0 umanji f, preskoči ako je = 0 skoči na adresu pozovi potprogram povratak iz potprograma povratak sa konstantom u W povratak iz interapta |
skip if f(b) = 0 skip if f(b) = 1 f + 1 -> d, skip if Z = 1 f - 1 -> d, skip if Z = 1 k -> PC PC -> TOS, k -> PC TOS -> PC k -> W, TOS -> PC TOS -> PC, 1 -> GIE |
1(2) 1(2) 1(2) 1(2) 2 2 2 2 2 |
3 3 1, 2, 3 1, 2, 3 1, 2, 3 |
|
OSTALO |
|||||
NOP CLRWDT SLEEP |
bez operacije inicijalizuj watchdog tajmer prelazak u režim male potrošnje |
0 -> WDT, 1 -> -TO, 1-> -PD 0 -> WDT, 1 -> -TO, 0 -> -PD |
1 1 1 |
PRIMEDBE: 1 Ako je PORTA ili B izvorni operand, čitaju se stanja na pinovima mikrokontrolera. 2 Ako je ova instrukcija izvršena na registru TMR0 i ako je d=1, preskaler će biti automatski obrisan (=0) ako je dodeljen brojaču TMR0. 3 Ako je PC modifikovan ili je rezultat test =1, instrukcija se izvršava u dva ciklusa.
Pored sintakse i opisa naredbi, vidite kolone "flegovi" i "cik"; flegovi (zastavice) su, u stvari, bitovi u odredjenim registrima koji označavaju stanje nakon neke instrukcije. C, DC, Z, inv.PD (-PD) i inv.TO (-TO) su prvih pet bitova STATUS registra i o njima je bilo reči ranije, a iz tabele se vidi tačno koja naredba utiče na koji fleg. Kolona cik pokazuje koliko ciklusa traje jedna naredba, a broj u zagradi pokazuje koliko traje ukoliko je uslov ispunjen. Kada pogledamo tabelu, vidimo da naredbe za poredjenje ne postoje. Pa kako ćemo onda da uporedimo dva broja? Jedan način je oduzimanjem ta dva broja i proverom stanja flegova: ako su ta dva broja jednaka, biće setovan Z fleg; ako smo oduzeli manji broj od većeg, C fleg će biti setovan, u suprotnom će biti resetovan (zato što se oduzimanje obavlja kao sabiranje sa negativnom vrednošću pa je C fleg invertovan kod oduzimanja). Takodje ne postoje ni uslovni skokovi - oni su zamenjeni uslovnim preskocima, tj. testira se odredjeni bit, pa se prva sledeća naredba preskače ako je uslov ispunjen. Malo nezgodno, ali kada se jednom naviknete, neće biti problema. Doduše, MICROCHIP-ov asembler MPASM ima već ugradjenje pseudo-naredbe kojima je moguće izvršsiti uslovne skokove (npr. BNZ "branch if not zero" - skoči ako nije nula), ali treba obratiti pažnju da je to u stvari grupa naredbi (tačnije dve), a ne jedna pa to treba uzeti u obzir kada se računa trajanje takve naredbe. To bi bilo otprilike sve što se tiče samog mikrokontrolera. Neke stvari su preskočene, što namerno, što slučajno, a moguće je da se potkrala i po koja greška; bilo bi dobro da oni koji su ih uočili jave na e-mail. Deo onoga što je preskočeno (npr. formiranje tabela) će kroz primere biti objašnjeno, a za ostalo možete da pitate ili da pročitate originalnu dokumentaciju koju možete naci na http://www.microchip.com.
Literatura koja je korišćena za ovaj tekst: original MICROCHIP-ova dokumentacija i tekstovi Voje Antonića objavljeni u domaćem časopisu "PC" u izdanju kuće "PC PRESS", brojevi 29 do 32.
U sledećim nastavcima biće dat i jedan konkretan primer upotrebe PIC16F84 sa RC oscilatorom i jednom LE diodom, zatim će biti reči o pisanju programa i asmebliranju, i biće date neke osnovne rutine i nekoliko primera.