Kurs XMEGA: wstęp do timerów

Długo zastanawiałem się, w jaki sposób i jakie tematy poruszyć w artykułach o timerach. W ATmega timery 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 poniżej. Timery oznaczone są skrótem TC odTimer/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. 

Budowa procesora Atmel XMEGA

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 poniżej). 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
  • CTRLx – są to rejestry konfiguracyjne
  • INTCTRLx – rejestry konfigurujące przerwania

Rejestr i pinout port

Budowa timera w procesorze XMEGA

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.