====== Układy czasowe ======
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.
====== Taktowanie ======
źródła, stabilność
====== Timer/Counter ======
===== Timer/Counter 0 =====
* Single Channel Counter
* Frequency Generator
* External Event Counter
* 10-bit Clock Prescaler
===== Timer/Counter 1 =====
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)
===== Timer/Counter 2 =====
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łady ======
===== Przykład 1 - migająca dioda raz jeszcze =====
===== Przykład 2 - kwarc zegarkowy =====
===== Przykład 3 - PWM sterowanie serwem =====
Przykład wykorzystuje układ TIMER1.
* Port D zostaje ustawiony jako wyjście (pin OC1A) :!:
* Tryb pracy timera zostaje ustawiony za pomocą rejestru TCCR1
* bit ''COM1A1'' zeruje pin OC1A kiedy timer jest na dnie (BOTTOM) i ustawia je kiedy wartość zliczana zostaje osiągnięta (Compare Match)
* bit ''WGM11'' razem z ''WGM12'' oraz ''WGM13'' ustawiają tryb pracy timera na FastPWM z:
* wierzchołkiem (TOP) w ICR1
* wartością zadaną (wypełnieniem) w OCR1A
* wartością dna (BOTTOM) równą 0
* bit ''CS10'' razem z ''CS11'' ustawiają prescaler na wartość $clk_{IO} /64$
* Częstotliwość pracy wyraża się wzorem ($N$-wartość preskalera; $f_{clk}$ - taktowanie układu):
$$ f_{OCR1PWM} = { {f_{clk} } \over {N \cdot (1+TOP)}}$$
* W danym przykładzie jest to typowa wartość dla serwa (przy 50 [Hz] okres T = 20 [ms]):
$$ f_{OCR1PWM} = { {16M} \over {64 \cdot (1+5000-1)} } = {50 [Hz]}$$
* W przykładzie po zainicjalizowaniu timiera w pętli cyklicznie wypełnienie jest zmieniane co sekundę.
**Podsumowując**:
* OCR - wypełnienie sygnału (:EN: duty cycle) PWM na wyjściu (OC1A)
* Wyjście jest w stanie wysokim dopóki timer nie osiągnie wartości OCR
* Wyjście jest resetowane do stanu wysokiego kiedy timer osiąga wartość maksymalną (ICR1), w tym samym czasie timer jest również resetowany do wartości minimalnej
==== Kompromis rozdzielczość-częstotliwość ====
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.
==== Kod ====
int main()
{
DDRD = 0xFF;
TCCR1A |= (1<