Documente Academic
Documente Profesional
Documente Cultură
PIC16F84 are două blocuri separate de memorie, unul pentru date și celălalt pentru
programe. Memoria EEPROM și regiştrii GPR în memoria RAM constituie un bloc de date
și memoria FLASH constituie un bloc de programe.
Memoria de date
Memoria de date constă din memoriile EEPROM şi RAM. Memoria EEPROM constă
din 64 de locaţii de opt biţi a căror conținut nu este pierdut în timpul opririi sursei de alimentare.
EEPROM-ul nu este direct adresabil, dar este accesat indirect prin regiştrii EEADR şi
EEDATA. Pentru că memoria EEPROM este folosită curent la memorarea unor parametri
importanți (de exemplu, o temperatură dată în regulatoarele de temperatură), există o procedură
strictă de scriere în EEPROM ce trebuie urmată pentru a preveni scrierea accidentală. Memoria
RAM pentru date ocupă un spațiu într-o hartă a memoriei de la locația 0x0C la 0x4F ceea ce
înseamnă 68 de locaţii. Locaţiile memoriei RAM sunt de asemenea denumite regiştrii GPR
care este o abreviere General Purpose Registers, sau Regiştrii cu Scop General. Regiştrii
GPR pot fi accesaţi indiferent de ce banc este selectat la un moment.
Memoria program
Memoria program a fost realizată în tehnologia FLASH ceea ce face posibil a programa
un microcontroler de mai multe ori înainte de a fi instalat într-un montaj și chiar după instalarea
sa dacă sunt necesare unele schimbări în program sau a parametrilor de proces. Mărimea
memoriei program este de 1024 locaţii cu lăţime de 14 biţi unde locaţiile zero şi patru sunt
rezervate pentru reset şi pentru vectorul întrerupere.
Regiştrii SFR
Bancuri de Memorie
27
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Uzual, grupurile de instrucțiuni care sunt adesea în uz, sunt conectate într-o singură
unitate ce poate fi uşor apelată într-un program, şi a cărei nume are o semnificaţie clară, aşa-
numitul Macros sau macrocomandă. Cu ajutorul lor, selecţia dintre două bancuri devine mai
clară şi programul mult mai elegibil, ca în exemplul următor.
BANK0 macro
Bcf STATUS, RP0 ; Selectează bancul de memorie 0
Endm
BANK1 macro
Bsf STATUS, RP0 ; Selectează bancul de memorie 1
Endm
28
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Contorul de Program
Stiva
PIC16F84 are o stivă care conține cuvinte de 13 biţi, organizată pe 8 nivele, sau cu alte
cuvinte, un grup de 8 locaţii de memorie de 13 biţi lăţime cu funcţii speciale. Rolul său de bază
este de a păstra valoarea contorului de program după un salt din programul principal la o adresă
a unui subprogram. Pentru ca un program să se întoarcă la punctul de unde a pornit, trebuie să
înapoieze valoarea contorului programului din stivă. Când se mută dintr-un program într-un
subprogram, contorul programului este salvat în stivă, un exemplu de acest fel fiind
instrucţiunea CALL). Când se execută instrucţiuni ca RETURN, RETLW sau RETFIE ce au
fost executate la sfârşitul unui subprogram, contorul programului a fost luat dintr-o stivă, aşa
ca programul să poată continua de unde a fost oprit înainte de a fi întrerupt. Aceste operaţii de
salvare într-o stivă şi citire dintr-o stivă de contor de program sunt numite PUSH şi POP şi
sunt numite conform cu instrucţiunile similare ale unor microcontrolere mai complexe.
Programarea memoriei
29
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Adresarea directă
Un asemenea exemplu poate trimite un set de date prin comunicaţia serială, lucrând cu
bufere şi indicatoare, sau să şteargă o parte a memoriei RAM (16 locaţii) ca în următorul
exemplu.
30
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Citind datele din registrul INDF când conţinutul registrului FSR este egal cu zero,
întoarce valoarea zero şi înscrie în el rezultatul în operația NOP (nu operează).
2.8. Întreruperi
31
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Registrul INTCON
bit 0_RBIF (RB Port Change Interrupt Flag), detectează schimbarea valorii portului B.
Este bit ce informează despre schimbările de la pinii 4, 5, 6 şi 7 ai portului B.
1=cel puţin un pin şi-a schimbat starea
0=nu s-a întâmplat nici o schimbare la vreun pin
bit 1_INTF (INT External Interrupt Flag), indicator de întrerupere externă INT.
Specifică faptul că a avut loc o întrerupere externă.
1=a avut loc o întrerupere
0=nu a avut loc o întrerupere
Dacă s-a detectat un front crescător sau descrescător la pinul RB0/INT, (ce este definit
cu bitul INTEDG în registrul OPTION), bitul INTF este setat. Bitul trebuie să fie şters în
subprogramul întrerupere pentru a detecta următoarea întrerupere.
bit 2_T0IF (TMR0 Overflow Interrupt Flag), indicator de depăşire / întrerupere TMRO.
Depăşirea contorului TMRO.
1=contorul şi-a schimbat starea de la FFh la 00h.
0=depăşirea nu a avut loc
Bitul trebuie să fie şters în program pentru ca o întrerupere să fie detectată.
bit 3_RBIE (RB Port Change Interrupt Enable), permite întreruperea la schimbarea
valorii portului B.
Permite să aibă loc întreruperi la schimbarea stării pinilor 4, 5, 6, şi 7 ai portului B.
1=permite întreruperi la schimbarea stării
0=întreruperi interzise la schimbarea stării
Dacă RBIE şi RBIF au fost simultan setate, va avea loc o întrerupere.
bit 4_INTE (INT External Interrupt Enable), permite întrerupere externă INT.
Bit ce permite întreruperea externă de la pinul RB0/INT.
1=întrerupere externă permisă
0=întrerupere externă interzisă
Dacă INTE şi INTF au fost setate simultan, va avea loc o întrerupere.
bit 5_T0IE (TMR0 Overflow Interrupt Enable), permite întrerupere la depăşire TMRO.
Bit ce permite întreruperile în timpul depăşirii contorului TMRO.
1=întrerupere permisă
0=întrerupere interzisă
Dacă T0IE şi T0IF au fost simultan setate, va avea loc întreruperea.
32
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Surse de întreruperi
În general, fiecare sursă de întrerupere depinde de doi biţi. Unul validează întreruperea,
iar celălalt detectează când au loc solicitări de întreruperi. Există un bit comun numit GIE ce
poate fi folosit pentru a validarea tuturor întreruperilor. Acest bit este foarte util atunci când se
scrie un program, pentru că permite ca toate întreruperile să fie invalidate pentru o perioadă de
timp, astfel încât execuţia unei părţi a programului să nu fie întreruptă. Când instrucţiunea ce
resetează bitul GIE a fost executată (GIE=0, toate întreruperile interzise), fiecare întrerupere
ce rămâne nerezolvată trebuie ignorată.
33
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Întreruperile ce rămân nerezolvate şi care au fost ignorate sunt procesate când bitul GIE
va avea valoarea GIE=1, însemnând că toate întreruperile sunt permise. Când s-a răspuns
întreruperii, bitul GIE a fost şters, aşa că orice întreruperi adiţionale vor fi interzise, adresa de
întoarcere a fost trimisă în stivă, iar adresa 0004h a fost scrisă în contorul programului. După
ce este procesată întreruperea, bitul a cărui setare a cauzat o întrerupere trebuie şters, sau rutina
de întrerupere va fi procesată automat tot mereu în timpul întoarcerii la programul principal.
Depășirea contorului TMRO ( trecerea de la FFh la 00h) va seta bitul T0IF ( din
INTCON<2> ). Aceasta este o întrerupere foarte importantă pentru că multe probleme reale se
por rezolva folosind această întrerupere. Unul din exemple este măsurarea timpului. Dacă ştim
cât timp are nevoie contorul pentru a completa un ciclu de la 00h la FFh, atunci numărul de
întreruperi înmulţit cu acea durată de timp va da timpul total scurs. În rutina de întrerupere unele
variabile vor fi incrementate în memoria RAM, valoarea acelei variabile înmulţite cu timpul de
care are nevoie contorul pentru a contoriza într-un ciclu întreg, va da timpul total scurs.
Întreruperea poate fi pornită/oprită prin setarea/resetarea bitului T0IE (INTCON<5>).
Întreruperea externă la pinul RB0/INT este triggerată de frontul crescător (dacă bitul
INTEDG=1 în registrul OPTION<6>) sau de frontul descrescător (dacă INTEDG=0). Când
apare semnalul corect la pinul INT, bitul INTF este setat la registrul INTCON. Bitul INTF
(INTCON<1>) trebuie resetat în rutina de întrerupere aşa încât întreruperea să nu aibă loc din
nou în timpul revenirii la programul principal. Acesta este un pas important al programului pe
care programatorul nu trebuie să-l uite, sau programul va merge constant în rutina de
întrerupere. Întreruperea poate fi închisă prin resetarea bitului de control INTE (INTCON<4>).
34
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
35
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Dacă mai sunt şi alte variabile sau regiştrii ce trebuie stocați, atunci ei trebuie să fie
păstrați după stocarea registrului STATUS (pasul 3) şi aduși înapoi înainte ca registrul
STATUS să fie restaurat (pasul 5).
Același exemplu se poate realiza utilizând macro-uri, făcând astfel programul mai
eligibil. Macro-urile ce sunt deja definite, pot fi folosite pentru scrierea de noi macro-uri.
Macro-urile BANK1 şi BANK0 ce sunt explicate în capitolul "Organizarea memoriei" sunt
folosite cu macro-urile ''push'' şi ''pop''.
36
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
Inițializarea întreruperii
Exemplul de mai sus arată inițializarea unei întreruperi externe la pinul RB0 al
microcontrolerului. Pozițiile în care este setat 1 înseamnă că întreruperea este permisă.
Producerea altor întreruperi nu este permisă şi toate întreruperile împreună sunt interzise până
ce bitul GIE este ţinut pe valoarea 1.
Următorul exemplu prezintă o cale tipică de a dirija întreruperile. PIC16F84 are doar o
locaţie unde adresa unui subprogram de tip întrerupere este memorată. Aceasta înseamnă că
mai întâi trebuie să detectăm ce întrerupere este solicitată (dacă mai mult de o sursă de
întreruperi este disponibilă) şi apoi putem executa acea parte a programului ce se referă la acea
întrerupere.
37
ECHIPAMENTE DE COMANDĂ CU LOGICĂ PROGRAMATĂ
38