Mikrokontrolery AVR część 8 – timer2

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.

Komentarze do „Mikrokontrolery AVR część 8 – timer2

  1. 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;

  2. 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 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.