Микроконтроллеры

Настройка таймера в AVR микроконтроллере

Принцип действия и настройка

В качестве примера, рассмотрим 16 битный AVR таймер счётчик (ТС1), который обслуживает микроконтроллер ATmega8. Этот контроллер использует 3 AVR таймера – 8-ми битные (ТС0, ТС2), и одни 16-ти битный (ТС1). Рассмотрим возможности этого таймера, с помощью каких регистров им управлять и какие значения нужно внести, чтобы, надлежащим образом настроить этот AVR таймер и какой бит за что отвечает.

Регистр TCCR1А

Регистр TCCR1A таймера.

7 - 6биты регитистра – COM1A 1:0 - контроль работы выхода OC1A (смотрите таблицу номер 1) 5 - 4биты регитистра – COM1B 1:0 -контроль работы выхода OC1B(смотрите таблицу номер 1) 3 - 2 биты регитистра– FOC1A, FOC1B - принудительное изменение состояния выходов OC1A и OC1B 1 - 0 биты регитистра– WGM11, WGM10 - настраивают TC1 для работы в режиме ШИМ

Состояния выводов OC1ФA и OC1B

РегистрTCCR1B

7 бит регистра – ICNC1 - задерживает определение события, происходящего на входе ISP1 на 4 машинных цикла. 6 бит регистра– ICES1 - выбирает фронт срабатывания прерывания по захвату. В случаи установки на растущем фронте, сброса – на падающем. 5 бит регистра– не используется. 4,3бит регистра – WGM1 3:2 - служит с целью настройки ШИМа. 2-0бит регистра – CS1 2:0 - выбор частоты тактирования TC1.(смотрите таблицу номер 2)

После того как мы задали определенную частоту в регистре TCCR1B счетчик таймера считывает и записывает значения в счетный регистр, у которого есть байты TCNT1H и байт TCNT1L. После того как TCNT1 достиг значения 2 в 16 степени он переполняется и происходит его сброс, и все начинается сначала.

TIMSK - регистр маски прерываний таймеров

7 бит - OCIE2 - прерывание в случаи совпадения TC26бит - TOIE2 - прерывание в случае переполненияTC2 5бит - TICIE1 - прерывания в случае захвата TC14бит - OCIE1A -прерывание в случаи совпадения A TC13бит- OCIE1B -прерывание в случаи совпадения B TC12бит - TOIE1 - прерывание в случае переполненияTC11бит - TICIE1 - не используется0бит - TOIE0 - прерывание в случае переполненияTC0

TIFR- регистр флагов прерываниятаймеров или счетчиков

Значения этих флагов соответсвуют прерываниям в регистре TIMSK. Принемают значение "1" при определенных условиях прерывания. Так настраивается TC1. Остальные таймеры настраиваются аналогично.

Расположение выводов микроконтроллера

Микроконтроллер AVR может иметь до 4 таймеров счетчиков.

Давайте теперь попробуем настроить таймер TC1 записав определенные значения в регистры этого таймера. Допустим что наш микроконтроллер подсоединен к внешнему резонатору с частотой 2.048 МГц. А нам нужно бы на выход OC1A подавались импульсы с частотой 1Гц. Также нам нужно что бы с интервалом 0.5 сек на выходе OC1A уровень менялся на противоположный при достижения какогото значения в счетчике. Для этого в регистр нужно записать в TCCR1A значение 0x40. Вычислим теперь до какого значения теперь должен считать счетчик. Установим делитель частоты в регистр TCCR1B на 1024 записав в него значение 0x05. В результате наш таймер будет считать до значения 204800/1024=2000Гц. Счетчик досчитает до двух тысяч за одну секунду. А нам нужно 0,5 секунд. Для этогов OCR1A запишем 2000/2=1000 (0x03E8).

#include <iom8.h>
#include <avr/io.h>
#define F_CPU 2048000
//обработчик прерывания по совпадению А
ISR(TIMER1_COMPA_vect) 
{
 TCNT1L=0;
}
int main()
{
DDRB=0x02;//настраиваем OC1A на выход
PORTB=0x00;// Начальное значение
TCCR1A=0x40;//при совпадении уровень OC1A меняется на противоположный
TCCR1B=0x05;//Делитель частоты 1024 
//записываем в регистр OCR1A 1000
OCR1AH=0x03;
OCR1AL=0xE8;
TIMSK = 0x10;//разрешаем прерывание по совпадению
sei();//разрешаем прерывания глобально
while(1);
} 

Комментарии  

 
#1 Mihail 13.12.2013 09:21
Спасибо автору! С копировал пример залил на атмегу 8 и все заработало!
Цитировать
 
 
#2 Александр 02.12.2014 17:38
подскажите а обязательно значение в регистр OCR1A записывать в 16ричном формате? и обязательно ли записывать значение сначала в старший а потом младший, т.е. вот так:

OCR1AH=0x03;//записываем в регистр OCR1A 1000
OCR1AL=0xE8;
или можно просто

OCR1A=0x03E8;
Цитировать
 
 
#3 Игорь 07.03.2019 19:18
В CVAVR можно даже в десятичном, компилятор все сам сделает. Однако МК восьмибитный, а значит и регистры пишутся по 8 бит. Таймер 16 битный, значит писать можно только по 8 бит 2 байта.
Цитировать
 

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


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа