Mikrokontrolery AVR XMEGA w praktyce, część 11. Wstęp do timerów
Długo zastanawiałem się, w jaki sposób i jakie tematy poruszyć w artykułach o licznikach. W ATmega liczniki były bardzo rozbudowane i dosyć mocno zagmatwane. W XMEGA bałagan w rejestrach, znany z klasycznych AVR-ów, został uporządkowany, lecz dołożono szereg różnych możliwości, które mogą przytłoczyć niedoświadczonego programistę. W dodatku, liczniki mogą współpracować z systemem zdarzeń, który sam w sobie udostępnia wiele ciekawych możliwości.
W mikrokontrolerach XMEGA timery są ściśle powiązane z portami. Spójrzmy na schemat procesora ATxmega128A3U, przedstawiony na rysunku 1. Timery oznaczone są skrótem TC od Timer/Counter. W portach C, D, E dostępne są dwa timery o numerach 0 i 1, a w porcie F mamy tylko jeden timer o numerze 0. Numer oznacza typ timera. Aby skonfigurować te timery, musimy odwoływać się do nich używając ich nazw, które są następujące: TCC0, TCC1, TCD0, TCD1, TCE0, TCE1, TCF0. Przyporządkowanie portom oznacza, że wejścia i wyjścia timera, takie jak PWM czy przechwytywanie, dostępne są na określonych pinach portu, który posiada dany timer.
Rys. 1. Schemat procesora z wyszczególnionymi peryferiami
Wszystkie timery typu 0 i 1 w mikrokontrolerach XMEGA są 16-bitowe, a więc mogą liczyć od 0 do 65535. Korzystając z systemu zdarzeń (który będzie opisany w późniejszych odcinkach) możemy timery łączyć ze sobą, co pozwala uzyskać timer od długości nawet 112 bitów. W nowszych modelach XMEGA z rodziny AU możemy timery 16-bitowe podzielić na dwa niezależne timery 8-bitowe, które nazywamy timerami typu 2. W ten sposób z 7 timerów możemy uzyskać aż 14 timerów w jednym procesorze (a cały czas omawiamy ATxmega128A3U, modele A1U mają jeszcze więcej peryferiów).
Warto wiedzieć, że każdy timer może liczyć w górę lub w dół, w zależności od naszych potrzeb, a zmianę kierunku liczenia wywołuje się ustawiając odpowiedni bit w rejestrze konfiguracyjnym.
Timery mają szereg rejestrów i zanim zaczniemy pisać programy, poznajmy najważniejsze z nich:
- CNT – jest to rejestr przechowujący aktualną wartość timera, która zwiększa się lub zmniejsza z każdym taktem sygnału sterującego timer (od counter).
- PER – rejestr PER (od period) wyznacza maksymalną wartość, którą timer może osiągnąć. Zatem, jeśli PER=10, to timer będzie liczył od 0 do 10, a więc przepełnienie będzie następować co 11 cykli. Po włączeniu zasilania, PER jest ustawiany na wartość 65535. W przypadku, kiedy timer liczy w dół, rejestr PER określa wartość początkową od której timer liczy do zera.
- CCx – rejestry te są wykorzystywane do funkcji Compare/Capture czyli porównania i przechwytywania. Porównywanie wykorzystuje się do generowania sygnałów PWM. Rejestr CNT jest bezustannie porównywany z CCx, a w zależności od tego który z tych rejestrów ma większą wartość, ustalany jest stan logiczny odpowiedniego pinu OCx (zobacz kolumny TCC0 i TCC1 w tabeli na rysunku 2). Przechwycenie polega na zapisaniu wartości rejestru CNT do CCx w chwili wystąpienia określonego zbocza sygnału na wybranej nóżce procesora. Warto zaznaczyć, że XMEGA nie mają dedykowanych do tego celu wejść ICP, tak jak ATmega, lecz możemy wybrać dowolny pin procesora poprzez system zdarzeń. Timery typu 0 mają cztery kanały porównania/przechwycenia o nazwach CCA, CCB, CCC, CCD, a timery typu 1 mają tylko CCA i CCB (schematyczną budowę timera przedstawiono na rysunku 3)
- CTRLx – są to rejestry konfiguracyjne.
- INTCTRLx – rejestry konfigurujące przerwania.
Rys. 2. Przyporządkowanie wyjść OCx timerów portu C (koniecznie przeczytaj przypisy pod tabelą)
Rys. 3. Schematyczna budowa timera
Timery w mikrokontrolerach XMEGA mogą być taktowane sygnałem z systemu dystrybucji sygnałów zegarowych lub mogą pochodzić w systemu zdarzeń. System zdarzeń daje bardzo duże możliwości i jest to temat na osobny artykuł. Sygnał zegarowy możemy podzielić preskalerem, podobnie jak w ATmega.
Przepełnienie licznika oraz wystąpienie zdarzeń CCx może generować przerwanie lub zdarzenie dla systemu zdarzeń oraz DMA.
Z bardziej wyrafinowanych możliwości timerów w mikrokontrolerach ATxmega należy wyszczególnić:
- tryby pracy umożliwiające pomiar częstotliwości, okresu i wypełnienia sygnału zegarowego, doprowadzonego do dowolnego pinu procesora
- PWM z korekcją fazy i częstotliwości
- współpraca z DMA
- dodatki rozszerzające rozdzielność PWM
- układ AWEX umożliwiający otrzymanie sygnałów do sterowania silnikami elektrycznymi, kontrolę czasu martwego, itp
- XMEGA Custom Logic dostępne w modelach serii E, które są bardzo prostym odpowiednikiem komórek logicznych układów FPGA, umożliwiające uzyskanie np. sygnałów modulowanych
Prostsze możliwości timerów XMEGA poznamy w kilku kolejnych odcinkach kursu, a czytelników zainteresowanych wykorzystaniem bardziej zaawansowanych funkcji odsyłam do książki Tomasza Francuza AVR. Praktyczne projekty, w której zostały szczegółowo opisane.
Dystrybutorem zestawu X3-DIL64 jest KAMAMI.pl. |
Dominik Leon Bieczyński