Тема: как на МК АТМЕГА задавать красивые временные промежутки.
Несколько раз у участников форума встречал реализации устройств на атмеге с очень странными временными промежутками, используемыми для записи данных. Чаще всего - 61 раз в секунду.
понятно что технике всеравно, но как то не красиво
. Плохо переводится в термины старика Герца.
счетчики в МК имеют функционал, позволяющий решить этот вопрос - получение любой заданной частоты.
Для этого надо отказаться от прерывания по переполнению, а использовать прерывание по совпадению с заранее заданным числом.
Расчет этого числа выглядит следующим образом:
Период между прерываниями T = ((1024 * 180) * / 18 432 000) = 0.01 сек ==> для установления частоты срабатывания прерывания 100 Гц следует использовать прескалер 1024 и число сравнения 180.
Бывает что не влазит необходимое число (остаток от деления нацело) в 8-битный счетчик - использую тогда 16битный.
И надо не забыть . что верктор прерывания теперть
Пример.
.cseg
.org 000
rjmp _reset
.org OC2addr
rjmp _interrupt_timer_overcount
//....//
_timer_init: ; устанавливает делитель частоты и запускает таймер
ldi r16, low(cT2top -1 ) ; загружаю (180-1)
mOut OCR2 , r16 ; установлю TOP для TCNT2 при котором он будет обнуляться
mIn r16, TIMSK
ori r16, (1<< OCIE2) ; разрешает прерывание по совпадению Timer2 и OCIE1A
mOut TIMSK, r16
ldi r16, (1<<WGM21) ; устанавливает режим CTC (назначение битов WGM между счетчиками отличаются)
ori r16, (1<<CS22)|(1<<CS21)|(1<<CS20) ; устанавливает делитель частоты 1024
mOut TCCR2,r16
// счетчик запустился
ret
//....//
_interrupt_timer_overcount:
код, выполняемый через заданный промежуток времени.
ret
Лучше быть оптимистом и ошибаться, чем пессимистом, который всегда прав.