|
Microcontroler - Timer-ul liber TMR0
Timer-ele (temporizatoarele) sunt de obicei cele mai complicate parti ale unui microcontroler, asa ca este necesar sa rezervam mai mult timp pentru a le explica. Odata cu aplicarea lor este posibil sa se creeze relatii intre o dimensiune reala ca 'timp' si o variabila ce reprezinta starea timer-ului intr-un microcontroler. Fizic, timer-ul este un registru a carui valoare creste continuu pana la 255, si apoi porneste de la capat: 0, 1, 2, 3, 4255.0,1, 2, 3etc.
Aceasta
incrementare se face in fundalul a tot ceea ce face un microcontroler. Depinde
de programator 'sa gaseasca o cale' de cum sa
profite de aceasta caracteristica pentru nevoile lui. Una din
cai este sa creasca o variabila la fiecare
depasire a timer-ului. Daca stim cat timp are nevoie
timer-ul sa faca o runda completa, atunci inmultind
valoarea variabilei cu acel timp obtinem timpul total scurs.
PIC16F84 are un timer de 8 biti. Numarul de biti determina
pana la ce valoare contorizeaza timer-ul inainte de a incepe sa
contorizeze de la zero din nou. In cazul unui timer de 8 biti, acel
numar este 256. O schema simplificata a relatiei dintre un
timer si un prescaler-divizor este reprezentata in diagrama anterioara.
Prescalerul este numele acelei parti din microcontroler ce divide
ceasul oscilatorului inainte de a ajunge la logica ce creste starea
timer-ului. Numarul ce divide un ceas este definit prin trei biti in
registrul OPTION. Cel mai mare divizor este 256. Aceasta inseamna de fapt
ca doar la al fiecare 256-lea ceas, valoarea timer-ului va creste cu
unu. Aceasta ne da posibilitatea de a masura perioade de timp mai
lungi.
Dupa fiecare numaratoare pana la 255, timer-ul isi reseteaza valoarea la zero si incepe cu un nou ciclu de contorizare pana la 255. In timpul fiecarei tranzitii de la 255 la zero, bitul TOIF in registrul INTCON este setat. Daca se permit intreruperi, de aceasta se poate profita in generarea si in procesarea rutinei de intrerupere. Depinde de programator sa reseteze bitul TOIF in rutina de intrerupere, asa ca noua intrerupere, sau noua depasire sa fie detectate. In afara de ceasul oscilator intern, starea timer-ului poate de asemenea sa creasca prin ceasul extern la pinul RA4/TOCKI. Alegerea uneia din aceste doua optiuni se face in registrul OPTION prin bitul TOCS. Daca a fost aleasa aceasta optiune de ceas extern, va fi posibil sa se defineasca frontul unui semnal (crescator sau descrescator), la care timer-ul sa-si creasca valoarea.
In practica,
unul din exemplele tipice ce este rezolvat prin ceas extern si unde timer-ul
contorizeaza rotatiile complete ale unui ax al unei masini de
productie, ca bobinatorul de transformator de exemplu. Sa rotim patru
suruburi de metal pe axul unui bobinator. Aceste patru suruburi vor
reprezenta convexitatea metalica. Sa plasam acum un senzor
inductiv la o distanta de
Urmatorul exemplu ilustreaza cum sa se initializeze
timer-ul la fronturile descrescatoare ale semnalului din sursa
externa cu un prescaler 1:4. Timer-ul lucreaza in mod
'polig-impingere'.
Acelasi exemplu poate fi realizat printr-o intrerupere in modul urmator:
Prescalerul poate
fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe
care microcontrolerul il foloseste sa se apere impotriva
blocarii programelor. Ca orice alt circuit electric, la fel si cu
microcontrolerul se pot intampla defectari, sau unele stricaciuni.
Din nefericire microcontrolerul are de asemenea un program unde se pot intampla
probleme. Cand se intampla aceasta, microcontrolerul se va opri din
functionare si va ramane in acea stare pana ce cineva il
reseteaza. Din cauza aceasta, a fost introdus mecanismul watchdog.
Dupa o anumita perioada de timp, watchdogul reseteaza
microcontrolerul (de fapt microcontrolerul se reseteaza singur). Watchdogul
luceaza pe baza unui principiu simplu: daca se intampla
depasirea timer-ului, microcontrolerul este resetat, si incepe
executarea programului mereu din nou. Astfel, se va intampla un reset atat in
cazul unei functionari corecte cat si incorecte. Urmatorul
pas este prevenirea resetului in cazul unei functionari corecte, ce
se face prin scrierea unui zero in registrul WDT (instructiunea CLRWDT) de
fiecare data cand se apropie de depasire. Astfel programul va
preveni un reset cat timp este executat corect. De indata ce s-a blocat,
nu se va scrie zero, va avea loc depasirea timer-ului WDT si un
reset ce va duce microcontrolerul inapoi la functionarea corecta din
nou.
Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin
bitul PSA in registrul OPTION. Stergand bitul PSA, prescalerul va fi
acordat cu timer-ul TMRO. Cand prescalerul este acordat cu timer-ul TMRO, toate
instructiunile de scriere in registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF
TMR0,) vor sterge prescalerul. Cand prescalerul este asignat timerului
watchdog, numai instructiunea CLRWDT va sterge prescalerul si
timer-ul watchdog in acelasi timp. Schimbarea prescalerului este
completa sub controlul programatorului, si poate fi schimbat in timp
ce se ruleaza programul.
Exista doar un prescaler si un timer. Functie 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 Rata Prescaler)
Subiectul prescaler, si cum afecteaza acesti biti lucrul
unui microcontroler va fi abordat in sectiunea despre TMRO.
bit 3 PSA (Prescaler Assignment
bit-bit Asignare Prescaler)
Bit ce asigneaza prescalerul intre TMRO si 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
Sursa TMRO)
Daca triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI,
acest bit va determina daca va fi la frontul crescator sau
descrescator al semnalului.
1=front descrescator
0=front crescator
bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Sursa
Ceas TMRO)
Acest bit permite unui timer free-run sa-si 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
bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front
Intreruperi)
Daca a fost permisa producerea de intreruperi, acest bit va determina
la ce front va avea loc intreruperea la pinul RB0/INT.
1=front crescator
0=front descrescator
bit 7 RBPU (PORTB Pull-up Enable bit-bit Permite Pull-up-tragerea
PORTB)
Acest bit deschide sau inchide rezistorii interni la portul B.
1=rezistorii 'pull-up' deschisi
0=rezistorii 'pull-up' inchisi