Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Ceasurile de timp real 0 si 2 (T/C0 si T/C2)
1. Prezentare generala
AT90S8535 pune la dispozitie trei cronometre/numaratoare (T/C) de uz general: doua de 8 biti - T/C0 si T/C2 si unul de 16 biti - T/C1. Cele trei T/C pot fi folosite atat pe rol de cronometre atunci cand este folosita o sursa de ceas interna, cat si pe rol de numaratoare atunci cand este folosita intrarea pe pin externa care declansaza contorizarea.
T/C0 si T/C1 au selectie pentru prescalare individuala de la acelasi divizor de prescalare de 10-biti. T/C2 are un prescaler separat, si este optimizat pentru folosirea cu un cristal ceas de 32.768 Hz (215 Hz), putand fi folosit ca ceas de timp real.
Cele patru posibilitati de prescalare sunt: CK/8, CK/64, CK/256 si CK/1024, unde CK este frecventa ceasului oscilator. In plus, mai pot fi alese ca sursa de ceas inca patru posibilitati: ceas intern nedivizat, sursa externa cu numarare pe front crescator, sursa externa cu numarare pe front descrescator si stop.
T/C0 este in esenta un numarator programabil de 8 biti, cu posibilitati de incarcare si citire paralel si o serie de registre de programare si control.
Pentru blocurile de tip T/C se poate selecta sursa ceasului din CK, CK prescalat, sau dintr-un pin extern.
2. Timer/Counter0 (T/C0)
T/C0 este realizat ca un numarator crescator (up-counter) cu posibilitati de citire si scriere, vazut in spatiul I/O ca un port, TCNT0, aflat la adresa $32. El poate genera o intrerupere de depasire, cu vector $0009, atunci cand valoarea sa trece de la $FF la 00. Aceasta situatie pozitioneaza un flag de depasire, TOV0 care este situat in registrul de flaguri de intrerupere a blocurilor de tip T/C - TIFR. Semnalele de control se afla in registrul de control al T/C0 - TCCR0. Bitul de activare/dezactivare a acestei intreruperi, TOIE0, se afla in registrul mastilor de intreruperi ale blocurilor de tip T/C - TIMSK. Aceste registre vor fi prezentate in continuare.
Cand T/C0 lucreaza cu sursa externa, semnalul extern este sincronizat cu frecventa oscilatorului CPU-ului. Pentru ca sursa de ceas externa sa fie corect esantionata, durata minima de timp dintre doua tranzitii ale ceasului extern trebuie sa fie cel putin la fel de lunga cat durata unui ciclu intern de ceas al CPU-ului. Semnalul de ceas extern este esantionat pe frontul crescator al ceasului intern al CPU-ului.
In plus, T/C0 poate fi oprit, asa cum este descrisa in documentatia pentru registrul de control al T/C0 - TCCR0.
Daca se scrie in T/C0 si este prezent un ceas-sursa, se continua numaratoarea in ciclul de ceas urmator operatiei de scriere.
Registrele asociate T/C2
TCNT0
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$32 |
MSB |
LSB |
||||||
Citeste/scrie |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
Valoarea initiala |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Registrul de control a T/C 0 - TCCR0.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
$33 |
- |
- |
- |
- |
- |
CS02 |
CS01 |
CS00 |
Citeste/scrie |
C |
C |
C |
C |
C |
C/S |
C/S |
C/S |
Valoarea initiala |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Acesti biti sunt biti rezervati in AT90S8515 si sunt cititi intotdeauna zero.
Selectarea ceasului prin bitii biti 2, 1 si 0 se face conform tabelului 4.1.
Tabelul 4.1. Selectarea prescalarii ceasului 0
CS02 |
CS01 |
CS00 |
Descriere |
0 |
0 |
0 |
Stop, T/C0 este oprit |
0 |
0 |
1 |
CK |
0 |
1 |
0 |
CK/8 |
0 |
1 |
1 |
CK/64 |
1 |
0 |
0 |
CK/256 |
1 |
0 |
1 |
CK/1024 |
1 |
1 |
0 |
Pin extern T0, front descrescator |
1 |
1 |
1 |
Pin extern T0, front crescator |
Modul stop pune la dispozitie o functie de activare/dezactivare a ceasului. Modurile cu divizare a frecventei sunt scalate direct din ceasul CK al oscilatorului. Daca sunt folosite modurile cu intrare de pe pin extern, trebuie realizata setarea corespunzatoare a pinului in registrul de control al directiei datelor pentru portul PB (bitul de directie in zero stabileste ca pinul este de intrare).
Lucrul cu blocurile de tip T/C presupune si programarea corespunzatoare a bitilor din registrul de masti de intrerupere al acestora. La pornirea microcontrolerului, acesti biti sunt in 0, astfel ca intreruperile respective nu sunt activate si nu este necesar ca ele sa fie luate in consideratie la scrierea programelor care nu le folosesc.
2. Timer/Counter2 (T/C2)
T/C0 este realizat ca un numarator reversibil (up/down-counter) cu posibilitati de citire si scriere, vazut in spatiul I/O ca un port, TCNT2, aflat la adresa $24. Are asociat un registru de comparare, OCR2, a carui valoare este continuu comparata cu continutul T/C2.
El poate genera doua intreruperi:
intrerupere de depasire, cu vector $0004, atunci cand valoarea sa trece de la $FF la 00. Aceasta situatie pozitioneaza un flag de depasire, TOV2, care este situat in registrul de flaguri de intrerupere al blocurilor de tip T/C - TIFR. Semnalele de control se afla in registrul de control al T/C2 - TCCR2. Bitul de activare/dezactivare a acestei intreruperi, TOIE2 se afla in registrul mastilor de intreruperi al blocurilor de tip T/C - TIMSK.
Intrerupere de egalitate cu registrul de comparare, cu vector $0003, atunci cand continutul T/C2 egaleaza continutul registrului de comparare. In aceasta situatie este setat flagul de egalitate la comparare, OCF2, care este situat in registrul de flaguri de intrerupere al blocurilor de tip T/C - TIFR. Bitul de activare/dezactivare a intreruperii respective, OCIE2, se afla in registrul mastilor de intreruperi al blocurilor de tip T/C - TIMSK.
Semnalul generat in caz de egalitate cu registrul de comparare poate fi folosit pentru resetarea numaratorului si poate actiona asupra liniei de iesire OC2 (functie alternativa a PD7). Acest semnal este de asemenea utilizat pentru functionarea ca modulator de impulsuri in factor de umplere ("Pulse Width Modulator" -PWM).
Sursa de ceas pentru T/C2 se poate fi CK, CK prescalat, sau o sursa nesincronizata cu ceasul sistemului obtinuta prin cuplarea unui resonator intre pini externi TOSC1/2 . In plus, T/C2 poate fi oprit, prin punerea in 0 a bitilor sursei de numarare CS22-CS20 din registrul de control al T/C2 - TCCR2.
Registrele asociate T/C2
Acestea sunt: registrul numarator propriu-zis TCNT2, registrul de comparatie OC2 si registrul de control TCCR2. Registrele de intreruperi TIMSK si TIFR sunt comune cu celelalte T/C si au fost prezentate anterior.
Registrul T/C2 - TCNT2
TCNT2
Bit | ||||||||
TCNT2(7:0) |
||||||||
Citeste/ scrie |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
Valoare initiala |
Acest registru permite citirea si modificarea valorii curente a T/C2. Daca se scrie in T/C2 si este prezent un ceas-sursa, se continua numaratoarea in ciclul de ceas urmator operatiei de scriere.
Registrul de comparatie al T/C2 - OCR2
OCR2
Bit | ||||||||
OCR2(7:0) |
||||||||
Citeste/ scrie |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
Valoare initiala |
Continutul acestui registru este continuu comparat cu valoarea existenta in T/C2. Aparitia unei egalitati va genera o intrerupere de egalitate de comparare in urmatorul ciclu de ceas, sau permite generarea de forme de unda la iesirea OC2.
Registrul de control a T/C2 - TCCR2.
TCCR2
Bit | ||||||||
PWM2 |
COM21 |
COM20 |
CTC |
CS22 |
CS21 |
CS20 |
||
Citeste/ scrie |
C |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
Valoare initiala |
Acest bit este rezervat la AT90S8535 si este citit intotdeauna 0.
Acest bit activeaza modul de lucru ca modulator de impulsuri in factor de umplere al blocului T/C2.
Acesti biti stabilesc comportarea iesirii de comparare OC2, care este functie alternativa a pinului PD7. Bitul de directie corespunzator din registrul de directie a datelor DDRD trebuie sa fie in 1 (configurat ca iesire).
In tabelele 12, 13 si 14 este descrisa actiunea acestor biti.
Tabelul 12. Actiunea iesirii de comparare in modul non-PWM
COM21 |
COM20 |
Descriere |
0 |
0 |
OC2 deconectat |
0 |
1 |
Inverseaza OC2 la egalitate de comparare |
1 |
0 |
Pune in 0 iesirea OC2 la egalitate de comparare |
1 |
1 |
Pune in 1 iesirea OC2 la egalitate de comparare |
Cand acest bit este in 1, la atingerea egalitatii de comparare numaratorul este resetat la $00. La factori de prescalare mai mari decat 1, starea de egalitate dureaza mai putin decat celelalte stari, ea fiind mereu de o perioada a ceasului.
Selectarea ceasului prin bitii 2, 1 si 0 se face conform tabelului 15.
Tabelul 15. Selectarea prescalarii ceasului 0
CS22 |
CS21 |
CS20 |
Descriere |
0 |
0 |
0 |
Stop, T/C2 este oprit |
0 |
0 |
1 |
CK |
0 |
1 |
0 |
CK/8 |
0 |
1 |
1 |
CK/32 |
1 |
0 |
0 |
CK/64 |
1 |
0 |
1 |
CK/128 |
1 |
1 |
0 |
CK/256 |
1 |
1 |
1 |
CK/1024 |
Modul stop pune la dispozitie o functie de activare/dezactivare a T/C2. Modurile cu divizare a frecventei sunt scalate direct din ceasul CK al oscilatorului. Se observa de asemenea ca nu exista intrare de numarare a evenimentelor externe direct de pe pin, in schimb gama valorilor de prescalare este extinsa fata de celelalte moduri.
Functionarea asincrona a T/C2[1]
Acest oscilator este optimizat pentru a functiona cu un cristal de 32768Hz (de tip ceas electronic). Aplicarea unei frecvente externe pe pinul TOSC1 poate conduce la o functionare incorecta a T/C2. Frecventa ceasului sistem trebuie sa fie de cel putin 4 ori mai mare decat frecventa acestui oscilator.
Scrierea in TCNT2, OCR2 si TCCR2 se face prin intermediul unui registru tampon propriu, care este apoi trimis in registrul destinatie dupa doua fronturi crescatoare pe pinul TOSC1. O noua scriere se va face deci numai dupa verificarea bitilor de reactualizare din registrul ASSR.
La intrarea in moduri sleep din care ar trebui sa se iasa prin intermediul T/C2, trebuie de asemenea asteptat pana cand reactualizarea se face efectiv. In caz contrar este posibil ca iesirea din starea sleep sa nu se mai produca. Totodata trebuie tinut seama de intarzierile care apar pe pinul TOSC1, astfel ca reintrarea in modul sleep sa se faca dupa verificarea bitilor de reactualizare.
La iesirea din modurile sleep care opresc si oscilatorul asincron, reintrarea acestuia in regim normal poate sa dureze pana la o secunda.
Exista si alte precautii referitoare la T/C2, care trebuiesc luate la intrarea si iesirea din modurile sleep (vezi [3]).
Registrul de stare pentru modul asincron are urmatoarea configuratie:
Bit | ||||||||
AS2 |
TCN2UB |
OCR2UB |
TCR2UB |
|||||
Citeste/ scrie |
S |
C |
C |
C |
C/S |
C/S |
C/S |
C/S |
Valoare initiala |
Cand acest bit este 0, T/C2 este cuplat la ceasul sistemului, iar cand este 1 este cuplat la oscilatorul cu cristal conectat la pinul TOSC1. Cand acest bit este modificat, este posibil sa se altereze continutul registrelor TCNT2, OCR2 si TCCR2
Cand TCNT2 functioneaza asincron si se face o scriere in el, acest bit devine automat 1, iar cand TCNT2 s-a incarcat efectiv din registrul temporar, bitul TCN2UB revine automat la 0. El poate fi deci folosit pentru a verifica daca TCNT2 este pregatit pentru o noua scriere.
Cand TCNT2 functioneaza asincron si se face o scriere in OCR2, acest bit devine automat 1, iar cand OCR2 s-a incarcat efectiv din registrul temporar, bitul OCR2UB revine automat la 0. El poate fi deci folosit pentru a verifica daca OCR2 este pregatit pentru o noua scriere.
Cand TCNT2 functioneaza asincron si se face o scriere in TCCR2, acest bit devine automat 1, iar cand TCCR2 s-a incarcat efectiv din registrul temporar, bitul TCR2UB revine automat la 0. El poate fi deci folosit pentru a verifica daca TCCR2 este pregatit pentru o noua scriere.
Daca se face o scriere in oricare dintre cele trei registre ale T/C2 in timp ce flagul respectiv de ocupare este setat, valoarea noua poate fi alterata si poate apare de asemnea o intrerupere.
La citirea TCNT2 este citita chiar valoarea sa curenta, in timp ce la citirea OCR2 sau TCCR2 este citita valoarea din registrul tampon respectiv.
3. Registrul de masti de intrerupere pentru blocurile de tip Timer/Counter - TIMSK
Prin intermediul bitilor acestui registru se pot activa sau masca individual diversele intreruperi provenite de la blocurile de tip Timer/Counter.
TIMSK
Bit | ||||||||
OCIE2 |
TOIE2 |
TICIE1 |
OCIE1A |
OCIE1B |
TOIE1 |
TOIE0 |
||
Citeste/Scrie |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C |
C/S |
Valoare initiala |
|
Bitul 7 - OCIE2: Activarea intreruperii de egalitate la comparatie a T/C2.
Intreruperea de egalitate la comparatie a T/C2 este activata atunci cand amandoi bitii OCIE2 si I din registrul de stare, sunt setati in 1. Intreruperea corespunzatoare (la vector $003) este executata atunci cand in T/C2 apare o egalitate cu registrul de comparatie asociat acestui T/C. In acel moment, flagul de egalitate la comparatie a T/C2 este setat (unu) in TIFR.
Bitul 6 - TOIE2: Activarea intreruperii in caz de depasire la T/C2.
Intreruperea la depasire la T/C2 este activata atunci cand amandoi bitii TOIE2 si I din registrul de stare, sunt setati in 1. Intreruperea corespunzatoare (la vector $004) este executata atunci cand in T/C2 apare o depasire a capacitatii maxime (se trece de la $FF la $00). Flagul TOV2 de depasire a T/C2 este setat (unu) in TIFR.
Bitul 5 - TICIE1: Activarea intreruperii pe intrarea de captura a T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 4 OCIE1A: Activarea intreruperii de egalitate cu registrul de comparatie A al T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 3 OCIE1B: Activarea intreruperii de egalitate cu registrul de comparatie B al T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 2 - TOIE1: Activarea intreruperii de depasire a T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 1 - Res: Bit rezervat.
Acest bit este rezervat in AT90S8535 si este citit intotdeauna zero.
Bitul 0 - TOIE0: Activarea intreruperii in caz de depasire la T/C0.
Intreruperea la depasire la T/C0 este activata atunci cand amandoi bitii TOIE0 si I din registrul de stare, sunt setati in 1. Intreruperea corespunzatoare (la vector $009) este executata atunci cand in Timer/Counter0 apare o depasire a capacitatii maxime (se trece de la $FF la $00). Flagul de depasire TOV0 a T/C0 este setat (unu) in TIFR.
4. Registrul de flaguri ale intreruperilor de la Timer/Countere - TIFR.
Acest registru contine flagurile care se pozitioneaza individual in cazul diverselor intreruperi provenite de la blocurile de tip T/C. In general, acest registru este putin utilizat de programator, el fiind necesar in primul rand UCC a microcontrolerului. Totusi, el poate fi citit si scris atunci cand algoritmul programului face acest lucru nesesar.
TIFR
Bit | ||||||||
OCF2 |
TOV2 |
ICF1 |
OCF1A |
OCF1B |
TOV1 |
TOV0 |
||
Citeste/Scrie |
C/S |
C/S |
C/S |
C/S |
C/S |
C/S |
C |
C/S |
Valoare initiala |
Bitul 7 - OCF2: Flagul de egalitate la comparatie a T/C2.
Acest flag este setat atunci cand apare o egalitate la comparatie a T/C2 cu registrul de comparatie asociat acestui T/C. Bitul este sters automat de hardware atunci cand se executa intreruperea respectiva, sau poate fi sters prin software prin scrierea unui 1 peste el in TIFR. Daca amandoi bitii OCIE2 si I din registrul de stare sunt setati in 1, este executata intreruperea corespunzatoare (la vector $003).
Bitul 6 - TOV2: Flagul de depasire la T/C2.
Acest flag este setat atunci cand apare o depasire in T/C2. Bitul este sters automat de hardware atunci cand se executa intreruperea respectiva, sau poate fi sters prin software prin scrierea unui 1 peste el in TIFR. Daca amandoi bitii TOIE2 si I din registrul de stare sunt setati in 1, este executata intreruperea corespunzatoare (la vector $004).
In modul PWM bidirectional, acest bit este setat la trecerea prin $0000.
Bitul 5 - ICF1: Flagul de captura a T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 4 OCF1A: Flagul de egalitate cu registrul de comparatie A al T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 3 OCF1B: Flagul de egalitate cu registrul de comparatie B al T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 2 - TOIE1: Flagul de depasire a T/C1.
Acest bit va fi prezentat odata cu blocul Timer/Counter1.
Bitul 1 - Res: Bit rezervat.
Acest bit este rezervat in AT90S8535 si este citit intotdeauna zero.
Bitul 0 - TOV0: Flagul de depasire la T/C0.
Acest flag este setat atunci cand apare o depasire in T/C0. Bitul este sters automat de hardware atunci cand se executa intreruperea respectiva, sau poate fi sters prin software prin scrierea unui 1 peste el in TIFR. Daca amandoi bitii TOIE0 si I din registrul de stare sunt setati in 1, este executata intreruperea corespunzatoare (la vector $009).
In modul PWM bidirectional, acest bit este setat la trecerea prin $0000.
5. Modul de lucru:
Se va executa un program care sa afiseze in bucla principala continutul T/C0 (complementat pentru ca led aprins sa corespunda la 1 logic). Continutul T/C0 va fi incrementat prin semnal intern de la oscilator divizat cu valoarea maxima in prescaler. Se va putea observa numararea foarte rapida la bitii cei mai semnificativi. Un exemplu de realizare a programului este urmatorul:
;Declaratii
.INCLUDE '8535def.inc' ;adauga definitiile pentru AT90S8535 .
.equ Leds=PORTC
rjmp Reset
.org $11 ;Programul va incepe de la adresa 11 hexa ;deci dincolo de zona unde se afla vectorii ;de intrerupere
Reset:
;Secventa de initializare
;Initializare In-Out
ser r16 ;Seteaza bitii lui r16
out DDRC,r16 ;Directia portului C -iesire
clr r16 ;Sterge bitii lui r16
out DDRA,r16 ;Directia portului A - intrare
;initializare Timer0
ldi r16,$05 ;Factor divizare maxim la prescaller
out TCCR0,r16
;Bucla principala
Loop:
in r17,TCNT0
out leds,r17
rjmp
Se va modifica programul pentru a afisa un registru de uz general care sa fie incrementat la aparitia unei intreruperi de depasire de la T/C0.
Se va modifica programul pentru a afisa un registru de uz general care sa fie incrementat la tranzitia din 0 in 1 a bitului 4 al T/C0.
Sa se scrie un program care sa afiseze un registru general care sa fie incrementat la fiecare n impulsuri de ceas, folosind T/C2 si intreruperea de comparatie. Numarul n va fi introdus de la taste si va putea fi modificat in timpul functionarii.
Indicatie: Se va seta bitul CTC, care va readuce la 0 numaratorul cand se ajunge la valoarea din registrul de comparatie.
Sa se scrie un program care sa schimbe starea bitului OC2 la fiecare egalitate de comparatie a T/C2, cu resetarea numaratorului, si copiaza starea pinului PD7 in bitul 5 al portului D. Numarul din registrul de comparatie va fi introdus de la taste, va fi adunat cu o constanta initiala ($20 de exemplu) si va putea fi modificat in timpul functionarii. Se va observa modificarea frecventei impulsurilor de pe pinul PD5 (care este cuplat la beeper).
Copyright © 2024 - Toate drepturile rezervate