www.eprace.edu.pl » system-wrzutnikowy » Opis budowy i oprogramowania urządzenia » AVR z mnóstwem niezależnych timerów - prosta sztuczka

AVR z mnóstwem niezależnych timerów - prosta sztuczka

Podstawową bolączką wszystkich mikrokontrolerów rodziny AVR jest mała ilość dostępnych timerów sprzętowych. Użyty w projekcie mikrokontroler AtMega16 posiada 3 takie timery (w tym jeden 16-to bitowy). Jednak sytuacja taka daje się rozwiązać w bardzo prosty i wydajny sposób. Wszystko sprowadza się do wybrania jednego sprzętowego timera, który odmierza "tyknięcia" systemowe co określony, z góry założony czas.  W procedurze przerwania od przepełnienia tego timera znajduje się krótki kod ustawiający globalną flagę "Tick" na wartość true. W głównej pętli programu umieszczona jest funkcja, która cały czas sprawdza stan tej flagi. Po wykryciu "tyknięcia" funkcja realizuje dekrementację wszystkich zadeklarowanych timerów (tych, które mają wartość większą od 0) oraz kasuje flagę "tyknięcia". W taki sposób można uzyskać dowolną ilość timerów programowych potrzebnych w programie. Dodatkowym plusem jest możliwość definiowania zakresu tak tworzonych timerów poprzez deklarację ich zmiennych w zależności od potrzeb jako uint8, uint16 czy uint32.

Rys. 12 - Algorytm działania timerów programowych

Na uwagę zasługuje kwestia odpowiedniego doboru rozdzielczości czasu odmierzanego z użyciem timera sprzętowego. Empirycznie jako optymalna ustalona została wartość 10ms. Wartość ta powoduje, że mikrokontroler względnie rzadko przerywa swoją pracę w celu obsłużenia przerwania od timera. Ponadto jest ona idealna dla zastosowań takich jak samopowtarzanie podczas przytrzymania klawisza. Pozwala także na użycie większości timerów programowych w formie zmiennych 8-io bitowych, co jest w zupełności wystarczające do wykonywania najczęstszych zadań.

W projekcie wykorzystane zostały 2 timery sprzętowe. Ośmiobitowy Timer2 pracujący w trybie CTC (przerwanie od porównania) z preskalerem ustawionym na wartość 1024 służy do generacji "tyknięć" systemowych. Natomiast 16-to bitowy Timer1 korzystający z wejścia przechwytywania wartości ICP zostanie bliżej omówiony w rozdziale poświęconym obsłudze zegara czasu rzeczywistego PCF8583. Timer0 pozostał niewykorzystany, zarezerwowano go do przyszłościowej rozbudowy programu.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.