Programowanie mikrokontrolerów
mikrokontrolery24.pl
8bit Timer/Counter
Spis treści
Obsługa Timerów/Counterów zostanie przedstawiona w oparciu o mikrokontroler Atmega 8. W pozostałych wariantach mikroprocesorów AVR konfiguracja timerów/counterów jest analogiczna i opiera się o te same zasady postępowania. W przypadku znacznych rozbieżności pisane zostaną pozostałe warianty postępowania.
Pierwszym opisywanym a zarazem najprostrzym timerem/counterem zawartym w atmedze 8 jest 8 bitowy Timer0/Counter0. Aby skonfigurować i uruchomić Timer/Counter 0 musimy ustalić odpowiednie wartości czterech rejestrów 8 bitowych sterujących pracą Timera/Countera 0:
- TCCR0 (Timer/Counter Control Register) - rejestr odpowiedzialny za wybór źródła taktowania.
- TCNT0 (Timer/Counter Control Register) - rejestr przechowujący aktulną wartość Timera/Countera
- TIMSK (Timer/Counter Interrupt Mask Register) - rejestr odpowiedzialny za maskowanie przerwań
- TIFR (Timer/Counter Interrupt Flag Register) - rejestr przechowujący flagi dotyczące Timera/Countera
Opisywane nazwy rejestrów mogą różnić się nieznacznie nazwami w zależności od typu mikrokontrolera co może powodować będy w kompilacji !!! Aby zweryfikować prawidłowe nazwy rejestrów dla danego mikrokontrolera należy zweryfikować je z dokumentacją datasheet danego mikrokontrolera. Opisywany tu timer jest najprostrzym wariantem timera 8 bitowego bardziej skomplikowane timery z większą ilością funkcji będą miały nieznacznie zmienione nazwy rejestrów sterujących timerem.
2. Budowa timera / licznika w Atmega8
Układ licznikowo czasowy timer / counter 0 może spełniać dwie podstawowe funkcje. Jedną z nich jest zliczanie impulsów generowanych przez jakiś zewnętrzny układ w dowolnych momentach czasu z dowolną częstotliwością. Druga funkcją tego układu jest zliczanie czasu przez układ czasomierza zliczający impulsy w przychodzące do niego w ściśle określonych odstępach czasu, dzięki czemu po liczbie zliczonych przez niego impulsów jesteśmy w stanie określić ile czasu upłynęło od jego wystartowania do odczytania wartości. Dodatkową funkcją tego układu jest generowanie zaprogramowanych przez nas zdażeń przy określonych stanach czasomierza np wykorzystując generowane przerwania od przepełnienia się licznika lub czasomierza.
Na rysunku poniżej zamieszczony został schemat blokowy timera0.
Jak widać na powyższym rysunku timer/counter0 może być taktowany jednym z dwóch sygnałów taktujących:
- zewnętrznym podłączonym do odpowiedniej nóżki mikroprocesora
- wewnętrzynm generowanym przez układ taktujący procesor podawanym przez prescaler pozwalający na podział częstotliwości taktującej timer/counter.
Sygnał taktujący możemy wybrać przez odpowiednią konfigurację rejestrów. Mikroprocesor mikrokontroler możemy taktować sygnałem wenętrznym (jeśli mikroprocesor mikrokontroler posiada rezonator wewnętrzny), za pomocą rezonatora podpiętego do dwóch odpowiednich nóżek mikroprocesora mikrokontrolera, układem RC lub zewnetrznym sygnałem taktującym. Opcję wyboru odpowiedniego sygnału taktującego konfiguruje się za pomocą Fusebitów oraz ewnętrznym ch rejestrów mikroprocesora mikrokontrolera.
Na rysunku poniżej zamieszczony został schemat blokowy countera0.
Pierwszym z rejestrów jaki należy ustawić aby ożywić timer0 / counter0 jest rejestr TCCR0 odpowiedzialny za sygnał taktujący układ licznikowo czasowy, a konkretnie za ustawienie prescalera. Dzięki możliwości ustawienia prescalera mamy możliwość ustawienia naszego timera na bardzo szeroki zakres mierzonych czasów w zależności od potrzeb. Częstotliwość sygnału taktującego nasz timer / counter jest uzależniona od wartości częstotliwości taktującej nasz mikroprocesor mkrokontroler oraz od wartości dzielnika jaki ustawimy na prescalerze.
Na rysunku poniżej przedstawiono budowę prescalera.
Widzimy że w mikroprocesorze mikrokontrolerze ATmega8 mamy możliwość niezależnego konfigurowania wartości prescalera osobno dla każdego układu licznikowo czasowego (timera0 i timera1).
3. Konfiguracja rejestru TCCR0 (ATmega8) TCCR0A i TCCR0B (ATmega328p)
Dla ATmega8 i podobnych mikroprocesorów z prostym timerem / counterem 8 bitowym przedstawiony został rejestr TCCR0, natomiast dla bardziej rozbudowanych mikrokontrolerów mikroprocesorów rejestr ten przystosowany jest również do obsługi sygnału PWM i podzielony został na dwa rejestry TCCR0A i TCCR0B (ATmega328p). Bity w tych rejestrach pełnią te same funkcje zarówno dla TCCR0 jak i podzielonego na TCCR0A i TCCR0B z tą różnicą że w podzielonym na dwie części rejestrze występują dodatkowe bity konfiguracyjne dla sygnały PWM opisane poniżej.
Budowa rejestru TCCR0 odpowiedzialnego za prescaler przedstawiona została poniżej
Budowa podzielonego rejestry dla mikroprocesorów z sygnałem PWM (ATmega328p) przedstawiona została poniżej
Budowa rejestru TCCR0A
Budowa rejestru TCCR0B
Poniżej opisane zostaną bity konfiguracyjne znajdujące się w powyższych rejestrach pełniące te same funkcje dla całej rodziny mikrokontrolerów z tą różnicą że rozmieszczone są one w różnych rejestrach w zależności od wykonania mikrokontrolera mikroprocesora.
Bity CS00:02 - Aby ustawić wartość prescalera na przez nas wybraną mamy do dyspozycji 3 najmłodsze bity rejestru TCCR0 co daje nam możliwość wyboru jednego z 8 trybów pracy prescalera. Poszczególne tryby pracy prescalera przedstawia tabela poniżej.
W powyższej tabeli przedstawiono 8 trybów pracy prescalera. Do wyboru mamy takie funkcje jak:
- Wariant dla wartości bitów CS02="0" CS01="0" CS00="0". Wyłączenie sygnału taktującego timer / counter. Równoznaczne z zatrzymaniem się licznika timera countera. Funkcja ta poowduje odcięcie sygnału taktującego od układu czasowo licznikowego dzięki temu możemy w prosty sposób zatrzymać nasz timer / counter
- Wariant dla wartości bitów CS02="0" CS01="0" CS00="1". Podanie sygnał taktujący bez przeskalowywania bezpośrednio na timer / counter z układu taktującego mikroprocesor mikrokontroler. Układ czasowo licznikowy taktowany będzie taką samą częstotliwością która taktuje mikroprocesor mikrokontroler. Najczęśćiej jest to częstotliwość podłaczonego zewnętrznego rezonator kwarcowego.
- Wariant dla wartości bitów CS02="0" CS01="1" CS00="0". Podanie sygnału taktującego układ licznikowo czasowy przez dzielnik częstotliwości przez 8. Układ timer / counter taktowany będzie częstotliwością taktującą mikroprocesor mikrokontroler podzieloną przez 8. ( 8 razy mniejszą )
- Wariant dla wartości bitów CS02="0" CS01="1" CS00="1". Podanie sygnału taktującego układ licznikowo czasowy przez dzielnik częstotliwości przez 64. Układ timer / counter taktowany będzie częstotliwością taktującą mikroprocesor mikrokontroler podzieloną przez 64. ( 64 razy mniejszą )
- Wariant dla wartości bitów CS02="1" CS01="0" CS00="0". Podanie sygnału taktującego układ licznikowo czasowy przez dzielnik częstotliwości przez 256. Układ timer / counter taktowany będzie częstotliwością taktującą mikroprocesor mikrokontroler podzieloną przez 256. ( 256 razy mniejszą )
- Wariant dla wartości bitów CS02="1" CS01="0" CS00="1". Podanie sygnału taktującego układ licznikowo czasowy przez dzielnik częstotliwości przez 1024. Układ timer / counter taktowany będzie częstotliwością taktującą mikroprocesor mikrokontroler podzieloną przez 1024. ( 1024 razy mniejszą )
- Wariant dla wartości bitów CS02="1" CS01="1" CS00="0". Sygnał taktujący układ licznikowo czasowy pobierany jest ze źródła zewnętrznego podpiętego do odpowiedniej nóżki mikroprocesora mikrokontrolera. W tym wariancie wejście taktujace czułe jest na opadające zbocze sygnału taktującego tzn. że sygnał zegarowy zostanie wygenerowany w momencie gdy na nóżce mikroprocesora mikrokontrolera pojawi się opadające zbocze sygnału taktującego.
- Wariant dla wartości bitów CS02="1" CS01="1" CS00="1". Sygnał taktujący układ licznikowo czasowy pobierany jest ze źródła zewnętrznego podpiętego do odpowiedniej nóżki mikroprocesora mikrokontrolera. W tym wariancie wejście taktujace czułe jest na narastające zbocze sygnału taktującego tzn. że sygnał zegarowy zostanie wygenerowany w momencie gdy na nóżce mikroprocesora mikrokontrolera pojawi się narastajace zbocze sygnału taktującego.
Bity COM0B0:1, COM0A0:1, FOC0A, FOC0B, WGM00:02 - odpowiedzialne są za pracę timera w trybie PWM i opisane zostaną w dziale o PWM (Mikroprocesory -> PWM)
Na rysunku poniżej przedstawiono budowę rejestru TCNT0 odpowiedzialnego za przechowywanie aktualnego stanu zliczonych impulsów układu licznikowo czasowego.
Dzięki rejestrowi TCNT0 mamy możliwość zczytania aktualnego stanu zliczonych impulsów licznika lub ilości czasu jaki upłyną odmierzanego przez timer. zawiera on 8 bitową liczbę zliczonych impulsów. Jeśli liczba zliczanych impulsów przepełni pojeność licznika wówczas zeruje on się i zaczyna liczyć od początku w przypadku zliczania w górę w przypadku zliczania w dół opróżnienie sie licznika powoduje w następnym kroku ustawienie go na wartość maksymalną i dalsze zliczanie w dół.
5. Konfiguracja rejestru TIMSK (ATmega8) i TIMSK0 (ATmega328p)
Na rysunku poniżej przedstawiono budowę rejestru TIMSK odpowiedzialnego za maskowanie przerwań.
Budowa rejestru TIMSK
Budowa rejestru TIMSK0
W rejestrze TIMSK najmłodszy bit odpowiada za maskowanie przerwania od przepełnienia się timera contera 0. Jeśli chcemy aby przy przepełnieniu się timera countera generowane było jakieś zdażenie musimy w rejestrze TIMSK odblokować pozwolenie na generowanie przez mikroprocesor mikrokontroler przerwania. Aby odblokować przerwanie od przepełnienia się timera countera należy ustawić bit TOIE0 w rejestrze TIMSK na jedynkę "1" oraz pamiętać o tym że aby były generowane przerwania musimy odblokować równierz zezwolenie ogólne na przerwania w mikroprocesorze mikrokontrolerze.
Bit OCIE0A, OCIE0B - odpowiedzialne są za pracę timera w trybie PWM i opisane zostaną w dziale o PWM (Mikroprocesory -> PWM)
6. Konfiguracja rejestru TIFR (ATmega8) i TIFR0 (ATmega328p)
Na rysunku poniżej przedstawiono budowę rejestru TIFR dla Atmega8 i rejestru TIFR0 dla ATMEGA328p. Rejestr ten odpowiada za przechowywane flag przerwań mikroprocesora mikrokontrolera.
Budowa rejestru TIFR
Budowa rejestru TIFR0
Bit TOV0 - W rejestrze TIFR najmłodszy bit TOV0 odpowiada za flagę przerwania wywołanego przepełnieniem się rejestru timera countera. Flaga ta przyjmuje wartość jeden "1" w momencie przepełnienia się rejestru timera, gdy generowane jest przerwanie od przepełnienia się rejestru timera countera mikroprocesora mikrokontrolera. Wartość tej flagi utrzymuje się na poziomie jeden "1" aż do chwili wykonania się całego wektora przerwania i w momencie zakończenia obsługi przerwania i wyjścia z niego flaga ta sprzętowo (automatycznie) jest zerowana "0".
Bity OCF0B, OCF0A - odpowiedzialne są za pracę timera w trybie PWM i opisane zostaną w dziale o PWM (Mikroprocesory -> PWM)
wtorek 09-lip-24 19:45:49 CEST
09-lip-2024 19:45:49 CEST
© mikroprocesory.info.pl@gmail.com 2013.