Прерывание таймера по сравнению, программирование МК

June 27, 2010 by admin Комментировать »

Способ отсчета времени с помощью прерывания таймера по сравнению бо­лее понятен и удобен, чем с предзагрузкой значений в счетный регистр — хотя бы потому, что число, с которым сравнивается содержимое счетных регистров, можно загружать только один раз. Если потом запустить таймер, то больше об этом можно не думать — все будет происходить автоматиче­ски. Поскольку в Tiny2313 и большинстве моделей Mega (если не во всех) все таймеры, в том числе и 8-разрядные, имеют такой режим (в «классиче­ских» его имел только 16-разрядный Timer 1), то применение его тем более целесообразно.

Подробности

Прерывание по сравнению происходит в момент, когда счетчик досчитывает до наперед заданного значения, хранящегося в специальном регистре сравне­ния. Есть одна тонкость; связанная с этим режимом. Входной тактовый сигнал счетчика обычно делится в соответствии с заданным коэффициентом деле­ния, в наших примерах это 1/64. Поэтому в нашем случае каждое состояние счетчика остается неизменным в течение 64 тактов процессора. Так в какой именно момент возникает прерывание — сразу, как только счетчик досчитал до заданного значения? Или в момент, когда это заданное значение должно уже смениться следующим? Если предположить, что в AVR все устроено, как на рис. 16.13, 6, то имеет место первый случай: счетчик начинает новый отсчет с первого системного такта сразу после совпадения величин. Тогда состояния счетчика получаются неравноправными: все они длятся по 64 системных такта (в нашем случае), кроме последнего, который длится один системный такт не­зависимо от коэффициента деления. Так это было устроено в «классической» серии AVR. А вот для счетчиков семейств Меда и Tiny все иначе: там событие совпадения наступает по последнему такту при совпадении, в момент, когда состояние счетчика должно уже смениться. Поэтому, если вы зададите в реги­страх сравнения, к,примеру, число 2, то при коэффициенте деления 1/64 Timer 1 в МК AT90S2313 отсчитает до возникновения прерывания 129 систем­ных тактов (или примерно 2 такта входной частоты счетчика), а в МК ATtiny2313 — 192 системных такта (ровно 3 такта входной частоты). Таким об­разом, в первом случае коэффициент деления входной частоты таймера в ре­жиме сравнения равен установленному числу N плюс один такт системного ге­нератора, а во втором — числу Л/ + 1.

Причем в этом режиме можно упростить программу предельно: один из вы­водов контроллера (при прерывании с применением регистра сравнения А это 0с1а или вывод 15 для 2313) можно включить в режим автоматического переключения в момент совпадения, без дополнительного программного управления. Если больше ничего в момент совпадения делать не требуется, не нужно даже будет включать прерывание — переключение вывода проис­ходит аппаратно. Нам здесь это не подходит, так как светодиод двухцветный, и все равно необходимо переключать две линии одновременно, а вот в сле­дующей главе мы эту возможность используем.

Для того чтобы установить режим сравнения, нужно вместо прерывания по переполнению разрешить прерывание по сравнению А (бит ocieia в регист­ре timsk), а также установить значение в регистрах сравнения (ocriah и ocrial), с которым будет сравниваться содержимое счетчика. Нетрудно до­гадаться, что для цикла счета в полсекунды оно равно вычисленному нами ранее значению 31 250. При записи в эти регистры нужно помнить то, что было сказано ранее про обращение с 16-разрядными регистрами в таймерах.

Есть в этом деле и еще один нюанс. Что будет происходить с таймером после того, как значения в счетных регистрах и регистрах сравнения станут одина­ковыми (кроме того, что произойдет прерывание)? Ясно, что тут могут быть варианты: таймер может продолжить счет, обнулиться, установиться в какое-то наперед заданное значение и т. п. Это поведение настраивается: для выбо­ра режима обнуления (чтобы после сравнения таймер пришел бы в исходное состояние) следует установить бит wgmi2 (в «классической» версии МК он назывался стс1) — бит номер 3 в регистре tccrib.

Программа с учетом всего сказанного будет выглядеть таким образом:

/программа мигания светодиода /процессор Tiny2313, частота 4 МГц .include "tn8535def.inc" .def temp = rl6 /рабочий регистр

rjmp RESET /Reset Handler

reti /EXT_INTO / External InterruptO Handler reti /EXT_INT1 / External Interruptl Handler reti /TIM1_CAPT / Timer 1 Capture Handler rjmp /TIMl_COMPA ; Timer 1 CompareA Handler reti TIMl^OVF / Timer 1 Overflow Handler reti /TIM0_OVF / Timer 0 Overflow Handler reti /USARTO^RXC / USARTO RX Conplete Handler reti /USARTO^DRE / USARTO, UDR Eitpty Handler reti /USARTO_TXC / USARTO TX Conplete Handler reti /ANA_CCMP / Analog Comparator Handler reti /PCINT / Pin Change Interrupt reti /TIMERl_ca4PB / Timer 1 Compare В Handler reti /TIMERO_CCeylPA / Timer 0 Compare A Handler reti /TIMERO_CCeylPB / Timer 0 Conpare В Handler reti /USI_START / USI Start Handler reti /USI_OVERFLOW / USI Overflow Handler reti /EE_READY / EEPROM Ready Handler reti /WDT_OVERFLOW / Watchdog Overflow Handler

TIM1_C0MPA: /процедура обработки прерьшания по сравнению А /начало мигания

in temp,PortD /загружаем в temp состояние PortD

sbrc tenp,5 ;если PD5 равен О, след. команду пропускаем

rjnp set__Green /переход на установку зеленого

sbi PortD, 5 ;PD5»^1, устанавливаем красный

cbi PortD,6 ;PD6=0, устанавливаем красный

reti ;выход из прерывания set_Green: ;метка установка зеленого

cbi PortD,5 ;PD5=0, устанавливаем зеленый

sbi PortD,б ;PD6=1, устанавливаем зеленый reti ;выход из прерывания RESET: /процедура после сброса

ldi temp,low(RAMEND) /загрузка указателя стека

out SPL,teinp

ldi temp,ObOliooooo /устанавливаем биты 5 и б

out ddrd,temp /выводим это значение в регистр направления порта d

ldi temp,high(31250) /значение регистра сравнения для 0,5 сек

out ocriah,temp /старший байт

ldi tenp,low(31250)

out OCRIAL, tenp /младший байт

ldi tenp,0b00001011

out tccrib,tenp /запуск таймера с делителем 1/64

/и установка бита 3 «очищать счетчик при совпадении» ldi temp, (1«0CIE1A) /разрешение прерывания по сравнению А out TIMSK, tenp

sei /общее разрешение прерываний Cykle:

rjnp Cykle /зацикливаем процессор

Естественно, значение, загружаемое в регистры сравнения ocriah : ocrial, необязательно должно быть равно в точности 31 250. Это дает удобный спо­соб для точной подстройки интервала времени, который может иметь опре­деленный разброс из-за неточностей используемого кварца. Но мы займемся этим уже в следующей главе.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты