====== 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 image/svg+xml OCR ICR1 0 TCNT1 - licznik timera1 OC1A T = 20 [ms] 80% 55% Compare Match ==== 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<