Programowanie mikrokontrolerów
8bit Timer/CounterSpis 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:
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:
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:
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) Tuesday 09-Mar-21 13:59:57 CET 09-Mar-2021 13:59:57 CET by Pioter
|
© mikroprocesory.info.pl@gmail.com 2013.