avr Curs
Modul temporizator următor T0 - un mod CTC (Clear Timer Compara), sau „la resetarea coincidență“. Cronometrul în acest mod este după cum urmează.
Când inițializarea cronometrul clar am contorul de înregistrare TCNT0, iar în comparație înregistra numărul de încărcare OCR0. Apoi, setați modul STS dorit și prescaler.
Cronometrul începe. La fiecare impuls de ceas registru contor este incrementat cu unu. Atunci când valoarea contorului registru se potrivește cu registrul de comparație, setați OCF0 contor de pavilion registru este resetat, iar numărul continuă de la zero. Dacă întreruperea activat coincidență, după setarea steagul OCF0 începe procesarea de rutină. Cu registrul comparație, în același timp nu se întâmplă nimic, nu se va schimba valoarea sa. Graficul de mai jos explică temporizatorul T0 de lucru în modul CTC.

Un exemplu practic. Este necesar să se genereze un val pătrat cu o frecvență de 70 kHz la pinul PB1. Microcontroler ATMEGA16, frecvența de ceas este de 16 MHz.
Cel mai simplu mod de a genera un val pătrat, este de a inversa starea de ieșire a microcontrolerului pentru a întrerupe cronometrul.
Meandru își schimbă starea de două ori în perioada. Primele comutatoare 1, apoi resetat la 0. Prin urmare, pentru a genera un semnal cu o frecvență de 70 kHz, este necesar de a provoca o întrerupere de două ori mai mult, adică, cu o frecvență de 140 kHz.
Se calculează perioada de întrerupere necesară.
T = 1 / F = 1/140000 = 7.143 ms
Care este frecvența de ceas la contorul de timp, astfel încât să poată măsura un interval de 7.143 microsecunde? Dacă un temporizator de ceas a fost
0,1 microsecunde, s-ar potrivi. 71 ceas da 7.1 microsecunde.
Am ales prescaler. Avem cinci opțiuni 1, 8, 64, 256, 1024. La 1 vom obține un semnal de ceas, cu o perioadă de 0,0625 ms.
TT0 = 1 / (Fcpu / k) = 1 / (16000000/1) = 0,0625 ms
Cu o astfel de perioadă de formare intervalul 7.143 ms avem nevoie de 7,143 / 0,0625 = 114 cicluri. Prin urmare, un raport adecvat. Și precizia este bun și biți contra registru lipsă.
114 - o serie de măsuri care ar trebui să conteze temporizatorul T0. În comparație, aceeași nevoie de a înregistra pentru a descărca o măsură este mai mică, adică 113. Cont după ce începe cu un ciclu de zero.
După cum puteți vedea, pentru modul CTC pentru a calcula valoarea registrului de comparație este chiar mai ușor decât modul normal:
-calculează perioada unui ciclu de timer TT0 = k / Fcpu,
- se calculează numărul necesar de cicluri de ceas pentru un interval predeterminat, n = t / Tto - 1
Pentru a evalua precizia semnalului recepționat, este posibil să se facă procedura inversă.
F = 1 / ((OCR0 + 1) * TT0) = 1 / ((OCR0 + 1) * (1 / (Fcpu / k)) = Fcpu / ((OCR0 + 1) * k)
F = 16000000/114 = 140351 Hz
Toate codul pentru problema noastră va arăta. (Codul este dat pentru IAR`a. Pentru alte compilatoare trebuie să modifice fișierele antet și întrerupe handler.)
OC0 terminal este gestionat în modul STS, la fel ca și în modul normal. Concluzie OC0 schimbă starea coincidenței valorilor contorului și comparați înregistrați. Opțiuni de control sunt stabilite biții COM01 și COM00 TCCR0 registru.

Luarea în considerare a programului de mai sus poate fi modificat pentru a genera un val pătrat la pinul OC0. În acest caz, o întrerupere nu poate fi utilizat.
Prin resetat automat contorului de la STS timer mod precis intervale de timp măsurate. Singura problemă - în unele microcontrolere, cronometre, contoare T0 nu au un astfel de regim.
