Układy te są elementem praktycznie każdego mikrokontrolera i jak sama nazwa wskazuje ich działanie związane jest z upływem czasu. Układy czasowe są jednym z najbardziej rozbudowanych peryferiów układu atmega8, co więcej układ ten zawiera 3 takie układy różniące się pewnymi właściwościami
TODO
Nazwa | Długość w [bitach] | Źródło taktowania |
---|---|---|
Timer/Counter 0 | 8 | Preskaler / Zewnętrzne |
Timer/Counter 1 | 16 | Preskaler / Zewnętrzne |
Timer/Counter 2 | 8 | Preskaler / Zewnętrzne |
Układ czasowy to w uproszczeniu rejestr zwiększający lub zmniejszający swoją wartość pod wpływem dostarczonego sygnału taktującego. Układ taki pracuje niezależnie od rdzenia mikrokontrolera i często potrafi generować sygnały lub przerwania.
źródła, stabilność
True 16-bit Design (i.e., allows 16-bit PWM) • Two Independent Output Compare Units • Double Buffered Output Compare Registers • One Input Capture Unit • Input Capture Noise Canceler • Clear Timer on Compare Match (Auto Reload) • Glitch-free, Phase Correct Pulse Width Modulator (PWM) • Variable PWM Period • Frequency Generator • External Event Counter • Four Independent Interrupt Sources (TOV1, OCF1A, OCF1B, and ICF1)
Single Channel Counter • Clear Timer on Compare Match (Auto Reload) • Glitch-free, phase Correct Pulse Width Modulator (PWM) • Frequency Generator • 10-bit Clock Prescaler • Overflow and Compare Match Interrupt Sources (TOV2 and OCF2) • Allows Clocking from External 32 kHz Watch Crystal Independent of the I/O Clock
Przykład wykorzystuje układ TIMER1.
COM1A1
zeruje pin OC1A kiedy timer jest na dnie (BOTTOM) i ustawia je kiedy wartość zliczana zostaje osiągnięta (Compare Match)WGM11
razem z WGM12
oraz WGM13
ustawiają tryb pracy timera na FastPWM z:CS10
razem z CS11
ustawiają prescaler na wartość $clk_{IO} /64$$$ f_{OCR1PWM} = { {f_{clk} } \over {N \cdot (1+TOP)}}$$
$$ f_{OCR1PWM} = { {16M} \over {64 \cdot (1+5000-1)} } = {50 [Hz]}$$
Podsumowując:
</svgimage>
Zwiększanie częstotliwości pracy ogranicza rozdzielczość! Rozdzielczość można wyrazić wzorem: $$ R_{FPWM} = { {log(TOP+1)} \over {log(2)} }$$ W tym przykładzie będzie to: $$ R_{FPWM} = { {log( (5000-1) +1)} \over {log(2)} } \approx 12 [bit]$$
Zgadza się bo maksymalna wartość to 4999 (5000-1). $2^{12} = 4096$ ($2^{13} = 8192$)
Najmniejsza rozdzielność to 2 bity, natomiast największa to 16 bitów.
int main() { DDRD = 0xFF; TCCR1A |= (1<<COM1A1) | (1<< WGM11) ; // Set up timer/mode TCCR1B |= (1<< CS10) | (1<<CS11) | (1<<WGM13) | (1<<WGM12); ICR1 = 5000-1;// Uwaga! Dla kwarcu 16MHz forever { OCR1A = 500; _delay_ms(1000); OCR1A = 300; _delay_ms(1000); } }