REGISTRI SA SPECIJALNIM FUNKCIJAMA - prvi deo

Deo RAM memorije odvojen je za ove registre koji služe za kontrolu rada. Pošto u instrukcijama za rad sa RAM-om ima sedam bitova za adresiranje lokacije, to znači da možemo da adresiramo 128 lokacija RAM-a, od 00h do 7Fh. Medjutim, kao što smo prethodno videli, jedan deo registara nalazi se iznad tih adresa, pa je pitanje kako njih adresirati. Za to su zadužena dva bita u STATUS registru (to su bitovi 5 i 6) koji čine bitove 7 i 8 adrese, čime dobijamo mogućnost da adresiramo čak 512 lokacija. Pošto nam je dovoljno 8 bitova (0-7), nećemo morati da koristimo bit 8; on je ostavljen od strane proizvodjača za eventualna proširenja i ne preporučuje se njegovo korišćenje. Znači, kada pristupamo lokacijama od 80h, potrebno je jednom instrukcijom setovati bit 5 (zove se RP0), u suprotnom ga treba resetovati.

Opis registara sa specijalnim funkcijama

Na adresi 00h nalazi se registar sa imenom INDF; to nije fizički registar već se koristi za indirektno adresiranje u sprezi sa
registrom SFR za indirektno adresiranje.
01h - TMR0, 8-bitni brojač/sat realnog vremena
02h - PCL, niski bajt PC-a (program counter-a)
03h - STATUS, sadrži bitove koji označavaju stanje aritmetičko-logičke jedinice (ALU), RESET status, i bitove za
         adresiranje viših lokacija RAM-a.
04h - FSR, pointer za indirektno adresiranje RAM memorije
05h - PORTA, to su, u stvari, pinovi porta A
06h - PORTB, pinovi porta B
07h - ne koristi se
08h - EEDATA, registar podataka za EEPROM
09h - EEADR, registar adrese za EEPROM
0Ah - PCLATH, visoki bajt PC-a
0Bh - INTCON, registar za kontrolu interapta
80h - INDF, isto kao 00h
81h - OPTION, upravljački registar za preskaler, spoljni interapt, TMR0 i pull- up otpornike na portu B
82h - PCL, kao 02h
83h - STATUS, kao 03h
84h - FSR, kao 04h
85h - TRISA, registar za definisanje smera (ulaz ili izlaz) pinova na portu A
86h - TRISB, registar za definisanje smera pinova na portu B
87h - ne korisiti se
88h - EECON1, upravljački registar za rad sa EEPROM-om
89h - EECON2, drugi upravljački registar (nije fizički registar)
8Ah - PCLATH, kao 0Ah
8Bh - INTCON, kao 0Bh

Kao što se vidi, neki registri su duplirani u memorijskoj mapi, ali to ne treba da vas buni; koristićemo samo po jedan od tih duplih.

DETALJAN OPIS REGISTARA SA SPECIJALNIM FUNKCIJAMA

INDF - Ovaj registar, kako je već rečeno, i nije fizički registar, vec samo "kanal" pomoću koga se vrši indirektno adresiranje RAM lokacija ili matematičkog registra (poznatijeg kao "akumulator") koji se ovde zove W registar. Pošto ne postoje posebne instrukcije za indirektno adresiranje, korišćenje ovog registra zajedno sa FSR registrom predstavlja jedini način za ostvarivanje tog načina adresiranja.

TMR0 - Ovo je brojač koji može da broji ili spoljne impulse ili impulse koji dolaze sa oscilatora, ali svaki četvrti (ako je preskaler dodeljen WDT-u). Zašto baš svaki četvrti? Svaka instrukcija (sem onih koje menjaju sadrzaj PC-a) izvrši se za 4 takta oscilatora, što znači da se pri frekvenci od 4 MHz, instrukcije izvršavaju brzinom od 1 MIPS-a (MIPS=milion instruction per second). Često ćete u literaturi videti da se pominje da izvršenje instrukcije traje jedan takt (neke dva), odnosno da izvršenje nekog dela programa traje odredjeni broj taktova; nemojte da Vas to zbuni i da to pomešate sa taktom oscilatora. Ako je bit 5 (T0CS) u OPTION registru resetovan, do brojača stižu impulsi sa oscilatora (f osc/4), a ako je setovan, do njega stižu impulsi sa RA4/T0CKI; u tom slučaju bit 4 (T0SE) OPTION registra odredjuje da li će stanje brojača da se uvećava na rastuću ili opadajuću ivicu. U mikrokontroler je ugradjen i jedan 8-bitni preskaler (delitelj) koji može da se dodeli ili brojacu TMR0 ili WDT-u (o tome odlučuje bit 3 (PSA) OPTION registra), a faktor deljenja preskalera zavisi i od toga kome je dodeljen, i od stanja prva tri bita (PS0, PS1 i PS2) u OPTION registru, što može da se vidi u sledećoj tabeli:

PRESKALER
FAKTOR DELJENJA
PS2
PS1
PS0
TMR0
WDT
0
0
0
1:2
1:1
0
0
1
1:4
1:2
0
1
0
1:8
1:4
0
1
1
1:16
1:8
1
0
0
1:32
1:16
1
0
1
1:64
1:32
1
1
0
1:128
1:64
1
1
1
1:256
1:128

Prekoračenje stanja ovog brojača (kada sa FFh prelazi na 00h) može da izazove interapt ako je dozvoljen interapt u globalu (bit 7 (GIE) INTCON registra) i ako je omogućen interapt na prekoračenje stanja TMR0 (bit 5 (T0IE) istog registra) i upravo ta osobina može da se iskoristi za merenje realnog vremena.

WDT - Već kada smo pomenuli WDT, objasnićemo i njega ovde iako on nije registar. To je, u stvari, nezavistan RC oscilator ugradjen u sam mikrokontroler. Namena mu je da pod izvesnim uslovima izazove interni reset, kako bi sprečio upadanje programa u mrtvu petlju i povećao sigurnost rada. Ako je WDT omogućen (to se radi ili selektovanjem odredjene opcije pri programiranju ili u samom programu), program treba s vremena na vreme da resetuje taj brojač primenom instrukcije CLRWDT, čime ciklus brojanja počinje ispočetka; ako program iz nekog razloga zapadne u mrtvu petlju, verovatno se neće izvršiti ova instrukcija (mada ne mora da znači, naročito ako se u petlji nadje i CLRWDT) i nakon isteka vremena WDT-a izvršiće se reset i mikrokontoler "izvući" iz mrtve petlje. Osnovni period WDT-a iznosi približno 18 ms (mada varira u zavisnosti od raznih faktora - tolerancija, temperatura), a primenom preskalera maksimalno vreme može da se produži do 2,3 sekunde.

PCL i PCLATH - Program counter (PC) je registar koji čuva adresu sledeće instrukcije koja treba da se izvrši. S obzirom da je on širine 13 bitova (nama je za adresiranje 1 Kb dovoljno 10 - i ovde je proizvodjac predvideo kasnija moguca proširenja), podeljen je na dva dela od kojih su prvih 8 bitova smešteni u PCL registar i pomoću koga može da se vrši direktan pristup nižem delu adrese. Ovaj registar se najčešće koristi za čitanje sadržaja tabela, ali treba paziti da tabela bude smeštena u bloku od 256 bajtova koji adresira viši deo PC adrese (PCH). Višem delu programske adrese (PCH) ne može da se pristupa direktno, ali može da se pristupa registru PCLATH (Program counter latch high), a stanje ovog registra se automatski prepisuje u PCH kada se u programu direktno pristupa PCL-u ili kada se izvršavaju GOTO i CALL instrukcije. U slučaju direktnog pristupa PCL-u, u PC se prenosi svih 5 bitova iz PCLATH u PCH, a u slučaju GOTO i CALL instrukcija prenose se samo bitovi 3 i 4, a prva 3 se ignorišu. Razlog za ovo leži u činjenici da u instrukcijama GOTO i CALL ima mesta za 11 adresnih bitova koji se prenose u PC (što znači da možemo da adresiramo 2 K) pa, jednostavno, nema mesta za kompletnu adresu. Obzirom da PIC16F84 ima samo 1 Kb programske memorije, ne moramo da vodimo računa o ovome, sem ako proizvodjač ne napravi verziju ovog MCU-a sa više od 2 Kb programske memorije.

STATUS - Sve bitove ovog registra, sem bitova 3 i 4, možemo direktno da menjamo, mada ostaje pitanje ima li smisla menjati bitove koji pokazuju stanje ALU jedinice, jer može da se desi da ih neka instrukcija promeni. Objasnićemo redom pojedinačne bitove:

0: C, carry/inv. borrow - korisiti se kod sabiranja, oduzimanja ili rotiranja, a označava da li je sabiranje ili oduzimanje moguće ili je izvršen prenos jednog bita. Obratite pažnju da je pri oduzimanju bit invertovan: setovan je ako je moguće oduzimanje bez prenosa, u suprotnom je resetovan. S obzirom da su svi registri 8-mo bitni, bit označava prekoračenje u opsegu od 256. Npr. ako saberemo brojeve 220 i 40, rezultat će biti 4 i biće setovan C bit.

1: DC digit carry/inv. digit borrow - kao C bit, ali označava prenos sa bita 3 na bit 4.

2: Z, zero - ako je rezultat neke aritmetičke ili logičke operacije 0, ovaj bit će biti setovan, u suprotnom će biti resetovan.

3: inv. PD, power down - bit je setovan pri uključenju mikrokontrolera, nakon izvršenja CLRWDT instrukcije ili posle reseta MCU-a. Resetuje ga SLEEP instrukcija kada mikrokontroler prelazi u POWER DOWN mod i tada je interni oscilator zaustavljen, a potrošnja struje minimalna. Direktan upis u ovaj bit nije moguć, a ponovno setovanje ovog bita obavlja se interno nakon reseta (spajanjem MCLR na nizak nivo ili isključenjem i ponovnim uključenjem napajanja), zatim interaptom sa RB0/INT pina, promenom na portu B, završetkom ciklusa upisa u EEPROM, kao i istekom vremena WDT-a (ako je WDT omogućen pri programiranju).

4: inv. TO, time out - kao i prethodni bit, ni ovaj nije moguce menjati direktnim upisom. Setovan je automatski nakon reseta i nakon instrukcija CLRWDT i SLEEP. Resetuje ga WDT kada istekne vreme.

5, 6: RP0, RP1, izbor grupe registara - kao što je ranije rečeno, instrukcije za rad sa RAM-om imaju samo sedam bitova u adresnom polju, pa je moguće adresirati samo 127 bajtova. Ova dva bita predstavljaju dvo-bitno proširenje te adrese, čime dobijemo adresni prostor od 512 bajtova. Za PIC16F84 potreban je samo jedan od ta dva bita (RP0 - bit 5) i to zbog registara specijalne namene koji se nalaze na adresama od 80h do 8Bh. Znači, kada pristupamo tim registrima moramo "rucno" instrukcijom u programu da setujemo bit RP0, u protivnom, taj bit treba da resetujemo. Bit RP1 je ostavljen od strane proizvodjača za eventualna buduća proširenja ovog MCU-a.

7: IRP, izbor grupe registara - za njega važi isto kao i za RP1, sem što se on koristi za definisanje bita 8 adrese kod indirektnog adresiranja. Za PIC16F84 nije nam potreban i ne treba da vodimo računa o njemu.

OPTION - Kao što je vec rečceno, ovo je upravljački registar. Evo opisa pojedinačnih bitova:

0, 1, 2: PS0, PS1, PS2,odredjuju faktor deljenja preskalera (videti ranije datu tabelu).

3: PSA, odredjuje kome je dodeljen preskaler - ako je PSA=0 preskaler je dodeljen TMR0, u suprotnom je dodeljen WDT-u.

4: T0SE, izbor ivice za okidanje brojača TMR0 - ako je TMR0 konfigurisan da se okida impulsima sa RA4/T0CKI pina, onda će se, ako je ovaj bit=0, brojač okidati rastućom ivicom, a ako je 1 onda će se okidati opadajućom ivicom.

5: T0CS, izbor izvora takta za TMR0 - ako je postavljen na log. 0, na brojač se dovodi interni CLKOUT (jedna četvrtina frekvence oscilatora), a ako je postavljen na log. 1, na brojač se dovode impulsi sa RA4/T0CKI pina. U oba slučaja će ići i preko preskalera ako je preskaler dodeljen brojacu TMR0.

6: INTEDG, izbor ivice signala za generisanje spoljnog interapta - ako je ovaj interapt omogućen, biće generisan opadajućom ivicom kada je ovaj bit=0, ili rastućom ako je ovaj bit=1.

7: inv. RBPU, pull-up otpornici na portu B - ako je ovaj bit setovan (=1) otpornici su isključeni i ulazi su visokoimpedansni, a ako je resetovan, uključeni su ovi otpornici, ali samo na pinovima koji su ulazni.

FSR - U ovaj registar se smešta adresa RAM lokacije kojoj hoćemo da pristupimo indirektnim adresiranjem. Navešćemo jedan primer: u lokaciji 0Ch nalazi se vrednost 23h, a u lokaciji 0Dh vrednost 8Ah. Ubacivanjem broja 0Ch u FSR registar i čitanjem INDF registra očitaćemo vrednost 23h. Ako uvećamo FSR za jedan i ponovo očitamo registar INDF, dobićemo vrednost 8Ah.