Sunteți pe pagina 1din 35

1

Microcontrolerul PIC16F84

Introducere
PIC16F84 aparine unei clase de microcontrolere de 8 bii cu arhitectur RISC. Structura
lui general este artat n schia urmtoare reprezentnd blocurile de baz.
Memoria program (FLASH)-pentru memorarea unui program scris.
Pentru c memoria ce este fcut n tehnologia FLASH poate fi programat i tears mai mult
dect odat, aceasta face microcontrolerul potrivit pentru dezvoltarea de component.
EEPROM-memorie de date ce trebuie s fie salvate cnd nu mai este alimentare.
Este n mod uzual folosit pentru memorarea de date importante ce nu trebuie pierdute dac
sursa de alimentare se ntrerupe dintr-o dat. De exemplu, o astfel de dat este o temperatur
prestabilit n regulatoarele de temperatur. Dac n timpul ntreruperii alimentrii aceast dat
se pierde, va trebui s facem ajustarea nc o dat la revenirea alimentrii. Astfel componenta
noastr pierde n privina auto-meninerii.
RAM-memorie de date folosit de un program n timpul executrii sale.
n RAM sunt memorate toate rezultatele intermediare sau datele temporare ce nu sunt cruciale la
ntreruperea sursei de alimentare.
PORTUL A i PORTUL B sunt conexiuni fizice ntre microcontroler i lumea de afar.
Portul A are 5 pini, iar portul B are 8 pini.
TIMER-UL LIBER (FREE-RUN) este un registru de 8 bii n interiorul microcontrolerului
ce lucreaz independent de program. La fiecare al patrulea impuls de ceas al oscilatorului i
ncrementeaz valoarea lui pn ce atinge maximul (255), i apoi ncepe s numere tot din nou
de la zero. Dup cum tim timpul exact dintre fiecare dou incrementri ale coninutului timer-ului,
poate fi folosit pentru msurarea timpului ce este foarte util la unele componente.
UNITATEA DE PROCESARE CENTRAL are rolul unui element de conectivitate ntre
celelalte blocuri ale microcontrolerului. Coordoneaz lucrul altor blocuri i execut programul
utilizatorului.


2
CISC, RISC
S-a spus deja c PIC1684 are o arhitectur RISC. Acest termen este adeseori gsit n literatura
despre calculatoare, i are nevoie s fie explicat aici mai n detaliu. Arhitectura Harvard este un
concept mai nou dect von-Neumann. S-a nscut din nevoia de mrire a vitezei
microcontrolerului. n arhitectura Harvard, bus-ul de date i bus-ul de adrese sunt separate. Astfel
este posibil un mare debit de date prin unitatea de procesare central, i bineneles, o vitez mai
mare de lucru. Separarea programului de memoria de date face posibil ca mai departe
instruciunile s nu trebuiasc s fie cuvinte de 8 bii. PIC16F84 folosete 14 bii pentru
instruciuni ceea ce permite ca toate instruciunile s fie instruciuni dintr-un singur cuvnt. Este
de asemenea tipic pentru arhitectura Harvard s aib mai puine instruciuni dect von-Newmann
i s aib instruciuni executate uzual intr-un ciclu.
Microcontrolerele cu arhitectur Harvard sunt de asemenea numite "microcontrolere RISC". RISC
nseamn Reduced Instruction Set Computer. Microcontrolerele cu arhitectura von-Newmann
sunt numite "microcontrolere CISC". Titlul CISC nseamn Complex Instruction Set Computer.
Pentru c PIC16F84 este un microcontroler RISC, aceasta nseamn c are un set redus de
instruciuni, mai precis 35 de instruciuni (de ex. microcontrolerele INTEL i Motorola au peste
100 de instruciuni). Toate aceste instruciuni sunt executate ntr-un ciclu cu excepia
instruciunilor jump i branch. Conform cu ceea ce spune constructorul, PIC16F84 ajunge la
rezultate de 2:1 n compresia cod i 4:1 n vitez n comparaie cu alte microcontrolere de 8 bii
din clasa sa.
Aplicaii
PIC16F84 se potrivete perfect n multe folosine, de la industriile auto i aplicaiile de control
casnice la instrumentele industriale, senzori la distan, mnere electrice de ui i dispozitivele de
securitate. Este de asemenea ideal pentru cardurile smart ca i pentru aparatele alimentate de
baterie din cauza consumului lui mic.
Memoria EEPROM face mai uoar aplicarea microcontrolerelor la aparate unde se cere
memorarea permanent a diferitor parametri (coduri pentru transmitoare, viteza motorului,
frecvenele receptorului, etc.). Costul sczut, consumul sczut, mnuirea uoar i flexibilitatea
fac PIC16F84 aplicabil chiar i n domenii unde microcontrolerele nu au fost prevzute nainte
(exemple: funcii de timer, nlocuirea interfeei n sistemele mari, aplicaiile coprocesor, etc.).
Programabilitatea sistemului acestui cip (mpreun cu folosirea a doar doi pini n transferul de
date) face posibil flexibilitatea produsului, dup ce asamblarea i testarea au fost terminate.
Aceast capabilitate poate fi folosit pentru a crea producie pe linie de asamblare, de a
nmagazina date de calibrare disponibile doar dup testarea final, sau poate fi folosit pentru a
mbunti programele la produsele finite.
Clock-ul /ciclul instruciune
Clock-ul sau ceasul este starter-ul principal al microcontrolerului, i este obinut dintr-o
component de memorie extern numit "oscilator". Dac ar fi s comparm un microcontroler
cu un ceas de timp, "clock-ul" nostru ar fi un ticit pe care l-am auzi de la ceasul de timp. n acest
caz, oscilatorul ar putea fi comparat cu arcul ce este rsucit astfel ca ceasul de timp s mearg.
De asemenea, fora folosit pentru a ntoarce ceasul poate fi comparat cu o surs electric.
Clock-ul de la oscilator intr ntr-un microcontroler prin pinul OSC1 unde circuitul intern al
microcontrolerului divide clock-ul n 4 clock-uri egale Q1, Q2, Q3 i Q4 ce nu se suprapun.
Aceste 4 clock-uri constituie un ciclu de o singur instruciune (numit de asemenea ciclu main)
n timpul creia instruciunea este executat.
3
Executarea instruciunii ncepe prin apelarea unei instruciuni care este urmtoarea n linie.
Instruciunea este apelat din memoria program la fiecare Q1 i este scris n registrul de
instruciuni la Q4. Decodarea i executarea instruciunii sunt fcute ntre urmtoarele cicluri Q1 i
Q4. n urmtoarea diagram putem vedea relaia dintre ciclul instruciunii i clock-ul oscilatorului
(OSC1) ca i aceea a clock-urilor interne Q1-Q4. Contorul de program (PC) reine informaia
despre adresa urmtoarei instruciuni.

Pipelining
Ciclul instruciune const din ciclurile Q1, Q2, Q3 i Q4. Ciclurile de instruciuni de apelare i
executare sunt conectate ntr-un aa fel nct pentru a face o apelare, este necesar un ciclu cu o
instruciune, i mai este nevoie de nc unul pentru decodare i executare. Totui, datorit
pipelining-ului (folosirea unei pipeline-conduct, i este aducerea unei instruciuni din memorie n
timp ce se execut alta), fiecare instruciune este executat efectiv ntr-un singur ciclu. Dac
instruciunea cauzeaz o schimbare n contorul programului, i PC-ul nu direcioneaz spre
urmtoarea ci spre alte adrese (poate fi cazul cu subprogramele jumps sau calling), 2 cicluri sunt
necesare pentru executarea unei instruciuni. Aceasta este pentru c instruciunea trebuie
procesat din nou, dar de data aceasta de la adresa corect. Ciclul ncepe cu clock-ul Q1, prin
scrierea n registrul instruction register (IR). Decodarea i executarea ncepe cu clock-urile Q2,
Q3 i Q4.

4
TYC0 citete instruciunea MOVLW 55h (nu are importan pentru noi ce instruciune a fost
executat, ce explic de ce nu este un dreptunghi desenat n partea de jos).
TCYI execut instruciunea MOVLW 55h i citete MOVWF PORTB.
TCY2 execut MOVWF PORTB i citete CALL SUB_1.
TCY3 execut o apelare a subprogramului CALL SUB_1, i citete instruciunea BSF PORTA,
BIT3. Pentru c instruciunea aceasta nu este aceea de care avem nevoie, sau nu este prima
instruciune a subprogramului SUB_1 a crei execuie este urmtoarea n ordine, instruciunea
trebuie citit din nou. Acesta este un bun exemplu a unei instruciuni avnd nevoie de mai mult
de un ciclu.
TCY4 ciclul instruciunii este total folosit pentru citirea primei instruciuni din subprogram la
adresa SUB_1.
TCY5 execut prima instruciune din subprogram SUB_1 i citete urmtoarea.
Semnificaia pinilor
PIC16F84 are un numr total de 18 pini. Cel mai adesea se gsete ntr-o capsul de tip DIP18
dar se poate gsi de asemenea i ntr-o capsul SMD care este mai mic ca cea DIP. DIP este
prescurtarea de la Dual In Package. SMD este prescurtarea de la Surface Mount Devices
sugernd c gurile pentru pini unde s intre acetia, nu sunt necesare n lipirea acestui tip de
component.



Pinii microcontrolerului PIC16F84 au urmtoarea semnificaie:
Pin nr.1 RA2 Al doilea pin la portul A. Nu are funcie adiional.
Pin nr.2 RA3 Al treilea pin la portul A. Nu are funcie adiional.
Pin nr.3 RA4 Al patrulea pin la portul A. TOCK1 care funcioneaz ca timer se gsete de
asemenea la acest pin.
Pin nr.4 MCLR Reseteaz intrarea i tensiunea de programare Vpp a microcontrolerului.
Pin nr.5 VSS Alimentare, mas.
Pin nr.6 RB0 Pin de zero la portul B. Intrarea ntrerupere este o funcie adiional.
Pin nr.7 RB1 Primul pin la portul B. Nu are funcie adiional.
Pin nr.8 RB2 Al doilea pin la portul B. Nu are funcie adiional.
Pin nr.9 RB3 Al treilea pin la portul B. Nu are funcie adiional.
Pin nr.10 RB4 Al patrulea pin la portul B. Nu are funcie adiional.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are funcie adiional.
Pin nr.12 RB6 Al aselea pin la portul B. Linia de 'Clock' n mod programare.
5
Pin nr.13 RB7 Al aptelea pin la portul B. Linia 'Data' n mod programare.
Pin nr.14 Vdd Polul pozitiv al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator.
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator.
Pin nr.17 RA2 Al doilea pin la portul A. Nu are funcie adiional.
Pin nr.18 RA1 Primul pin la portul A. Nu are funcie adiional.
2.1 Generator de ceas oscilator
Circuitul oscilator este folosit pentru a da microcontrolerului un ceas-clock. Ceasul este necesar
pentru ca microcontrolerul s execute programul sau instruciunile din program.
Tipuri de oscilatoare

PIC16F84 poate lucra cu patru configuraii diferite de oscilator. Pentru c configuraiile cu
oscilator cu cristal i rezistor-condensator (RC) sunt cele utilizate cel mai frecvent, doar pe ele le
vom meniona aici. Tipul de microcontroler cu oscilator cu cristal este desemnat ca XT, iar
microcontrolerul cu perechea rezistor-condensator are desemnarea RC. Aceasta este important
pentru c trebuie s numii tipul de oscilator cnd cumprai un microcontroler.

Oscilatorul XT
Oscilatorul cu cristal se afl intr-o carcas
metalic cu doi pini pe care este nscris
frecvena la care cristalul oscileaz. Mai este
necesar cte un condensator ceramic de 30pF
cu cellalt capt la mas de a fi conectai la
fiecare pin.
Oscilatorul i condensatorii pot fi ncapsulai
mpreun ntr-o carcas cu trei pini. Un
asemenea element se numete rezonator
ceramic i este reprezentat n scheme ca cel
de mai jos. Pinii centrali ai elementului sunt
masa, iar pinii terminali sunt conectai la pinii
OSC1 i OSC2 ai microcontrolerului. Cnd se
proiecteaz un aparat, regula este s plasai
oscilatorul ct mai aproape de microcontroler,
pentru a elimina orice interferen de pe liniile
pe care microcontrolerul primete tactul de
ceas.




Oscilatorul RC

n aplicaiile unde nu este nevoie de o mare precizie de timp, oscilatorul RC permite economii
adiionale la cumprare. Fecvena de rezonan a oscilatorului RC depinde de valoarea tensiunii
de alimentare, rezistorul R, condensatorul C i temperatura de lucru. Trebuie de menionat c
6
frecvena de rezonan este de asemenea influenat de variaiile normale ale parametrilor de
proces, de tolerana extern a componentelor R i C, etc.

Diagrama de mai sus arat cum este conectat oscilatorul RC la PIC16F84. La valoarea
rezistorului mai mic 2.2k, oscilatorul poate deveni instabil, sau oscilaia se poate chiar opri. La
valori mari a lui R (ex.1M) oscilatorul devine foarte sensibil la zgomot i umezeal. Se recomand
ca valoarea rezistorului R s fie ntre 3 i 100k. Chiar dac oscilatorul va lucra fr un
condensator extern (C=0pF), trebuie totui folosit un condensator de peste 20pF pentru zgomot
i stabilitate. Indiferent de ce oscilator este folosit, pentru a obine un ceas la care s funcioneze
microcontrolerul, ceasul trebuie divizat la 4. Un ceas al oscilatorului divizat cu 4 se poate obine la
pinul OSC2/CLKOUT, i poate fi folosit pentru testarea sau sincronizarea altor circuite logice.

Dup alimentare, oscilatorul ncepe s oscileze. Oscilaia la nceput are o perioad i o
amplitudine instabile, dar dup un timp devin stabilizate.

7
Pentru a preveni ca un asemenea ceas inexact s influeneze performanele microcontrolerului,
trebuie s inem microcontrolerul n starea reset pe durata stabilizrii ceasului oscilatorului.
Diagrama de mai sus arat o form tipic de semnal pe care microcontrolerul o primete de la
oscilatorul cu cuar dup alimentare.
2.2 Reset-ul
Resetul este folosit pentru a pune microcontrolerul ntr-o condiie 'cunoscut'. Aceasta nseamn
practic c microcontrolerul poate s se comporte incorect n unele condiii nedorite. Pentru a
continua s funcioneze corect trebuie resetat, nsemnnd c toi registrii vor fi pui ntr-o stare de
start. Resetul nu este folosit numai cnd microcontrolerul nu se comport cum vrem noi, dar
poate de asemenea s fie folosit cnd se ncearc un montaj ca o ntrerupere ntr-un program de
execuie sau cnd se pregtete un microcontroler de a citi un program.
Pentru a preveni ajungerea unui zero logic la pinul MCLR
accidental (linia de deasupra nseamn c resetul este
activat de un zero logic), MCLR trebuie s fie conectat
printr-un rezistor la polul pozitiv al sursei de alimentare.
Rezistorul trebuie s fie ntre 5 i 10k. Acest rezistor a
crui funcie este de a menine o anumit linie la starea
logic unu ca o prevenire, se numete o scoatere-pull up.



Microcontrolerul PIC16F84 are cteva surse de reset:

a) Reset la alimentare, POR (Power-On Reset)
b) Reset n timpul lucrului obinuit prin aducerea unui zero logic la pinul MCLR al
microcontrolerului.
c) Reset n timpul regimului SLEEP
d) Reset la depirea timer-ului watchdog (WDT)
e) Reset n timpul depirii WDT n timpul regimului SLEEP.

Cele mai importante resurse de reset sunt a) i b). Prima are loc de fiecare dat cnd este
alimentat microcontrolerul i servete la aducerea toturor regitrilor la starea iniial a poziiei de
start. A doua este pentru a aduce un zero logic la pinul MCLR n timpul operaiei normale a
microcontrolerului. Este des folosit n dezvoltarea de programe.

n timpul unui reset, locaiile de memorie RAM nu sunt resetate. Ele sunt necunoscute la
alimentare i nu sunt schimbate la nici un reset. Spre deosebire de acestea, regitrii SFR sunt
resetai la o stare iniial a poziiei de start. Unul din cele mai importante efecte ale resetului este
setarea contorului de program (PC) la zero (0000h), ceea ce permite programului s nceap
executarea de la prima instruciune scris.


Resetul la scderea tensiunii de alimentare dincolo de limita permisibil (Brown-out
Reset)

Impulsul pentru resetare n timpul creterii tensiunii este generat de microcontrolerul nsui cnd
8
detecteaz o cretere n tensiunea Vdd (n domeniul de la 1.2V la 1.8V). Acest impuls dureaz 72
ms ceea ce este un timp suficient pentru oscilator ca s se stabilizeze. Aceste 72 ms sunt
asigurate de un timer intern PWRT care are oscilatorul lui RC. Microcontrolerul este n modul
reset ct timp PWRT este activ. Totui, cnd montajul funcioneaz, probleme apar cnd sursa
nu scade la zero ci cnd scade mai jos de limita ce garanteaz funcionarea corect a
microcontrolerului. Acesta este un caz real din practic, n special n mediile industriale unde
perturbaiile i instabilitile sursei de alimentare sunt ceva foarte curent. Pentru a rezolva
aceast problem trebuie s ne asigurm c microcontrolerul este ntr-o stare de reset de fiecare
dat cnd tensiunea sursei scade sub limita admis.

Dac, conform cu specificaiile electrice, circuitul intern de resetare a microcontrolerului nu poate
satisface aceste cerine, se pot folosi componente electronice speciale ce sunt capabile s
genereze semnalul de reset dorit. n afar de aceast funcie, ele pot funciona pentru
supravegherea tensiunii de alimentare. Dac tensiunea scade mai jos de nivelul specificat, un
zero logic va apare la pinul MCLR ce ine microcontrolerul n starea de reset pn ce tensiunea
nu este n limitele ce garanteaz funcionarea corect.
2.3 Unitatea de Procesare Central
Unitatea de procesare central (CPU) este creierul microcontrolerului. Aceast parte este
responsabil cu gsirea i aducerea (citirea din memorie)-fetching instruciunii corecte ce trebuie
executat, cu decodarea acelei instruciuni, i n final cu executarea ei.
9

Unitatea de procesare central conecteaz toate prile microcontrolerului ntr-un ntreg. Desigur,
funcia sa cea mai important este s decodeze instruciunile de program. Cnd programatorul
scrie un program, instruciunile au o form clar ca MOVLW 0x20. Totui, pentru ca
microcontrolerul s neleag aceasta, aceast form de 'scrisoare' a unei instruciuni trebuie
tradus ntr-o serie de zero-uri i unu-uri ce se numete 'opcode'. Aceast tranziie de la o
scrisoare la o form binar este fcut de translatori ca translatorul assembler (cunoscut ca i
assembler sau asamblor). Instruciunea astfel adus-fetched din memoria programului trebuie s
fie decodat de unitatea de procesare central. Putem apoi selecta din tabela tuturor
instruciunilor un set de aciuni ce execut o sarcin desemnat definit de instruciune. Pentru
c instruciunile pot s conin n ele asignri ce cer diferite transferuri de date dintr-o memorie n
alta, din memorie la porturi, sau alte calcule, CPU trebuie s fie conectat cu toate prile
microcontrolerului. Aceasta este posibil printr-un bus de date i un bus de adrese.

Unitatea de Logic Aritmetic (ALU)

Unitatea de logic aritmetic este responsabil de executarea operaiilor ca adunarea, scderea,
mutarea (la stnga sau la dreapta ntr-un registru) i de operaiile logice. Mutarea datelor ntr-un
registru se mai numete 'shifting'- transferare. PIC16F84 conine o unitate logic aritmetic de 8
bii i regitri de lucru de 8 bii.
10

n instruciunile cu doi operanzi, n mod obinuit un operand este n registrul de lucru (registrul
W), iar cellalt este unul din regitri sau o constant. Prin operand nelegem coninutul asupra
cruia se fac unele operaii, iar un registru este oricare din regitrii GPR sau SFR. GPR este o
prescurtare de la 'General Purposes Registers'-Regitri cu Scopuri Generale, iar SFR de la
'Special Function Registers'-Regitri cu Funcie Special. n instruciunile cu un operand, un
operand este fie registrul W fie unul din regitri. Pe lng operaiile aritmetice i logice, ALU
controleaz biii de stare (bii gsii n registrul STATUS). Executarea unor instruciuni afecteaz
biii de stare, de care depinde rezultatul nsui. Depinznd de ce instruciune este executat, ALU
poate afecta valorile biilor Carry (C), Digit Carry (DC), i Zero (Z) n registrul STATUS.
11

Registru STATUS

bit 0 C (Carry) Transfer
Bit care este afectat de operaiile de adunare, scdere i transfer.
1= transferul produs din bitul cel mai nalt al rezultatului
0= transferul nu s-a produs
Bitul C este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.

12
bit 1 DC (Digit Carry) DC Transfer
Bit afectat de operaiile de adunare, scdere i transfer. Spre deosebire de bitul C, acest bit
reprezint transferul din al patrulea loc rezultat. Este setat de adunare cnd se ntmpl un
transport de la bitul 3 la bitul 4, sau de scdere cnd se ntmpl mprumut de la bitul 4 la bitul 3,
sau de transfer n ambele direcii.
1= transfer produs la al patrulea bit conform cu ordinea, al rezultatului.
0= transferul nu s-a produs
Bitul DC este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.

bit 2 Z (Zero bit) Indicarea unui rezultat zero.
Acest bit este setat cnd rezultatul unei operaii aritmetice sau logice executate este zero.
1= rezultatul egal cu zero
0= rezultatul nu este egal cu zero

bit 3 PD (Power-down bit)
Bit ce este setat cnd microcontrolerul este alimentat atunci cnd ncepe s funcioneze, dup
fiecare reset obinuit i dup executarea instruciunii CLRWDT. Instruciunea SLEEP l reseteaz
cnd microcontrolerul intr n regimul consum/uzaj redus. Setarea lui repetat este posibil prin
reset sau prin pornirea sau oprirea sursei. Starea poate fi triggerat de asemenea de un semnal
la pinul RB0/INT, de o schimbare la portul RB, de terminarea scrierii n EEPROM-ul de date
intern, i de watchdog de asemenea.
1= dup ce sursa a fost pornit
0= executarea instruciunii SLEEP

bit 4 TO Time-out ; depirea-overflow watchdog-ului.
Bitul este setat dup pornirea sursei i executarea instruciunilor CLRWDT i SLEEP. Bitul este
resetat cnd watchdog-ul ajunge la sfrit semnalnd c ceva nu este n ordine.
1= depirea-oveflow nu s-a produs
0= depirea-overflow s-a produs

bit6:5 RP1:RP0 (Register Bank Select bits-Bii de Selectare a Bancului de Regitri)
Aceti doi bii sunt partea superioar a adresei la adresarea direct. Pentru c instruciunile ce
adreseaz memoria direct au doar apte bii, ei au nevoie doar de nc un bit pentru a adresa cei
256 bytes adic ci are PIC16F84. Bitul RP1 nu este folosit, dar este lsat pentru expansiuni
viitoare ale acestui microcntroler.
01= primul banc
00= bancul zero

bit 7 IRP (Register Bank Select bit-Bit de Selectare a Bancului de Regitri)
Bit al crui rol este de a fi al optulea bit la adresarea indirect a RAM-ului intern.
1= bancul 2 i 3
0= bancul 0 i 1 (de la 00h la FFh)

Registrul STATUS conine starea aritmetic ALU (C, DC, Z), starea RESET (TO, PD) i biii
pentru selectarea bancului de memorie (IRP, RP1, RP0). Considernd c selecia bancului de
memorie este controlat prin acest registru, el trebuie s fie prezent n fiecare banc. Bancul de
memorie se va discuta mai n detaliu n capitolul Organizarea memoriei. Registrul STATUS poate
fi o destinaie pentru orice instruciune, cu oricare alt registru. Dac registrul STATUS este o
destinaie pentru instruciunile ce afecteaz biii Z, DC or C, atunci scrierea n aceti trei bii nu
este posibil.



13
Registrul OPTION

bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecie Rat Prescaler)
Aceti trei bii definesc bitul de selecie a ratei prescalerului. Ce este un prescaler i cum pot
afecta aceti bii funcionarea unui microcontroler va fi explicat n seciunea depre TMRO.

bit 3 PSA (Prescaler Assignment bit-Bit de Asignare Prescaler)
Bit ce asigneaz prescalerul ntre TMRO i watchdog.
1= prescalerul este asignat watchdogului
0= prescalerul este asignat timer-ului liber (ree-run) TMRO

bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecie a Frontului Sursei TMR0)
Dac este permis de a se triggera TMRO prin impulsurile de la pinul RA4/T0CKI, acest bit
determin dac aceasta va fi la frontul descresctor sau cresctor al unui semnal.
1= front cresctor
0= front descresctor

bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecie Surs Ceas TMR0)
Acest pin permite timerului liber (free-run) s incrementeze starea lui fie de la oscilatorul intern la
fiecare a ceasului oscilatorului, fie prin impulsuri externe la pinul RA4/T0CKI.
1= impulsuri externe
0= ceas intern 1/4

bit 6 INTEDG (Interrupt Edge Select bit-Bit de Selecie a Frontului ntrerupere)
Dac ntreruperea este activat este posibil ca acest bit s determine frontul la care o ntrerupere
va fi activat la pinul RB0/INT.
1= front cresctor
0= front descresctor

bit 7 RBPU (PORTB Pull-up Enable bit-Bit Enable-Activare Pull-up PORTB)
Acest bit pornete i oprete rezistorii interni 'pull-up'-scoatere la portul B.
1= Rezistori oprire "pull-up"
0= Rezistori pornire "pull-up"

14

2.4 Porturi
Portul se refer la un grup de pini ai unui microcontroler ce pot fi accesai simultan, sau la care
putem seta combinaia dorit de zero-uri i unu-uri, sau de la care putem citi o stare existent.
Fizic, portul este un registru n interiorul unui microcontroler ce este conectat cu fire la pinii
microcontrolerului. Porturile reprezint conexiunea fizic a Unitii de Procesare Central cu
lumea exterioar. Microcontrolerul le folosete pentru a monitoriza sau controla alte componente
sau aparate. Datorit funcionalitii, unii pini au rol dublu ca RA4/TOCKI de exemplu, care este
simultan al patrulea bit la portul A i o intrare extern pentru contorul liber (free-run). Selecia
uneia din aceste dou funcii ale pinului se face n unul din regitrii configuraionali. O ilustraie a
acesteia este al cincilea bit T0CS n registrul OPTION. Selectnd una din funcii cealalt este
dezactivat.

Toi pinii portului pot fi definii ca intrare sau ieire, conform cu nevoile unui montaj ce este n
dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de ieire, trebuie scris combinaia
corect de zero-uri i unu-uri n registrul TRIS. Dac n locul potrivit este scris "1" logic n registrul
TRIS, acel pin este pin de intrare, iar dac este valabil contrariul, este un pin de ieire. Fiecare
port are registrul lui TRIS. Astfel, portul A are TRISA la adresa 85h, iar portul B are TRISB la
adresa 86h.

PORTB

PORTB are 8 pini legai la el. Registrul adecvat pentru direcia datelor este TRISB la adresa 86h.
Setarea unui bit n registrul TRISB definete pinul portului corespunztor ca pin de intrare, i
resetarea unui bit n registrul TRISB, definete pinul portului corespunztor ca pin de ieire.
Fiecare pin la PORTB are un rezistor slab intern pull-up (scoatere) (rezistor care definete o linie
la unu logic) care poate fi activat prin resetarea celui de-al aptelea bit RBPU n registrul
OPTION. Aceti rezistori 'pull-up' se nchid automat cnd pinul portului este configurat ca o ieire.
Cnd pornete microcontrolerul, 'pull-up'-ii sunt dezactivai.

15
Patru pini ai portului PORTB, RB7:RB4 pot cauza o ntrerupere, care se ntmpl cnd starea lor
se schimb de la unu logic la zero logic i invers. Numai pinii configurai ca intrare pot cauza
aceast ntrerupere s se ntmple (dac fiecare pin RB7:RB4 este configurat ca o ieire, nu va fi
generat o ntrerupere la schimbarea strii). Aceast opiune de ntrerupere cu rezistorii 'pull-up'
fac mai uoar rezolvarea problemelor din practic, ca de exemplu o tastatur matriceal. Dac
rndurile tastaturii sunt conectate la aceti pini, fiecare apsare a unei clape va cauza o
ntrerupere. Microcontrolerul va determina care clap este apsat n timp ce se proceseaz o
ntrerupere. Nu se recomand s apelai la portul B n timp ce se proceseaz ntreruperea.


Exemplul de mai sus arat cum pinii 0, 1, 2, i 3 sunt declarai ca intrare, i pinii 4, 5, 6 i 7 ca
ieire.

PORTA

PORTA are 5 pini legai la el. Registrul corespunztor pentru direcia datelor este TRISA la
adresa 85h. Ca i la portul B, setarea unui bit n registrul TRISA definete de asemenea pinul
portului corespunztor ca un pin de intrare, i resetarea unui bit n registrul TRISA definete pinul
portului corespunztor ca pin de ieire.
Al cincilea pin al portului A are funcie dual. La acel pin se afl de asemenea o intrare extern
pentru timer-ul TMRO. Una din aceste dou opiuni este aleas prin setarea sau resetarea bitului
TOCS (TMR0 Clock Source Select bit-bit de Selecie a Sursei Ceasului TMRO). Acest pin
permite timer-ului TMRO sa-i creasc starea fie de la oscilatorul intern fie prin impulsuri externe
la pinul RA4/T0CKI.


Exemplul arat cum pinii 0, 1, 2, 3, i 4 sunt declarai ca intrare iar 5, 6 i 7 ca pini de ieire.
2.5 Organizarea memoriei
PIC16F84 are dou blocuri separate de memorie, unul pentru date i cellalt pentru programe.
Memoria EEPROM i regitrii GPR n memoria RAM constituie un bloc, i memoria FLASH
constituie un bloc de programe.

Memoria program

Memoria program a fost realizat n tehnologia FLASH ceea ce face posibil de a programa un
microcontroler de mai multe ori nainte de a fi instalat ntr-un montaj, i chiar dup instalarea sa
dac se ntmpl unele schimbri n program sau parametri de proces. Mrimea memoriei
16
program este de 1024 locaii cu lime de 14 bii unde locaiile zero i patru sunt rezervate pentru
reset i pentru vectorul ntrerupere.

Memoria de date

Memoria de date const din memoriile EEPROM i RAM. Memoria EEPROM const din 64 de
locaii de opt bii a cror coninut nu este pierdut n timpul opririi sursei de alimentare. EEPROM-
ul nu este direct adresabil, dar este accesat indirect prin regitrii EEADR i EEDATA. Pentru c
memoria EEPROM este folosit curent la memorarea unor parametri importani (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 spaiu ntr-o hart a memoriei de la locaia 0x0C la 0x4F ceea ce nseamn 68 de
locaii. Locaiile memoriei RAM sunt de asemenea denumite regitri GPR care este o abreviere
General Purpose Registers-Regitri cu Scop General. Regitrii GPR pot fi accesai indiferent de
ce banc este selectat la un moment.

Regitri SFR

Regitri ce ocup primele 12 locaii n bancurile 0 i 1 i sunt regitri ai funciei specializate
asignat cu unele blocuri ale microcontrolerului. Acetia sunt numii Special Function Registers-
Regitri ai Funciei Speciale.
17

Bancuri de Memorie

n afar de aceast diviziune n 'lungime' a regitrilor SFR i GPR, harta memoriei este de
asemenea mprit n 'lime' (vezi harta precedent) n dou zone numite 'bancuri'. Selectarea
unuia din bancuri se face de biii RPO i RP1 n registrul STATUS-stare.


18
Exemplu:
bcf STATUS, RP0

Instruciunea BCF terge bitul RPO (RP0=0) n registrul STATUS i astfel seteaz bancul 0.

bsf STATUS, RP0

Instruciunea BSF seteaz bitul RPO (RP0=1) n registrul STATUS i astfel seteaz bancul 1.


Uzual, grupurile de instruciuni care sunt adesea n uz, sunt conectate ntr-o singur unitate ce
poate fi uor apelat ntr-un program, i a crei nume are o semnificaie clar, aa-numitul
Macros-macrocomand. Cu ajutorul lor, selecia dintre dou bancuri devine mai clar i
programul mult mai elegibil.
BANK0 macro
Bcf STATUS, RP0 ;Select memory bank 0
Endm

BANK1 macro
Bsf STATUS, RP0 ;Select memory bank 1
Endm
Contorul de Program

Contorul de program (PC) este un registru de 13 bii ce conine adresa instruciunii ce se execut.
Prin incrementarea sau schimbarea sa (ex. n caz de salturi) microcontrolerul execut
instruciunile de program pas-cu-pas.

Stiva

PIC16F84 are o stiv de 13 bii cu 8 nivele, sau cu alte cuvinte, un grup de 8 locaii de memorie
de 13 bii lime cu funcii speciale. Rolul su de baz este de a pstra valoarea contorului de
program dup un salt din programul principal la o adres a unui subprogram. Pentru ca un
program s tie cum s se ntoarc la punctul de unde a pornit, trebuie s napoieze valoarea
contorului programului din stiv. Cnd se mut dintr-un program ntr-un subprogram, contorul
programului este mpins n stiv (un exemplu de acesta este instruciunea CALL). Cnd se
execut instruciuni ca RETURN, RETLW sau RETFIE ce au fost executate la sfritul unui
subprogram, contorul programului a fost luat dintr-o stiv, aa ca programul s poat continua de
unde a fost oprit nainte de a fi ntrerupt. Aceste operaii de plasare ntr-o i luare dintr-o stiv de
contor de program sunt numite PUSH i POP, i sunt numite conform cu instruciunile similare ale
unor microcontrolere mai mari.


Programarea n Sistem

Pentru a programa o memorie de program, microcontrolerul trebuie s fie setat pentru un mod de
lucru special prin aducerea pinului MCLR la 13.5V, iar sursa de tensiune Vdd trebuie s fie

Locaiile 0Ch - 4Fh sunt regitri cu scop general (GPR) ce sunt folosii ca memorie RAM. Cnd sunt accesate locaiile
8Ch - CFh n Bancul 1, accesm de fapt exact aceleai locaii n Bancul 0. Cu alte cuvinte, cnd dorii s accesai
unul din regitrii GPR, nu trebuie s v ngrijorai c nu tii n ce banc suntei!
19
stabilizat ntre 4.5V i 5.5V. Memoria program poate fi programat serial folosind doi pini
'data/clock' ce trebuie s fie mai nti separai de liniile montajului, aa ca s nu apar erori n
timpul programrii.

Moduri de adresare

Locaiile de memorie RAM pot fi accesate direct sau indirect.


Adresarea Direct

Adresarea Direct se face printr-o adres de 9 bii. Aceast adres este obinut prin conectarea
celui de-al aptelea bit al adresei directe a unei instruciuni cu doi bii (RP1, RP0) din registrul
STATUS dup cum se arat n figura urmtoarea. Orice acces la regitrii SFR poate fi un
exemplu de adresare direct.
Bsf STATUS, RP0 ;Bankl
movlw 0xFF ;w=0xFF
movwf TRISA ;address of TRISA register is taken from
;instruction movwf

Adresarea Direct
Adresarea Indirect

Adresarea indirect spre deosebire de cea direct nu ia o adres dintr-o instruciune ci o creeaz
cu ajutorul bitului IRP a regitrilor STATUS i FSR. Locaia adresat este accesat prin registrul
INDF care de fapt ine o adres indicat de un FSR. Cu alte cuvinte, orice instruciune care
folosete INDF ca registrul al ei, n realitate acceseaz datele indicate de un registru FSR. S
spunem, de exemplu, c un registru cu scop general (GPR) la adresa 0Fh conine o valoarea 20.
20
Prin scrierea unei valori 0Fh n registrul FSR vom obine un registru indicator la adresa 0Fh, iar
prin citirea din registrul INDF, vom obine valoarea 20, ceea ce nseamn c am citit din primul
registru valoarea lui fr accesarea lui direct (dar prin FSR i INDF). Se pare c acest tip de
adresare nu are nici un avantaj fa de adresarea direct, dar exist unele nevoi n timpul
programrii ce se pot rezolva mai simplu doar prin adresarea indirect.

Un asemenea exemplu poate trimite un set de date prin comunicaia serial, lucrnd cu bufere i
indicatoare (ce vor fi discutate n continuare ntr-un capitol cu exemple), sau s tearg o parte a
memoriei RAM (16 locaii) ca n urmtorul exemplu.

Citind datele din registrul INDF cnd coninutul registrului FSR este egal cu zero, ntoarce
valoarea zero, i scrie n el rezultatul n operaia NOP (no operation- nu opereaz).


21
2.6 ntreruperi
ntreruperile sunt un mecanism a unui microcontroler ce i permit s rspund la unele evenimente la momentul cnd se
ntmpl, indiferent de ce face atunci microcontrolerul. Aceasta este o parte foarte important, pentru c permite conexiunea
microcontrolerului cu lumea de afar. n general, fiecare ntrerupere schimb debitul programului, l ntrerupe i dup executarea
unui subprogram (rutine de ntrerupere), continu din acelai punct.

Registrul de control al unei ntreruperi se numete INTCON i se gsete la adresa 0Bh. Rolul lui este de a permite sau interzice
cererile de ntreruperi, i n caz c nu sunt permise, nregistreaz cererile de ntrerupere singulare prin biii lui.

Registru INTCON

bit 0 RBIF (RB Port Change Interrupt Flag bit-bit Stegule de ntrerupere a Schimbrii Portului RB) Bit ce informeaz despre
schimbrile de la pinii 4, 5, 6 i 7 ai portului B.
1=cel puin un pin i-a schimbat starea
0=nu s-a ntmplat nici o schimbare la vreun pin
22

bit 1 INTF (INT External Interrupt Flag bit-bit Stegule de ntrerupere Extern INT) 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 cresctor sau descresctor 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 urmtoarea ntrerupere.

bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Stegule Depire ntrerupere TMRO) Depirea contorului TMRO.
1=contorul i-a schimbat starea de la FFh la 00h.
0=depirea 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 bit-bit Permite ntreruperea schimbrii portului RB) Permite s aib loc ntreruperi la
schimbarea strii pinilor 4, 5, 6, i 7 ai portului B.
1=permite ntreruperi la schimbarea strii
0=ntreruperi interzise la schimbarea strii
Dac RBIE i RBIF au fost simultan setate, va avea loc o ntrerupere.

bit 4 INTE (INT External Interrupt Enable bit-bit 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 bit-bit Permite Depire ntrerupere TMRO) Bit ce permite ntreruperile n timpul
depirii contorului TMRO.
1=ntrerupere permis
0=ntrerupere interzis
Dac T0IE i T0IF au fost simultan setate, va avea loc ntreruperea.

Bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite ntrerupere Complet a Scrierii EEPROM) Bit ce permite o
ntrerupere la sfritul unei rutine de scriere n EEPROM
1= ntrerupere permis
0= ntrerupere interzis
Dac EEIE i EEIF (ce este n registrul EECON1) au fost simultan setate, va avea loc o ntrerupere.

Bit 7 GIE (Global Interrupt Enable bit-bit Permite ntrerupere Global) Bit ce permite sau interzice toate ntreruperile.
1=toate ntreruperile sunt permise
0=toate ntreruperile sunt interzise


PIC16F84 are patru surse de ntrerupere:

1. Terminarea scrierii datelor n EEPROM
2. ntrerupere TMR0 cauzat de depirea timer-ului
3. ntrerupere n timpul schimbrii la pinii RB4, RB5, RB6 i RB7 ai portului B.
4. ntrerupere Extern de la pinul RB0/INT al microcontrolerului

n general, fiecare surs de ntrerupere are doi bii legai la ea. Unul permite ntreruperea, iar cellalt detecteaz cnd au loc
ntreruperi. Exist un bit comun numit GIE ce poate fi folosit pentru a interzice sau permite toate ntreruperile simultan. Acest bit
este foarte folositor cnd se scrie un program pentru c permite ca toate ntreruperile s fie interzise pentru o perioad de timp,
aa ca execuia unei pri importante a programului s nu fie ntrerupt. Cnd instruciunea ce reseteaz bitul GIE a fost
executat (GIE=0, toate ntreruperile interzise), fiecare ntrerupere ce rmne nerezolvat trebuie ignorat.
23

ntreruperile ce rmn nerezolvate i ce au fost ignorate, sunt procesate cnd bitul GIE (GIE=1, toate ntreruperile sunt permise)
va fi ters. Cnd i s-a rspuns ntreruperii, bitul GIE a fost ters, aa c orice ntreruperi adiionale vor fi interzise, adresa de
ntoarcere a fost trimis n stiv, iar adresa 0004h a fost scris n contorul programului numai dup aceasta ncepe rspunsul
la o ntrerupere! Dup ce este procesat ntreruperea, bitul a crui setare a cauzat o ntrerupere trebuie ters, sau rutina de
ntrerupere va fi procesat automat tot mereu n timpul ntoarcerii la programul principal.

Pstrarea coninutului regitrilor importani

Doar valoarea de ntoarcere a contorului programului este nmagazinat ntr-o stiv n timpul unei ntreruperi (prin valoare de
ntoarcere a contorului programului nelegem adresa instruciunii ce trebuie executat, dar nu a fost executat pentru c a avut
loc ntreruperea). Pstrnd doar valoarea contorului programului adesea nu este suficient. Unii regitri ce sunt n uz n programul
principal pot fi de asemenea n uz n rutina de ntrerupere. Dac ei nu sunt reinui, programul principal va obine valori complet
diferite n acei regitri n timpul ntoarcerii dintr-o rutin de ntrerupere, ceea ce va cauza erori n program. Un exemplu de
asemenea caz este coninutul registrului de lucru W. Dac presupunem c programul principal a folosit registrul de lucru W
pentru unele din operaiile sale, i c a pstrat n el o valoare ce este important pentru urmtoarea instruciune, atunci o
ntrerupere ce se va ntmpla nainte de acea instruciune va schimba valoarea registrului de lucru W, ce va influena direct
programul principal.

Procedura de nregistrare de regitri importani nainte de a merge la o rutin de ntrerupere se numete PUSH, n timp ce
procedura ce aduce valorile nregistrate napoi, se numete POP. PUSH i POP sunt instruciuni ale altor microcontrolere (Intel),
dar sunt att de larg acceptate c o ntreag operaie este numit dup ele. PIC16F84 nu are instruciuni ca PUSH i POP, i ele
trebuie s fie programate.
24

Datorit simplitii i folosirii frecvente, aceste pri ale programului pot fi fcute ca macro-uri. Conceptul unui Macro este explicat
n "Limbaj de asamblare program". n urmtorul exemplu, coninuturile regitrilor W i STATUS sunt memorate n variabilele
W_TEMP i STATUS_TEMP nainte de rutina de ntrerupere. La nceputul rutinei PUSH trebuie s verificm bancul selectat n
prezent pentru c W_TEMP and STATUS_TEMP nu se gsesc n bancul 0. Pentru schimbul de date ntre aceti regitri,
instruciunea SWAPF se folosete n loc de MOVF pentru c nu afecteaz starea biilor registrului STATUS.

Exemplul este un program asamblor pentru urmtorii pai :
1. Testarea bancului curent
2. Stocarea registrului W indiferent de bancul curent
3. Stocarea registrul STATUS n bancul 0
4. Executarea rutinei de ntrerupere pentru procesul de ntrerupere (ISR)
5. Restaureaz registrul STATUS
6. Restaureaz registrul W

Dac mai sunt i alte variabile sau regitri ce trebuie stocai, atunci ei trebuie s fie pstrai dup stocarea registrului STATUS
(pasul 3), i adui napoi nainte ca registrul STATUS s fie restaurat (pasul 5).
25

Acelai exemplu se poate realiza utiliznd macro-uri, fcnd 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'.
26

ntrerupere extern la pinul RB0/INT al microcontrolerului

ntreruperea extern la pinul RB0/INT este triggerat de frontul cresctor (dac bitul INTEDG=1 n registrul OPTION<6>), sau de
frontul descresctor (dac INTEDG=0). Cnd apare semnalul corect la pinul INT, bitul INTF este setat la registrul INTCON. Bitul
INTF (INTCON<1>) trebuie resetat n rutina de ntrerupere, aa ca ntreruperea s nu aib loc din nou n timpul ntoarcerii 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>).

ntreruperea n timpul depirii contorului TMRO

Depirea contorului TMRO (de la FFh la 00h) va seta bitul T0IF (INTCON<2>). Aceasta este o ntrerupere foarte important
pentru c multe probleme reale se por rezolva folosind aceast ntrerupere. Unul din exemple este msurarea timpului. Dac
tim ct timp are nevoie contorul pentru a completa un ciclu de la 00h to FFh, atunci numrul de ntreruperi nmulit 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 nmulite 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>).

ntrerupere pe timpul unei schimbri la pinii 4, 5, 6 i 7 ai portului B

Schimbarea semnalului de intrare la PORTB <7:4> seteaz bitul RBIF (INTCON<0>). Patru pini RB7, RB6, RB5 i RB4 ai
portului B, pot triggera o ntrerupere ce are loc cnd starea la ei se schimb de la unu la zero logic, sau viceversa. Pentru ca pinii
s fie sensibili la aceast schimbare, trebuie definii ca intrare. Dac oricare din ei este definit ca ieire, ntreruperea nu va fi
generat la schimbarea strii. Dac ei sunt definii ca intrare, starea lor curent este comparat cu vechea valoare ce a fost
stocat la ultima citire de la portul B. ntreruperea poate fi pornit/oprit prin setarea/resetarea bitului RBIE n registrul INTCON.

ntreruperea la terminarea subrutinei write n EEPROM

Aceast ntrerupere este doar de natur practic. Pentru c scrierea ntr-o locaie EEPROM dureaz cam 10ms (care este o
durat lung n termenii microcontrolerului), nu este rentabil de a atepta pn la capt scrierea. Este adugat astfel
mecanismul de ntrerupere ceea ce permite microcontrolerului s continue executarea programului principal, n timp ce scrierea
n EEPROM este fcut n plan secundar. Cnd scrierea este terminat, ntreruperea informeaz microcontrolerul c scrierea s-
a terminat. Bitul EEIF, prin care se face aceast informare, se gsete n registrul EECON1. Producerea unei ntreruperi poate fi
interzis prin resetarea bitului EEIE n registrul INTCON.

27

Iniializarea ntreruperii

Pentru a folosi un mecanism de ntrerupere a unui microcontroler, trebuie fcute unele sarcini pregtitoare. Aceste proceduri
sunt pe scurt numite "iniializare". Prin iniializare definim la ce va rspunde microcontrolerul, i ce va ignora. Dac nu setm bitul
ce permite o anumit ntrerupere, programul nu va executa un subprogram ntrerupere. Prin aceasta putem obine controlul
asupra producerii ntreruperii, ceea ce este foarte folositor.

Exemplul de mai sus arat iniializarea unei ntreruperi externe la pinul RB0 al microcontrolerului. Unde se vede unu setat,
nseamn c ntreruperea este permis. Producerea altor ntreruperi nu este permis, i toate ntreruperile mpreun sunt
interzise pn ce bitul GIE este inut n unu.

Urmtorul exemplu arat o cale tipic de a dirija ntreruperile. PIC16F84 are doar o locaie unde adresa unui subprogram
ntrerupere este memorat. Aceasta nseamn c mai nti trebuie s detectm ce ntrerupere este la ndemn (dac mai mult
de o surs de ntreruperi este disponibil), i apoi putem executa acea parte a programului ce se refer la acea ntrerupere.
28


Rentoarcerea dintr-o rutin de ntrerupere poate fi fcut cu instruciunile RETURN, RETLW i RETFIE. Se recomand
ca s fie utilizat instruciunea RETFIE pentru c acea instruciune este singura ce seteaz automat bitul GIE, ceea ce
permite s se produc o nou ntrerupere.













29
2.7 Timer-ul liber TMR0
Timer-ele (temporizatoarele) sunt de obicei cele mai complicate pri ale unui microcontroler, aa c este necesar s rezervm
mai mult timp pentru a le explica. Odat cu aplicarea lor este posibil s se creeze relaii ntre o dimensiune real ca "timp" i o
variabil ce reprezint starea timer-ului ntr-un microcontroler. Fizic, timer-ul este un registru a crui valoare crete continuu
pn la 255, i apoi pornete de la capt: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc.

Aceast incrementare se face n fundalul a tot ceea ce face un microcontroler. Depinde de programator "s gseasc o cale" de
cum s profite de aceast caracteristic pentru nevoile lui. Una din ci este s creasc o variabil la fiecare depire a timer-
ului. Dac tim ct timp are nevoie timer-ul s fac o rund complet, atunci nmulind valoarea variabilei cu acel timp obinem
timpul total scurs.

PIC16F84 are un timer de 8 bii. Numrul de bii determin pn la ce valoare contorizeaz timer-ul nainte de a ncepe s
contorizeze de la zero din nou. n cazul unui timer de 8 bii, acel numr este 256. O schem simplificat a relaiei dintre un timer
i un prescaler-divizor este reprezentat n diagrama anterioar. Prescalerul este numele acelei pri din microcontroler ce divide
ceasul oscilatorului nainte de a ajunge la logica ce crete starea timer-ului. Numrul ce divide un ceas este definit prin trei bii n
registrul OPTION. Cel mai mare divizor este 256. Aceasta nseamn de fapt c doar la al fiecare 256-lea ceas, valoarea timer-
ului va crete cu unu. Aceasta ne d posibilitatea de a msura perioade de timp mai lungi.
30

Dup fiecare numrtoare pn la 255, timer-ul i reseteaz valoarea la zero i ncepe cu un nou ciclu de contorizare pn la
255. n timpul fiecrei tranziii de la 255 la zero, bitul TOIF n registrul INTCON este setat. Dac se permit ntreruperi, de aceasta
se poate profita n generarea i n procesarea rutinei de ntrerupere. Depinde de programator s reseteze bitul TOIF n rutina de
ntrerupere, aa ca noua ntrerupere, sau noua depire s fie detectate. n afar de ceasul oscilator intern, starea timer-ului
poate de asemenea s creasc prin ceasul extern la pinul RA4/TOCKI. Alegerea uneia din aceste dou opiuni se face n
registrul OPTION prin bitul TOCS. Dac a fost aleas aceast opiune de ceas extern, va fi posibil s se defineasc frontul unui
semnal (cresctor sau descresctor), la care timer-ul s-i creasc valoarea.

n practic, unul din exemplele tipice ce este rezolvat prin ceas extern i unde timer-ul contorizeaz rotaiile complete ale unui ax
al unei maini de producie, ca bobinatorul de transformator de exemplu. S rotim patru uruburi de metal pe axul unui
bobinator. Aceste patru uruburi vor reprezenta convexitatea metalic. S plasm acum un senzor inductiv la o distan de 5
31
mm de captul unui urub. Senzorul inductiv va genera semnalul descresctor de fiecare dat cnd capul urubului este paralel
cu capul senzorului. Fiecare semnal va reprezenta o ptrime dintr-o rotaie, i suma tuturor rotaiilor se va gsi n timer-ul TMRO.
Programul poate uor citi aceste date din timer printr-un bus de date.

Urmtorul exemplu ilustreaz cum s se iniializeze timer-ul la fronturile descresctoare ale semnalului din sursa extern cu un
prescaler 1:4. Timer-ul lucreaz n mod "polig-mpingere".


Acelai exemplu poate fi realizat printr-o ntrerupere n modul urmtor:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe care microcontrolerul l
folosete s se apere mpotriva blocrii programelor. Ca orice alt circuit electric, la fel i cu microcontrolerul se pot ntmpla
defectri, sau unele stricciuni. Din nefericire microcontrolerul are de asemenea un program unde se pot ntmpla probleme.
Cnd se ntmpl aceasta, microcontrolerul se va opri din funcionare i va rmne n acea stare pn ce cineva l reseteaz.
Din cauza aceasta, a fost introdus mecanismul watchdog. Dup o anumit perioad de timp, watchdogul reseteaz
microcontrolerul (de fapt microcontrolerul se reseteaz singur). Watchdogul luceaz pe baza unui principiu simplu: dac se
ntmpl depirea timer-ului, microcontrolerul este resetat, i ncepe executarea programului mereu din nou. Astfel, se va
ntmpla un reset att n cazul unei funcionri corecte ct i incorecte. Urmtorul pas este prevenirea resetului n cazul unei
funcionri corecte, ce se face prin scrierea unui zero n registrul WDT (instruciunea CLRWDT) de fiecare dat cnd se apropie
32
de depire. Astfel programul va preveni un reset ct timp este executat corect. De ndat ce s-a blocat, nu se va scrie zero, va
avea loc depirea timer-ului WDT i un reset ce va duce microcontrolerul napoi la funcionarea corect din nou.

Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul PSA n registrul OPTION. tergnd bitul PSA,
prescalerul va fi acordat cu timer-ul TMRO. Cnd prescalerul este acordat cu timer-ul TMRO, toate instruciunile de scriere n
registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor terge prescalerul. Cnd prescalerul este asignat timerului
watchdog, numai instruciunea CLRWDT va terge prescalerul i timer-ul watchdog n acelai timp. Schimbarea prescalerului
este complet sub controlul programatorului, i poate fi schimbat n timp ce se ruleaz programul.

Exist doar un prescaler i un timer. Funcie de nevoi, ele sunt asignate fie timer-ului TMRO fie watchdog-ului.
Registrul control OPTION

Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rat Prescaler)
Subiectul prescaler, i cum afecteaz aceti bii lucrul unui microcontroler va fi abordat n seciunea despre TMRO.

bit 3 PSA (Prescaler Assignment bit-bit Asignare Prescaler)
Bit ce asigneaz prescalerul ntre TMRO i timer-ul watchdog).
1=prescalerul este asignat la timer-ul watchdog
0=prescalerul este asignat la timer-ul free-liber

bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Surs TMRO)

Dac triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va determina dac va fi la frontul cresctor sau
descresctor al semnalului.
1=front descresctor
0=front cresctor

bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Surs Ceas TMRO)
Acest bit permite unui timer free-run s-i incrementeze valoarea fie de la oscilatorul intern, de exemplu din ceasul
oscilatorului, sau prin impulsuri externe la pinul RA4/T0CKI.
1=impulsuri externe
0=1/4 ceas intern

33
bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front ntreruperi)
Dac a fost permis producerea de ntreruperi, acest bit va determina la ce front va avea loc ntreruperea la pinul RB0/INT.
1=front cresctor
0=front descresctor

bit 7 RBPU (PORTB Pull-up Enable bit-bit Permite Pull-up-tragerea PORTB)
Acest bit deschide sau nchide rezistorii interni la portul B.
1=rezistorii 'pull-up' deschii
0=rezistorii 'pull-up' nchii
2.8 Memoria de date EEPROM
PIC16F84 are 64 de bytes de locaii de memorie EEPROM la adresele de la 00h la 63h unde se
poate scrie sau de unde se poate citi. Cea mai important caracteristic a acestei memorii este
c nu pierde coninutul n timpul nchideri sursei de alimentare. Aceasta nseamn practic c
ceea ce a fost scris n ea va rmne chiar i cnd microcontrolerul este nchis. Datele pot fi
reinute n EEPROM fr sursa de alimentare pn la 40 de ani. (dup cum declar productorul
lui PICD16F84), i se pot executa 10000 de cicluri de scriere.

n practic, memoria EEPROM este folosit pentru stocarea unor date importante sau a unor
parametri de proces.
Un asemenea parametru este o temperatur dat, asignat cnd se seteaz un regulator de
temperatur la un proces. Dac nu s-a reinut, va fi nevoie s se ajusteze temperatura dat dup
fiecare ntrerupere a alimentrii. Pentru c aceasta este foarte nepractic (chiar periculos),
productorii de microntrolere au nceput s instaleze un tip mai mic de memorie EEPROM.

Memoria EEPROM este plasat ntr-un loc special al memoriei i poate fi accesat prin regitri
speciali. Aceti regitri sunt:

EEDATA la adresa 08h, care reine datele de citit sau cele de scris.
EEADR la adresa 09h, ce conine o adres a locaiei EEPROM ce este accesat.
EECON1 la adresa 88h, ce conine bii de control.
EECON2 la adresa 89h. Acest registru nu exist fizic i servete la protejarea EEPROM-ului de
scrieri accidentale.

Registrul EECON1 la adresa 88h este un registru de control cu 5 bii implementai.
Biii 5, 6 i 7 nu sunt folosii, i prin citire sunt totdeauna zero. Interpretarea biilor registrului
EECON1 urmeaz.

Registrul EECON1

bit 0 RD (Read Control bit-bit Control Citire)
Setarea acestui bit iniializeaz transferul de date definit n EEADR la registrul EEDATA. Pentru
c timpul nu este esenial n citirea datelor ca la scriere, datele din EEDATA pot fi deja folosite n
urmtoarea instruciune.
1=initializeaz citirea
0=nu iniializeaz citirea
34

bit 1 WR (Write Control bit-bit Control Scriere)
Setarea acestui bit iniializeaz scrierea datelor din registrul EEDATA la adresa specifcat prin
registrul EEADR.
1=initializeaz scrierea
0=nu iniializeaz scrierea

bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite scrierea n
EEPROM
Dac acest bit nu a fost setat, microcontrolerul nu va permite scrierea n EEPROM.
1=scriere permis
0=scriere interzis

bit 3 WRERR (Write EEPROM Error Flag-Stegule Eroare Scriere EEPROM ) Eroare n timpul
scrierii n EEPROM
Acest bit a fost setat doar n caz c scrierea n EEPROM a fost intrerupt de un semnal sau prin
terminarea timpului din timer-ul watchdog (dac este activat).
1=a avut loc eroare
0=nu a avut loc eroare

bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Stegule ntrerupere Operaie Scriere
EEPROM) Bit folosit pentru a informa c scrierea datelor s-a terminat.
Cnd s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie s tearg bitul
EEIF n programul su pentru a detecta noua terminare a scrierii.
1=scrierea terminat
0=scrierea nc neterminat, sau nc nu a nceput

Citirea din memoria EEPROM

Setarea bitului RD iniializeaz transferul de date de la adresa gsit n EEADR la registrul
EEDATA. Ca i la citirea datelor nu avem nevoie de att de mult timp ca la scriere, datele luate
din registrul EEDATA pot deja fi folosite mai departe n urmtoarea instruciune.

O mostr a prii programului ce citete datele n EEPROM, ar putea arta ca mai jos:

Dup ultima instruciune de program, coninutul de la o adres EEPROM zero poate fi gsit n
registrul w.

Scrierea n memoria EEPROM

Pentru a scrie datele n locaia EEPROM, programatorul trebuie mai nti s scrie adresa n
registrul EEADR i datele n registrul EEDATA. Numai atunci este folositor de a seta bitul WR ce
pune totul n micare. Bitul WR va fi resetat, i bitul EEIF setat urmnd o scriere ce poate fi
folosit n procesarea ntreruperilor. Valorile 55h i AAh sunt prima i a doua cheie care interzic
ca scrierea accidental n EEPROM s se ntmple. Aceste dou valori sunt scrise n EECON2
care servete doar pentru acel scop, de a primi aceste dou valori i de a preveni orice scriere
accidental n memoria EEPROM. Liniile de program marcate ca 1, 2, 3 i 4 trebuie s fie
35
executate n acea ordine n intervale egale de timp. De aceea este foarte important, s nchidei
ntreruperile ce ar putea schimba timpul necesar pentru executare instruciunilor. Dup scriere,
ntreruperile, pot fi permise din nou.

Exemplu unei pri a programului ce scrie datele 0xEE n prima locaie n memoria EEPROM ar
putea arta ca mai jos:


Este recomandat ca WREN s fie nchis tot timpul cu excepia scrierii datelor n EEPROM, aa c posibilitatea unei
scrieri accidentale va fi minim. Scrierea n EEPROM va fi automat tears!

S-ar putea să vă placă și