Асинхронный режим таймера на примере AVR Atmega8 + CVAVR

В некоторых моделях микроконтроллеров таймер может работать в асинхронном режиме. Это даёт возможность нам построить часы без каких либо внешних спец-микросхем. В этом режиме у Atmega8 может работать Timer2, кварц на 32768 Гц или внешний тактовый сигнал подают на выводы TOSC1 и TOSC2.
Генератор Timer2 оптимизирован под использование часового кристалла с частотой 32768 Гц.

32768HZ
Внешний тактовый сигнал, подаваемый на этот вывод, проходит через тот же самый усилитель с полосой пропускания 256 кГц. Timer2Таким образом, внешний тактовый сигнал должен быть в диапазоне от 0 Гц до 256 кГц. Частота внешнего тактового сигнала, подаваемого на вывод TOSC1, не должна превышать одной четвертой от тактовой частоты CPU. Отметим, что тактовая частота CPU может быть ниже частоты XTAL, если разрешено деление частоты XTAL.
Но для правильной его работы нужно правильно его настроить, рассмотрим пример на Atmega8 в CVAVR. Мы не будем строить часы, а просто сделаем «мигалку» с частотой 1 гц – 1 секунда.
И так вооружившись пивом и желанием запускаем наш компилятор, выбираем новый проект и запускаем генератор начального кода.
Выбираем наш AVR микроконтроллер Atmega8 и на вкладке Chip устанавливаем тактирование 8 мгц.timer2-chip
Идём далее в вкладку Ports – и устанавливаем PB0 и PB1 как выходы. К ним будут подключатся светодиоды и внешний таймер в симуляторе.
Теперь самая главная вкладка это Timers->Timer2. В поле «Clock Source» выставляем «TOSC1 pin», тоесть внешнее тактирование с этого пина.
Далее нужно настроить пред-делитель таймера. timer2-delitel

Тут на выбор 7 значений, в зависимости от поставленой задачи – нам нужно получить на выходе 1 секунду поэтому мы выбираем пред-делитель на 128, позже поясню почему. Далее разрешаем прерывание по Timer2 и устанавливаем начальное значение счётчика(в нашем случае 00).

timer2-timer

Настройка окончена – можно генерировать код.
И так почему же мы выбрали 128 спросите? А всё очень просто можно посчитать по следующей формуле:

T=1/(Tn/(Fr/Td));

где T – время одного прерывания таймера;
Fr – частота резонатора или внешнего тактового сигнала;
Td – предделитель таймера;
Tn – максимальное значение таймера;

Пример:
Т = 1(256 / (32768/2)) = 0.015625 с.
Т = 1(256 / (32768/8)) = 0.0625 с.
Т = 1(256 / (32768/32)) = 0.25 с.
Т = 1(256 / (32768/64)) = 0.5 с.
Т = 1(256 / (32768/128)) = 1 с.
Т = 1(256 / (32768/256)) = 2 с.
Т = 1(256 / (32768/1024)) = 8 с.
Чтобы получить другие временные интервалы нужно изменить частоту или изменить Tn (максимальное значение таймера).       Tn = 256 – TCNT2(начальное значение). Например начальное значение таймера TCNT2=0х05, Tn = 256 – 5 = 251. Подставляем в формулу:
Т = 1(251/ (32768/128)) = 0.98046 с.

Пишем простейший код:

#include
unsigned int t;
#define out PORTB.0
#define out2 PORTB.1
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=0x05; //начальное значение таймера
t++;
if(t==0){out=0;out2=1;}
if(t==1){out=1;out2=0;}
if(t==2){out=0;out2=1;t=0;}
}

 

Результат:timer2-tcnt2
В точности совпадает с расчётами.
А теперь закомментируем начальное значение таймера

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// TCNT2=0x05; //начальное значение таймера
t++;
if(t==0){out=0;out2=1;}
if(t==1){out=1;out2=0;}
if(t==2){out=0;out2=1;t=0;}
}

Результат:timer2-1

Во время счёта:timer2-0

Схема с дип и с smd корпусом:timer2-2

Обратите внимание что нумерация выводов отличается, а программа подходит для обоих чипов. Ещё желательно повесить канденсаторы к кварцу 10-20 pf(для надёжного запуска).
Скачать весь проект Atmega8-32768Hz Скачали 4068 раз

Для удобства я написал программу для ПК которая в автоматическом режиме делает все расчёты по выше изложенным формулам.

Скачать Программу расчёта асинхронного режима таймера Скачали 3922 раз

Асинхронный режим таймера на примере AVR Atmega8 + CVAVR: 3 комментария

  1. для тех кому нужно вычислить то значение, которое нужно вводить, вот формула:
    (выведенная из примера)
    TCNT2= 256-Fr/Tn*T

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *