Mikrokontrolery AVR XMEGA w praktyce, część 12. Timer i przerwania

Aby zapoznać się z podstawami pracy timerów, napiszemy prosty program demonstrujący działanie timera TCC0 oraz jego rejestru PER i systemu przerwań. Po włączeniu zasilania, rejestr CNT timera TCC0 rozpocznie zliczanie w górę, aż do osiągnięcia wartości PER, która domyślnie jest ustawiona na 65535. Wartość tę można będzie zmienić przyciskiem FLIP, który jest na płytce X3-DIL64 z Leon Instruments. Aby było wiadomo, jakie aktualnie wartości są w rejestrach licznika CNT oraz PER, będziemy odczytywać je z wyświetlacza LCD (jak podłączyć wyświetlacz LCD z XMEGA opisałem w odcinku 5). Dodatkowo, każde zrównanie się rejestrów CNT oraz PER wywoływać będzie przerwanie przepełnienia OVF, co spowoduje zmianę stanu diody podłączonej do pinu E0.

Zbudujemy układ, którego schemat przedstawiono na rysunku 1, a jego realizację na płytce stykowej przedstawia rysunek 2.

 

Rys. 1. Schemat układu demonstrującego pracę timera

Rys. 1. Schemat układu demonstrującego pracę timera

 

Rys. 2. Zdjęcie układu zbudowanego na płytce stykowej

Rys. 2. Zdjęcie układu zbudowanego na płytce stykowej

 

Program zaczynamy, jak zwykle, od dołączenia potrzebnych bibliotek. Bibliotekę hd44780 można pobrać razem z kodami źródłowymi niniejszego odcinka kursu na dole strony.

Jako że nie będziemy używać żadnych funkcji ani zmiennych globalnych, od razu przechodzimy do pisania funkcji main(), w której na początku ustawimy wejście i wyjścia zgodnie z częścią 4 kursu o tym, jak ustawić piny IO w XMEGA oraz inicjalizujemy wyświetlacz LCD.

Najpierw powinniśmy skonfigurować wszystkie ustawienia, a dopiero na końcu uruchomić timer. Kolejność następujących poleceń nie ma znaczenia, byle wyboru preskalera dokonać na samym końcu.

Ustawimy kontroler przerwań PMIC. Jak działają przerwania w XMEGA opisałem w odcinku 6. Podobnie jak w każdym innym typie przerwania, możemy ustalić priorytet niski (LO), średni (MED) lub wysoki (HI). Pamiętaj, że po wybraniu priorytetu dla przerwania przepełniania OVF, musisz również uaktywnić przerwania o tym priorytecie, wpisując PMIC_xxLVLEN_bm do rejestru CTRL kontrolera przerwań PMIC.

Przejdźmy do skonfigurowania timera TCC0. W rejestrze CTRLB wybieramy normalny tryb pracy. Do rejestru CTRLF nie możemy wpisać danych wprost, jak do innych dotychczas używanych. Można wpisywać do niego wartości poprzez rejestry pomocnicze CTRLFSET oraz CTRLFCLR. Działa to podobnie jak maska bitowa przy ustawianiu portów, co robiliśmy na początku programu. Bity wpisane do rejestru SET zostaną wpisane do rejestru CTRLF, a jedynki wpisane do rejestru CLR zostaną w CTRLF wyzerowane. Dzięki takiemu rozwiązaniu nie musimy stosować operatorów |= ani &=. Przy pomocy bitu TC0_DIR_bm w rejestrze CTRLF decydujemy, czy timer ma liczyć w górę czy w dół. Ostatnim etapem konfiguracji timera jest wybranie źródła sygnału. Wybieramy sygnał zegarowy o częstotliwości wstępnie podzielonej przez 1024 przy pomocy stałej TC_CLKSEL_DIV1024_gc. Po tym poleceniu timer zostaje uruchomiony.

W pętli głównej program będzie wyświetlał bieżącą wartość przechowywaną w rejestrach CNT oraz PER. Dodatkowo, jeśli przycisk FLIP zostanie wciśnięty, to rejestr PER będzie zwiększał się o 1000.

Do opisania pozostała tylko procedura przerwania przepełnienia TCC0_OVF_vect. Składa się z zaledwie jednej linijki, która zamienia stan pinu E0. Jeśli przez zgłoszeniem dioda się świeciła, to zgaśnie, a jeśli była wygaszona, to się zaświeci.

Działanie programu przedstawia film.

Dystrybutorem zestawu X3-DIL64 jest KAMAMI.pl.

Dominik Leon Bieczyński

www.leon-instruments.pl

 

Do pobrania

O autorze