Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Microcontroler - Timer-ul liber TMR0

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 5 mm de capatul unui surub. Senzorul inductiv va genera semnalul descrescator de fiecare data cand capul surubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o patrime dintr-o rotatie, si suma tuturor rotatiilor se va gasi in timer-ul TMRO. Programul poate usor citi aceste date din timer printr-un bus de date. 

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