Układy czasowe / liczniki (timers/counters) Współpraca MK z otoczeniem w czasie rzeczywistym wymaga odliczania czasu, zliczania zdarzeń lub generowania złożonych sekwencji binarnych. Funkcje te realizowane są z dokładnością oscylatora kwarcowego MK przez specjalizowane bloki nazywane licznikami (counters) lub układami czasowymi (timers). ATmega16 ma dwa liczniki 8-bitowe i jeden licznik 16-bitowy. Najprostsza struktura obejmuje rejestr przesuwny o określonej długości oraz rejestr pomocniczy zawierający np. bity przepełnienia, ustawiające tryb pracy, bit startu zliczania licznika itd. Rejestr przesuwny zliczający liczbę zmian poziomów doprowadzonych do niego sygnałów jest dostępny z poziomu programu użytkownika poprzez adres pamięci danych. Podstawowe konfiguracje pracy: właściwy układ czasowy (timer) taktowanie wewnętrznym sygnałem zegarowym rozprowadzanym przez układ dystrybucji sygnałów zegarowych. Timery wykorzystywane są w programie użytkownika jako wzorce czasu. W celu generowania wzorców czasu o różnej długości wewnętrzny sygnał zegarowy, przed doprowadzeniem do układu czasowego, przechodzi przez programowalny dzielnik częstotliwości (tzw. preskaler) licznik (counter) taktowanie zewnętrznymi sygnałami doprowadzanymi poprzez linie wejściowe portów i wykorzystywane w programie użytkownika np. jako liczniki zmian poziomów sygnałów zewnętrznych. Liczniki mogą zliczać impulsy w górę, tzn. inkrementować lub w dół czyli dekrementować. W praktyce MK są wyposażone w bardziej rozbudowane układy licznikowe.
Funkcje liczników: określenia (mierzenia) odstępów czasu między zdarzeniami zachodzącymi na zewnątrz MK, sygnalizowanymi przez impulsy elektryczne doprowadzone do pinów MK. Funkcja ta bywa nazywana rejestracją zdarzeń (input event capture), generowania impulsów (sekwencji impulsów) w odstępach czasu o zaprogramowanej wartości (output compare) i o zaprogramowanej długości trwania, generowania sygnałów okresowych o określonej częstotliwości i zadanym współczynniku wypełnienia (PWM puls width modulation), sterowania szybkością transmisji w portach szeregowych, zarówno w trybie synchronicznym, jak i asynchronicznym (baut rate generator), realizacja zadań licznika nadzorcy watchdoga. Rejestrator zdarzeń Jego zadaniem jest określenie czasu wystąpienia zdarzenia zewnętrznego sygnalizowanego przez impuls elektryczny podany na wejście. Czas ten jest mierzony w sposób względny, tzn. w stosunku do chwili zezwolenia na rozpoczęcie zliczenia w n-bitowym liczniku sterowanym impulsami zegara wewnętrznego. Przed uruchomieniem zliczania program zeruje licznik i określa zbocze sygnału zewnętrznego, które ma spowodować rejestrację zdarzenia. Po wystąpieniu tego zbocza zawartość licznika jest przepisywana do rejestru zatrzaskowego rejestratora. Układ może równocześnie wygenerować przerwanie informujące JC o zarejestrowaniu zdarzenia, jeśli wcześniej ustawiono zezwolenie przerwania. W tym układzie odczyt rejestru zatrzaskowego musi nastąpić przed wystąpieniem kolejnego zdarzenia, ponieważ pracujący cały czas licznik przy następnym sygnale zewnętrznym zmieni zawartość rejestru zatrzaskowego. Rejestrując czas wystąpienia kolejnych zboczy można łatwo określić: częstotliwość sygnału okresowego lub szerokość impulsów. W pierwszym przypadku rejestruje się dwa następujące po sobie zbocza o tej samej polaryzacji, natomiast w drugim dwa zbocza o różnej polaryzacji. Szczególne zastosowanie tej konfiguracji polega na generowaniu impulsów o programowalnym czasie opóźnienia w stosunku do zewnętrznych impulsów odniesienia. W tym przypadku układ pracuje w mieszanym trybie rejestrator generator. Po zarejestrowaniu zdarzenia licznik odmierza zaprogramowaną liczbę impulsów i generuje sygnał wyjściowy.
Programowany generator impulsów JC wpisuje do rejestru komparatora liczbę określającą chwilę wygenerowania impulsu, po czym uruchamia licznik. Po upływie zaprogramowanej liczby cykli zegara, komparator wykrywa zrównanie się zawartości licznika i rejestru, po czym generuje sygnał wyjściowy. Jednocześnie licznik może wysyłać do JC przerwanie, o ile zostało odblokowane. Większość liczników/generatorów wytwarza impulsy o zadanej polaryzacji. Ponadto po wygenerowaniu impulsu przez układ licznika JC może zlecić nowy cykl generacji z innym początkowym ustawieniem rejestru komparatora. W ten sposób MK jest w stanie generować przebieg o dowolnie ustalanych czasach trwania kolejnych impulsów. Wadą przedstawionej prostej konfiguracji generatora jest to, że przy generacji kolejnych impulsów powstaje błąd wynikający z czasu działania JC (zwykle dwa okresy sygnału zegarowego), ponieważ JC musi po każdej operacji wpisywać nową zawartość do rejestru komparatora, po czym uruchomić licznik. W celu wyeliminowania tej wady stosuje się ulepszone układy liczników z podwójnymi rejestrami i komparatorami, nazywane licznikami z buforowaniem (buffered output compares). W tych układach aktualnie zaprogramowana wartość opóźnienia jest przechowywana w rejestrze jednego z kanałów, natomiast wartość kolejnego opóźnienia w rejestrze drugiego kanału. Blok licznika autonomicznie steruje układem selekcji kanału. W najprostszym przypadku kanały pracują naprzemiennie. Należy pamiętać aby nie wpisywać danych do rejestru aktualnie pracującego kanału.
PWM W konfiguracji PWM licznik pracuje jako generator fali prostokątnej o programowanym współczynniku wypełnienia. Zasada jego pracy jest następująca. Jeśli zawartość licznika osiągnie zaprogramowaną liczbę N określającą okres impulsów, komparator ustawia przerzutnik wyjściowy. Sygnał przepełnienia licznika określa zatem początek okresu generowanego przebiegu. W czasie zliczania kolejnych impulsów zegara zawartość licznika jest porównywana z zawartością rejestru szerokości impulsów, a po zrównaniu się z nią generowany jest sygnał =, który zeruje przerzutnik wyjściowy. Tym samym impuls wytwarzany przez PWM kończy się. Rozdzielczość wyjściowa układu PWM jest określona przez częstotliwość sygnału zegara i długość słowa licznika N. Rejestr sterujący PWM zawiera dodatkowo wydzielone bity, które pozwalają na wyjściu uzyskać sygnał stały na poziomie 0 lub 1.
Licznik T0 Główne właściwości oraz możliwości zastosowań licznika 0: Licznik jednokanałowy. Automatyczne kasowanie i restart timera w trybie porównania. Generator częstotliwości. Generator przebiegu PWM. Licznik zdarzeń zewnętrznych. 10-bitowy programowalny preskaler. Źródło przerwań (przepełnienie, zrównanie). Licznik T0 obsługują 3 rejestry (8-bitowe): 1. TCNT0 rejestr, w którym dokonuje się zliczanie. 2. TCCR0 rejestr konfiguracyjny tryb pracy, źródło impulsów wejściowych, tryb pracy wyjścia OC0. 3. OCR0 rejestr porównujący Schemat blokowy licznika T0
Schemat blokowy preskalera
Tryb normalny W trybie zerowym licznik zlicza w górę. W momencie przejścia z 255 na 0 (11111111->00000000) układ kontroli ustawia bit TOV0 w rejestrze flag przerwań liczników TIFR zgłaszający przepełnienie licznika T0. Jeżeli było zezwolenie na przerwanie od T0 (bit TOIE0 w rejestrze maskowania przerwań liczników TIMSK), mikrokontroler generuje przerwanie, w którym można ustawić wartość początkową licznika TCNT0. Tryb CTC Generator przebiegu prostokątnego o zmiennej częstotliwości i stałym współczynniku wypełnienia 50%. Gdy stan licznika TCNT0 zrówna się z OCR0 licznik (TCNT0) zostaje wyzerowany i może być generowane przerwanie (tim0_comp). Wyjście licznika OC0 to końcówka PB3. Konfiguracja w TCCR0
Szybki PWM PWM generator sygnału o stałej częstotliwość i zmiennym współczynniku wypełnienia
PWM z korekcją fazy
Licznik T2 Licznik T2 jest identyczny z licznikiem T0 z małymi wyjątkami... T2 nie może zliczać impulsów zewnętrznych Rejestry: Tryb asynchroniczny T2 UB=1 oznacza, że dany rejestr jest zajęty (update busy)
Przykłady konfiguracji licznika T0 ldi r16, 0b00000101 ; tryb normal, /1024 out tccr0, r16 in r16, timsk ori r16, 0b00000001 ; włącz przerwania od przepełnienia T0 out timsk, r16 sei tim0_ovf: push r16 ; zapamiętaj r16 na stosie in r16, sreg push r16 ; zapamiętaj SREG na stosie ldi r16, 256-125 out tcnt0, r16 ;tu wpisujemy nasz program obsługi przerwania pop r16 out sreg,r16 pop r16 reti ldi r16, 0b01101100 ; tryb Fast PWM, /256 out tccr0, r16 ldi r16, 128 out ocr0, r16 sbi portb, 3 ;sei ldi r16,0b00011100 ; tryb CTC, /256 out tccr0,r16 ldi r16,128 out ocr0,r16 sbi portb,3 ;sei
Timer 1 Główne właściwości oraz możliwości zastosowań licznika 1: Prawdziwa 16-bitowa konstrukcja (możliwy np. 16-bitowy PWM). Niezależne dwie jednostki Output Compare. Jednostka Input Capture (rejestracja zdarzeń) z układem redukcji szumów. Automatyczne kasowanie i restart timera w trybie porównywania. Generator częstotliwości. Generator przebiegów PWM (w tym z korekcją fazy i częstotliwości) Licznik zdarzeń zewnętrznych. 10-bitowy programowalny preskaler. 4 niezależne źródła przerwań. Schemat blokowy licznika T1
Bloki funkcjonalne licznika Timer/Counter1: Programowalny preskaler, który zapewnia podział wewnętrznego sygnału zegarowego przez 8, 64, 256 lub 1024 oraz synchronizuje zewnętrzny sygnał podawany na wejście T1 z wewnętrznym sygnałem zegarowym JC Blok licznika składający się z bloku sterującego, 16-bitowego rejestru TCNT1 oraz stowarzyszonej z nim flagi przepełnienia TOV1 umożliwiającej generację przerwania. Blok rejestratora zdarzeń (Input Capture Unit) składający się z toru zbudowanego z pinu ICP1, multipleksera wybierającego źródło sygnału przechwytywanego, układu redukcji szumów (Noise Canceler), układu wyboru aktywnego zbocza (Edge Detect), które spowoduje zapisanie bieżącej wartości licznika TCNT1 do 16-bitowego rejestru ICR1 i ustawienie flagi przerwania ICF1. Blok Output Compare składający się z dwóch torów A i B. W skład każdego toru wchodzi 16-bitowy rejestr OCR1A/B wraz z komparatorem porównującym zawartość tego rejestru z zawartością licznika, układ generacji sygnału wyjściowego (Waveform Generation) i flaga przerwania OC1A/B oraz pin wyjściowy OC1A/B. Dwa rejestry konfiguracyjne TCCR1A i TCCR1B, rejestr masek czterech przerwań licznika TIMSK oraz rejestr przerwań TIFR. Wyprowadzenia T1 dla PDIP 40
Rejestry 16 bitowe UWAGA Wpisując dane do rejestru 16-bitowego, najpierw zapisujemy bajt starszy, a potem młodszy: ldi r16, high(1000) ;$03 out tcnt1h, r16 ldi r16, low(1000) ;$E8 out tcnt1l, r16 Przy odczycie, najpierw odczytujemy młodszy, a potem starszy bajt rejestru. in in r16, tcnt1l r17, tcnt1h
Tryby pracy 16-bitowy counter/timer sterowany bitami CS10-CS12 rejestru TCCR1B. Przy pomocy tych bitów wybiera się tryb czasomierza (timer) z odpowiednio ustawionym preskalerem lub licznika (counter) z możliwością wyboru aktywnego zbocza. Do zliczania służy para rejestrów TCNT1H i TCNT1L stanowiąca 16-bitowy licznik TCNT1. W zależności od wybranego trybu pracy zawartość licznika może być zerowana, inkrementowana lub dekrementowana przez impuls zegarowy. Flaga przepełnienia TOV1 może być ustawiona, gdy licznik osiągnie maksymalną lub minimalną wartość (zero). Tryb rejestratora zdarzeń (Input Capture). W tym trybie zmiana poziomu napięcia (zdarzenie) na pinie wejściowym ICP1 lub na wyjściu ACO komparatora analogowego, jeżeli jest zgodna ze zmianą wykrywaną (ustawioną jako aktywna) przez Edge Detector, powoduje przepisanie aktualnej wartości licznika TCNT1 do 16-bitowego rejestru ICR1 i ustawienie flagi ICF1, i jeśli maska przerwania TICIE1 jest ustawiona generację przerwania. Układ Noise Canceler służy do redukcji zakłóceń pojawiających się na jego wejściu. Gdy jest aktywowany, sygnał wejściowy jest opóźniony o cztery impulsy zegarowe zegara systemowego.
Tryb Output Compare. 16-bitowy komparator cały czas porównuje zawartość pracującego licznika TCNT1 z wpisaną wartością do 16-bitowego rejestru OCR1A/B. Jeżeli wartości w TCNT1 i w OCR1A/B zrównają się to 16-bitowy komparator sygnalizuje warunek zrównania się (generuje sygnał match ). Flaga przerwania OCF1A/B ustawiana jest w następnym cyklu zegarowym licznika, i jeśli ustawiona jest maska OCIE1A/B, jest generowane przerwanie. Układ Waveform Generator korzysta z sygnału match do generacji przebiegów na wyjściu OC1A/B. Tryb generacji przebiegów na wyjściu OC1A/B zależy od ustawienia bitów WGM13:0 i COM1A/B1:0. Za pomocą wymienionych bitów można wybrać następujące tryby pracy licznika: Compare Output Mode and Waveform Generation. Normal Mode. Clear Timer on Compare Match (CTC) Mode. Fast PWM Mode. Phase Correct PWM Mode. Phase and Frequency Correct PWM Mode.