[sledeći]

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.

[sledeći]