Zobacz także:
- Mikrokontrolery AVR część 1 – wprowadzenie
- Mikrokontrolery AVR część 2 – podstawy
- Mikrokontrolery AVR część 3 – wokół kontrolera
- Mikrokontrolery AVR część 4 – Porty we/wy
- Mikrokontrolery AVR część 5 – przerwania
- Mikrokontrolery AVR część 6 – timer0
- Mikrokontrolery AVR część 7 – tmier1
- Mikrokontrolery AVR część 8 – timer2
- Mikrokontrolery AVR część 9 – Komparator analogowy
- Mikrokontrolery AVR część 10 – transmisja szeregowa UART
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.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
FOC2 | WGM20 | COM21 | COM20 | WGM21 | CS22 | CS21 | CS20 | |
Read/Write | W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Initial Value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Mode | WGM21 | WGM20 | Timer/Counter Mode | TOP | Update of OCR2 | TOV2 Flag set |
0 | 0 | 0 | Normal | 0xFF | Immediate | MAX |
1 | 0 | 1 | PWM | 0xFF | TOP | BOTTOM |
2 | 1 | 0 | CTC | OCR2 | Immediate | MAX |
3 | 1 | 1 | Fast PWM | 0xFF | BOTTOM | MAX |
CS22 | CS21 | CS20 | Description |
0 | 0 | 0 | No clock source (Timer/Counter stopped). |
0 | 0 | 1 | clkT2S/(No prescaling) |
0 | 1 | 0 | clkT2S/8 (From prescaler) |
0 | 1 | 1 | clkT2S/32 (From prescaler) |
1 | 0 | 0 | clkT2S/64 (From prescaler) |
1 | 0 | 1 | clkT2S/128 (From prescaler) |
1 | 1 | 0 | clkT2S/256 (From prescaler) |
1 | 1 | 1 | clkT2S/1024 (From prescaler) |
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ład
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.
Dobra robota!
Dzięki, przydało się, jednak nie bez błędów:
to
TCCR2 |= (1<<WGM20) | (1<<WGM 21) | (1<<CS22); | (1<<COM21)
zamień na to
TCCR2 |= (1<<WGM20) | (1<<WGM 21) | (1<<CS22) | (1<<COM21);
oraz to:
OCR2 = 127
na to:
OCR2 = 127;
W niektórych mikrokontrolerach np AtMega16 licznik2 może współpracować z kwarcem zegarkowym 32768Hz co ułatwia bardzo budowanie zegarów. Przydała by się taka informacja 🙂