В качестве примера, рассмотрим 16 битный AVR таймер счётчик (ТС1), который обслуживает микроконтроллер ATmega8. Этот контроллер использует 3 AVR таймера – 8-ми битные (ТС0, ТС2), и одни 16-ти битный (ТС1). Рассмотрим возможности этого таймера, с помощью каких регистров им управлять и какие значения нужно внести, чтобы, надлежащим образом настроить этот AVR таймер и какой бит за что отвечает.
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 для работы в режиме ШИМ
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 степени он переполняется и происходит его сброс, и все начинается сначала.
7 бит - OCIE2 - прерывание в случаи совпадения TC26бит - TOIE2 - прерывание в случае переполненияTC2 5бит - TICIE1 - прерывания в случае захвата TC14бит - OCIE1A -прерывание в случаи совпадения A TC13бит- OCIE1B -прерывание в случаи совпадения B TC12бит - TOIE1 - прерывание в случае переполненияTC11бит - TICIE1 - не используется0бит - TOIE0 - прерывание в случае переполненияTC0
Значения этих флагов соответсвуют прерываниям в регистре TIMSK. Принемают значение "1" при определенных условиях прерывания. Так настраивается TC1. Остальные таймеры настраиваются аналогично.
Давайте теперь попробуем настроить таймер 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);
}
Комментарии
OCR1AH=0x03;//записываем в регистр OCR1A 1000
OCR1AL=0xE8;
или можно просто
OCR1A=0x03E8;