Microcontrolere PIC on-line GRATIS!

 
 
 
   
Pagina anterioară Conţinut Pagina următoare

 

2.7 Timer-ul liber TMR0

Timer-ele (temporizatoarele) sunt de obicei cele mai complicate părţi ale unui microcontroler, aşa că este necesar  să rezervăm mai mult timp pentru a le explica. Odată cu aplicarea lor este posibil să se creeze relaţii īntre o dimensiune reală ca "timp" şi o variabilă ce reprezintă starea timer-ului īntr-un microcontroler. Fizic, timer-ul este un registru a cărui valoare creşte continuu pānă la 255, şi apoi porneşte de la capăt: 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ă găsească o cale" de cum să profite de această caracteristică pentru nevoile lui. Una din căi este să crească o variabilă la fiecare depăşire a timer-ului. Dacă ştim cāt timp are nevoie timer-ul să facă o rundă completă, atunci īnmulţind valoarea variabilei cu acel timp obţinem timpul total scurs. 

PIC16F84 are un timer de 8 biţi. Numărul de biţi determină pānă la ce valoare contorizează timer-ul īnainte de a īncepe să contorizeze de la zero din nou. Īn cazul unui timer de 8 biţi, acel număr este 256. O schemă simplificată a relaţiei dintre un timer şi un prescaler-divizor este reprezentată īn diagrama anterioară. Prescalerul este numele acelei părţi din microcontroler ce divide ceasul oscilatorului īnainte de a ajunge la logica ce creşte starea timer-ului. Numărul ce divide un ceas este definit prin trei biţi ī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 creşte cu unu. Aceasta ne dă posibilitatea de a măsura perioade de timp mai lungi.

După fiecare numărătoare pānă la 255, timer-ul īşi resetează valoarea la zero şi īncepe cu un nou ciclu de contorizare pānă la 255. Īn timpul fiecărei tranziţii 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, aşa ca noua īntrerupere, sau noua depăşire 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ă opţiuni se face īn registrul OPTION prin bitul TOCS. Dacă a fost aleasă această opţiune de ceas extern, va fi posibil să se definească frontul unui semnal (crescător sau descrescător), 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ă rotaţiile complete ale unui ax al unei maşini de producţie, ca bobinatorul de transformator de exemplu. Să rotim patru şuruburi de metal pe axul unui bobinator. Aceste patru şuruburi vor reprezenta convexitatea metalică. Să plasăm acum un senzor inductiv la o distanţă de 5 mm de capătul unui şurub. Senzorul inductiv va genera semnalul descrescător de fiecare dată cānd capul şurubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o pătrime dintr-o rotaţie, şi suma tuturor rotaţiilor se va găsi īn timer-ul TMRO. Programul poate uşor citi aceste date din timer printr-un bus de date. 

Următorul exemplu ilustrează cum să se iniţializeze timer-ul la fronturile descrescătoare ale semnalului din sursa externă cu un prescaler 1:4. Timer-ul lucrează īn mod "polig-īmpingere".


Acelaşi exemplu poate fi realizat printr-o īntrerupere īn modul următor:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este un mecanism pe care microcontrolerul īl foloseşte să se apere īmpotriva blocării programelor. Ca orice alt circuit electric, la fel şi cu microcontrolerul se pot īntāmpla defectări, sau unele stricăciuni. Din nefericire microcontrolerul are de asemenea un program unde se pot īntāmpla probleme. Cānd se īntāmplă aceasta, microcontrolerul se va opri din funcţionare şi va rămāne īn acea stare pānă 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 īntāmplă depăşirea timer-ului, microcontrolerul este resetat, şi īncepe executarea programului mereu din nou. Astfel, se va īntāmpla un reset atāt īn cazul unei funcţionări corecte cāt şi incorecte. Următorul pas este prevenirea resetului īn cazul unei funcţionări corecte, ce se face prin scrierea unui zero īn registrul WDT (instrucţiunea CLRWDT) de fiecare dată cānd se apropie de depăşire. Astfel programul va preveni un reset cāt timp este executat corect. De īndată ce s-a blocat, nu se va scrie zero, va avea loc depăşirea timer-ului WDT şi un reset ce va duce microcontrolerul īnapoi la funcţionarea corectă din nou. 

Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul PSA īn registrul OPTION. Ştergānd bitul PSA, prescalerul va fi acordat cu timer-ul TMRO. Cānd prescalerul este acordat cu timer-ul TMRO, toate instrucţiunile de scriere īn registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor şterge prescalerul. Cānd prescalerul este asignat timerului watchdog, numai instrucţiunea CLRWDT va şterge prescalerul şi timer-ul watchdog īn acelaşi 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. Funcţie 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ă aceşti biţi lucrul unui microcontroler va fi abordat īn secţiunea 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 crescător sau descrescător al semnalului.   
1=front descrescător 
0=front crescător

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

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 crescător 
0=front descrescător

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' deschişi
0=rezistorii 'pull-up' īnchişi

 

Pagina anterioară Conţinut Pagina următoare
 

© Copyright 2003. mikroElektronika. All Rights Reserved. For any comments contact webmaster.