RESET

Kod PIC16F84 postoji nekoliko vrsta reseta: reset pri uključenju (POR, power-on reset), dovodjenjem nožice inv.MCLR na nizak logički nivo pri normalnom radu, dovodjenjem inv. MCLR na nizak nivo za vreme SLEEP naredbe, WDT reset, WDT budjenje za vreme SLEEP naredbe. Kod prva četiri reseta PC (program counter) će sadržati adresu 0, što znači da će program početi da se izvršava od početka, od prve lokacije programske memorije, dok će kod WDT budjenja za vreme SLEEP naredbe program da nastavi izvršenjem sledeće naredbe. Koji reset je izvršen, može da se odredi testiranjem bitova inv.TO i inv.PD prema sledećoj tabeli:

-TO
-PD
vrsta reseta
1
1
reset pri uključenju napajanja
1
1
dovodjenje niskog nivoa na -MCLR pri normalnom radu
1
0
dovodjenje niskog nivoa na -MCLR za vreme SLEEP naredbe
0
1
WDT reset
0
0
WDT budjenje za vreme SLEEP naredbe
U većini slučajeva će za reset pri uključenju biti dovoljno da se nožica inv.MCLR veže za plus napona napajanja, jer se posebne funkcije (POR, PWRT, OST) brinu za pravilnu i sigurnu inicijalizaciju mikrokontrolera i to kod LP, XT ili HS oscilatora, dok je kod RC oscilatora "u igri" samo PWRT. Ako je porast napona pri uključenju manji od potrebnog, neophodno je dodati spoljno reset kolo prema sledećoj shemi:

Za R treba uzeti vrednost manju od 40 K, a dioda D služi za brzo pražnjenje kondenzatora kada se isključi napajanje. Posebno je nezgodna situacija kada napon padne ispod dozvoljene tolerancije, a ne padne na nulu, pa se vrati na normalnu vrednost, jer u tom slučaju mikrokontroler nema potreban napon za normalan rad odredjeno vreme i može da se desi da PC (program counter) uzme neku prozvoljnu vrednost i da program "zaluta" i ne radi onako kako je zamišljeno. Ta situacija se zove brown-out i u tom slučaju potrebno je resetovati mikrokontroler, a jedna od shema kojima može da se izvrši reset izgleda ovako:

Napon pri kojem se vrši reset jednak je naponu zener diode uvećanom za 0,7V (zbog pada napona na tranzistoru).

INTERAPTI

Interapt (prekid) je situacija kada zbog odredjenih uslova program prekida da izvršava redovan program i počinje da izvršava interapt program, a po njegovom završetku vraća se tamo gde je prekinut. Te uslove smo već napomenuli, a to su: spoljni interpat sa RB0/INT pina, prekoračenje brojača TMR0, promena stanja na pinovima RB4 do RB7 i završetak upisa u interni EEPROM. Da bi se neki od tih interapta realizovao potrebno je da bit GIE bude setovan (dozvoljeni interapti u globalu) i da pojedinačni interapti budu dozvoljeni. Kada nastupi interapt, mikrokontroler resetuje GIE bit, upisuje sadržaj PC registra na stek i "skače" na adresu 04h jer je to fabrički predvidjena adresa (tzv. interapt vektor). Na tu adresu možemo da smestimo GOTO naredbu koja će da preusmeri program na neku drugu adresu, ili da od te adrese smestimo kompletnu interapt rutinu. Pošto se kod interapta ne čuvaju stanja registara, potrebno je da to sami na početku uradimo i da im sadržaje smestimo na neku lokaciju u RAM-u, a na kraju da im vratimo sadržaj. Dovoljno je da sačuvamo sadržaje W i STATUS registra i to se radi ovako:

  movwf w_temp          ; smesti sadržaj W registra u w_temp
  swapf STATUS, W       ; prebaci sadržaj STATUS registra u W
  movwf status_temp     ; smesti sadržaj W registra u status_temp
                        ; ovde se ubacuje interapt rutina 
                        ; a na kraju se vraćaju registri
  swapf status_temp, W  ; prebaci sadržaj status_temp u W registar
  movwf STATUS          ; prebaci sadržaj W registra u STATUS registar
  swapf w_temp, f       ;
  swapf w_temp, W       ; prebaci sadržaj w_temp u W registar

Na kraju interapt rutine bit GIE se automatski setuje, sa steka se uzima adresa povratka i upisuje u PC registar, i mikrokontroler nastavlja dalji rad upravo tamo gde je bio prekinut. Doduše, automatsko setovanje GIE bita može da bude i nedostatak u jednom slučaju, tj. može da se desi da resetovanje ovog bita uopšte i ne bude izvršeno: ako interapt nastupi baš u momentu izvršavanja instrukcije koja resetuje GIE bit, prvo će instrukcija biti završena do kraja (resetovaće se GIE bit), a zatim će da krene izvršavanje interapt rutine koja će na kraju da automatski setuje bit GIE. Tako će GIE bit biti setovan iako smo ga upravo pre interapta resetovali. Da bi se zaštitili od ove situacije, proizvodjač preporučuje da se nakon resetovanja GIE bita proveri da li je bit zaista resetovan i, ako nije, da se operacija ponovi.

Spoljni interapt sa RB0/INT pina - Ako je ovaj interapt omogućen (setovan bit 4 (INTE) u INTCON registru) i na RB0/INT pinu se pojavi odgovarajuća ivica (definisana INTEDG bitom OPTION registra) nastupiće interapt. Na kraju interapt rutine potrebno je u programu resetovati INTF bit u INTCON registru, kako bi naredni interapt bio moguć.

Interpat na prekoračenje brojača TMR0 - Ako je setovan bit 5 (T0IE) INTCON registra i brojač TMR0 prekoračio stanje, nastupiće interapt. Na kraju interapt rutine potrebno je resetovati bit T0IF.

Interapt na promenu stanja na RB4-RB7 - Ako je setovan bit 3 (RBIE) INTCON registra i promeni se stanje na nekom od ulaza RB4 do RB7, nastupiće interapt. Na kraju interapt rutine potrebno je resetovati bit RBIF.

Završetak upisa u EEPROM - Kada se završi upis u EEPROM i ako je setovan bit 6 (EEIE) INTCON regsitra nastupiće interapt. Na kraju interapt rutine potrebno je resetovati bit EEIF u EECON1 registru.