Ostatnim z układów licznikowych w kontrolerze atmega8 jest licznik/czasomierz 2. Ma on architekturę 8 bitową, co oznacza, że może pomieścić 256 impulsów. Liczniki ten może pracować w czterech trybach. Te tryby to: normalny, PWM, PWM z poprawną fazą, oraz CTC. Tryb PWM jest tylko 8 bitowy.Schemat poniżej ilustruje budowę tego licznika.
Na razie zajmijmy się tylko górną częścią licznika. O tym co jest na dole schematu będę mówił na koniec artykułu. Licznik ten jest taką uproszczoną wersją timera1. Posiada tylko jeden rejestr OCR.
W celu konfiguracji tego licznika korzystamy w rejestru TCCR2. Bity zawarte w nim służą do wyboru preskalera, trybu pracy, oraz trybu pracy wyjścia OC2. Poniżej przedstawiam tabele zaczerpnięte z noty katalogowej kontrolera atmega8.
Ze względu na to, że poszczególne tryby już zostały opisane w poprzedniej części kursu, nie będę ich teraz opisywał szczegółowo, tylko zaprezentuję konkretnie przykłady. Jednak na razie przedję jeszcze do jednego zagadnienia.
Praca asynchroniczna
Normalnie licznik pracuje w trybie synchronicznym, czyli nalicza impulsy równo z taktami zegarowymi procesora. Może to powodować błędy, gdy chcemy bardzo dokładnie odmierzać czas. W tym celu wymyślono tryb asynchroniczny. Impulsy pochodzące zewnątrz kontrolera są w nim naliczane dokładnie w chwili ich wystąpienia, nie zależnie od taktowania procesora. Do sterowania tym trybem służy ten dziwny blok na dole schematu z pierwszego rysunku. Obsługę tego trybu umożliwia rejestr ASSR.
Przykłady
Program przykładowy będzie miał za zadanie generować przebieg PWM. Skorzystamy z trybu trzeciego timera 2.
#define F_CPU 1000000 //ustawienie oscylatora na 1MHz
#include <avr/io.h> //dołączenie podstawowej biblioteki
int main()
{
TCCR2 |= (1<<WGM20) | (1<<WGM 21) | (1<<CS22); | (1<<COM21) //włączenie trybu fast PWM, //preskaler ustawiony na 64, a wyjście w trybie nie odwracanym
OCR2 = 127 //ustawienie współczynnika wypełnienia
while() //pusta pętla
{
}
}
Program ten generuje na wyjściu OC2 sygnał o wypełnieniu 50%. Wartość wpisana do rejestru OCR2 musi się mieścić w przedziale od 0(wypełnienie 0%), do 255(wypełnienie 100%).
N tym zakończę opis liczników w mikrokontrolerach AVR, mam nadzieje, że artykuły te pomogą w pisaniu programów wymagających precyzyjnego odmierzania czasu i generowania sygnałów zmiennych. W następnej części kursu przejdę już do komparatora analogowego.




