REGISTRI SA SPECIJALNIM FUNKCIJAMA - drugi deo

PORTA i PORTB - PORTA je petobitni, a PORTB je osmobitni registar i oni predstavljaju, faktički, put do samih pinova. Upisom u ove registre menjamo stanja na pinovima tih portova, naravno ako su odredjeni pinovi definisani kao izlazni. U stvari, vrši se upis u latch-eve tih registara. Čitanjem ovih registara očitavamo stanje direktno na pinovima kod onih koji su definisani kao ulazni; kod onih koji su definisani kao izlazni, očitaće se stanje koje je poslednje bilo upisano. Svaka naredba koja menja stanje izlaznih pinova je "read-modify-write" (pročitaj-izmeni-upiši) tipa, što znači da se prvo vrši očitavanje stanja, zatim izmena i ponovni upis u registar. Ovo treba uzeti u obzir prilikom opterećivanja izlaznih pinova jer, ako se nekom pinu prisilno promeni stanje (npr. ako izlazni pin na kome je logička jedinica opteretimo sa više od 20mA može doći do pada napona na tom pinu), biće pročitano pogrešno stanje koje će zatim biti upisano kao novo i eto problema. Takodje treba obratiti pažnju na situaciju u kojoj dve uzastopne naredbe menjaju stanja dva različita bita istog porta; pod odredjenim uslovima može da se desi (zbog "read-modify-write" principa) da na jednom pinu ne bude željeno stanje (mada se to meni do sada u praksi nije desilo). Proizvodjač preporučuje da se u tom slučaju izmedju te dve naredbe ubaci jedna NOP naredba. Pin RA4 vodi i do TMR0, što se odredjuje bitom T0CS u OPTION registru. Svaki pin porta B ima ugradjen slabi pull-up otpornik (otpornik koji spaja pin i pozitivan pol napajanja) koji se uključuje resetovanjem bita inv.RBPU (bit 7) OPTION registra. Ako se neki od pinova postavi kao izlazni, automatski se taj pull-up otpornik isključuje. Pinovi RB4 do RB7 imaju ugradjenu "interapt pri promeni stanja" funkciju i to samo ako je pin definisan kao ulazni, sto znači da promena logičkog stanja na nekom od tih pinova može da izazove interapt.

TRISA i TRISB - Stanja bitova ovih registara odredjuju da li će odredjeni pin na portu biti ulazni ili izlazni. Postavljanje odredjenog bita na 1 definiše odgovarajući bit kao ulazni, a postavljanje na 0 definiše odgovarajući bit kao izlazni. Prilikom reseta svi pinovi su postavljeni kao ulazni (svi bitovi su na log. 1). Bit 0 registra TRISA utiče na RA0, bit 1 na RA1 itd. Menjanje stanja bitova 5, 6 i 7 nema smisla jer port A ima samo 5 pinova. Bit 0 registra TRISB utiče na RB0, bit 1 na RB1 i tako sve do bita 7 koji utiče na RB7.

EEDATA - Pri upisu u EEPROM, u ovaj registar se ubacuje podatak koji želimo da programiramo, a pri šitanju, u ovom registru se nalazi sadržaj pročitane adrese EEPROM-a.

EEADR - U ovaj registar se upisuje adresa sa koje želimo da čitamo ili u koju upisujemo u EEPROM.

EECON1 - Ovaj registar se koristi pri upisu i čitanju EEPROM-a i ima pet bitova:

0: RD, start čitanja EEPROM-a - setovanjem ovog bita startuje se sekvenca čitanja EEPROM-a i to sa adrese koja je uneta u EEADR, a pročitani podatak će se naći u registru EEDATA i taj podatak može da se pročita već u sledećoj instrukciji. Ovako izgleda tipična sekvenca čitanja:

  bcf STATUS, RP0  ; resetuje se RP0 jer je EEADR na adresi 09h
  movlw adresa     ; priprema se adresa sa koje se čita
  movwf EEADR      ; i stavlja u EEADR registar
  bsf STATUS, RP0  ; setuje se RP0, jer je EECON1 na adresi 88h
  bsf EECON1, RD   ; startuje se čitanje EEPROM-a
  bcf STATUS, RP0  ; resetuje se RP0 jer je EEDATA na adresi 08h
  movf EEDATA, W   ; prebacuje se pročitani podatak iz EEDATA u W registar (radni registar)

Kada se prepis iz EEPROM-a u EEDATA završi, RD bit će automatski biti resetovan; nije ga moguće resetovati direktnim pristupom.

1: WR, start upisa u EEPROM - setovanjem ovog bita startuje se sekvenca upisa u EEPROM podatka smeštenog u EEDATA na adresu smeštenu u EEADR. Sekvenca upisa izgleda ovako:

  bcf STATUS, RPO  ; resetuje se RP0 jer je EEADR na adresi 09h
  movlw adresa     ; prepirema se adresa na koju se upisuje
  movwf EEADR      ; i stavlja u EEADR registar
  bsf STATUS, RP0  ; setuje se RP0 jer su INTCON, EECON1 i EECON2 na adresama većim od 7Fh
  bcf INTCON, GIE  ; spreči interapt (ako je omogućen)
  bsf EECON1, WREN ; omogući upis u EEPROM
  movlw 55h        ; pripremi prvi ključ
  movwf EECON2     ; i ubaci ga u registar EECON2
  movlw 0AAh       ; pripremi drugi ključ
  movwf EECON2     ; i ubaci ga u EECON2
  bsf EECON1, WR   ; startuj upis u EEPROM
  bcf EECON1, WREN ; onemogući upis u EEPROM
  bsf INTCON, GIE  ; dozvoli interapt (ako je potrebno)

Sekvenca mora da bude ovakva, inače može da dodje do pogrešnog upisa ili da uopšte ne dodje do upisa. Ključevi 55h i AAh su predvidjeni od strane proizvodjača i postoje (kao i EECON2 registar) da bi se smanjila mogućnost slučajnog upisa u EEPROM. Tajminzi moraju da budu tačno takvi i zbog toga se pre iniciranja upisa zabranjuju interapti; ovo je potrebno uraditi samo ako su u programu interapti omogućeni. Upisom nove vrednosti stara se automatski briše, a cela sekvenca upisa traje 10 ms i kada se jednom startuje ne može se zaustaviti i dalje je potpuno nezavisna. Dok traje, može da se izvršava neki drugi program, a po završetku biće generisan interapt ako je omogućen, ili može da se testira stanje bitova WR i EEIF (EECON1 registar) - kada se završi upis, WR će automatski biti resetovan, a EEIF setovan.

2: WREN, dozvola upisa - ako je ovaj bit setovan, upis u EEPROM je omogućen, a ako je resetovan nije moguće čak ni setovanje bita WR. Ovo je uradjeno zbog veće sigurnosti i preporučuje se da se taj bit setuje neposredno pred upis i zatim resetuje. Resetovanje je moguće čak i ako nije isteklo 10 ms, jer je, kao što je rečeno, nakon iniciranja upisa dalji tok nezavistan.

3: WRERR, gresša pri upisu - ako u toku upisa u EEPROM dodje do reseta (spuštanjem MCLR na log. 0 ili istekom vremena za WDT), setovaće se ovaj bit. S obzirom da reset ne menja stanje ovog bita, moguće je njegovim testiranjem pri inicijalizaciji utvrditi da li je reset prekinuo upis. Ako je bit resetovan to još uvek ne garantuje da je upis ispravan, već samo da upis nije prekinut resetom.

4: EEIF, interapt ciklusa upisa - nakon završenog upisa u EEPROM, ovaj bit se automatski setuje što može da se ispita u programu kako bi se uverili da je upis gotov. Pošto se reset ne obavlja automatski, treba ga nakon toga resetovati programski.

INTCON - Ovaj registar upravlja interaptima (o njima će biti reči nešto kasnije) i svakom bitu može programski da se promeni ili očita njegovo stanje.

0: RBIF, promena na ulazima 4 do 7 porta B - kada dodje do promene stanja na bitovima 4 do 7 porta B, ovaj bit se automatski setuje. Potrebno ga je posle eventualne obrade interapta programski resetovati.

1: INTF, došlo je do spoljnog interapta - ako se na pinu RB0/INT pojavi odgovarajuća ivica impulsa (definisana bitom INTEDG u OPTION registru), ovaj bit se automatski setuje. Potrebno ga je, kao i RBIF, programski resetovati.

2: T0IF, prekoračenje brojača TMR0 - kada brojač TMR0 predje sa FFh na 00h (prekoračenje brojaca), ovaj bit se automatski setuje. Kao i prethodna dva, posle eventualne obrade interapta, treba ga softverski resetovati.

3: RBIE - kada se ovaj bit setuje, omogućen je interapt na promenu stanja na pinovima RB4 do RB7, u protivnom do interapta neće doći.

4: INTE - kada se ovaj bit setuje, omogućen je spoljni interapt sa ulaza RB0/INT.

5: T0IE - kada je ovaj bit setovan, omogućen je interapt na prekoračenje brojača TMR0.

6: EEIE - kada je ovaj bit setovan, omogućen je interapt na kraj sekvence upisa u EEPROM.

7: GIE, dozvoljeni interapti u globalu - ako je ovaj bit resetovan, ne može da nastupi ni jedan interapt, a ako je setovan, omogućeni su oni interapti koji su pojedinačno omogućeni.

Konfiguracioni registar - Ovaj registar se nalazi u programskoj memoriji na adresi 2007h, ali mu se ne može pristupiti u toku izvršavanja programa jer se nalazi u posebnom memorijskom bloku za test i konfigurisanje (od 2000h do 3FFFh); ovom registru može da se pristupi samo prilikom programiranja. Njegov sadržaj može da se odredi u korisničkom programu, ali i pre samog programiranja mikrokontrolera; svaki program za programiranje trebalo bi da omogući promenu stanja njegovih bitova (u IC-PROG-u se to radi "štikliranjem" kućice ispred naziva bita - WDT, PWRT, CP i odabirom vrste oscilatora). Sledi opis pojedinačnih bitova:

0, 1: FOSC0, FOSC1 - ova dva bita odredjuju vrstu oscilatora.

bit 1
bit0
oscilator
0
0
LP
0
1
XT
1
0
HS
1
1
RC

2: WDTE - ako je ovaj bit=0, WDT je onemogućen, u suprotnom je omogućen (uključen WATCHDOG tajmer)

3: inv. PWRTE - ako je ovaj bit=0, PWRT je isključen, u suprotnom je uključen

4-13: CP - ako su ovi bitovi svi na 0, memorija je zaštićena od čitanja, u protivnom nije. Jedini način da se ovi bitovi promene sa 0 na 1 (da se isključi zaštita od čitanja) je brisanje celokupne programske memorije.