Здравствуйте! Хочу включить в свою программу прерывание по совпадению Б таймера 1
.include "m168def.inc" ................................
RESET: ........................................
;===========старт таймера 1============= ; ;======================================= ldi temp, 9 sts OCR1AH, temp ldi temp, 169 sts OCR1AL, temp ; загрузили регистры сравнения A ldi temp, 0x1A sts OCR1BH, temp ldi temp, 0xDB sts OCR1BL, temp ; загрузили регистры сравнения B ldi temp, (1<<WGM12) ; сброс при совпадении, таймер остановлен sts TCCR1B, temp ................................ lds temp, TIMSK1 cbr temp, 0b00000010 ; запрещаем прерывание "совпадение А" sbr temp, 0b00000100 ; разрешаем прерывание "совпадение B" sts TIMSK1, temp ............................... ; ===запускаем таймер=== clr temp ; = = sts TCNT1H, temp ; =очищаем счетные регистры sts TCNT1L, temp ; =очищаем счетные регистры lds temp, TCCR1B ; = = cbr temp, 0b00000101 sbr temp, 0b00000010 ;запуск таймера 1 16 МГц / 8 = 2 МГц = sts TCCR1B, temp ; ======================
В программе время от времени разрешаются прерывания по таймеру 1 "совпадение А" и "совпадение Б". Если я правильно понимаю, в зависимости от того, какое прерывание разрешено, счетные регистры TCNT1 сравниваются с регистрами сравнения OCR1A или OCR1B. В симуляторе AVR студии все прекрасно работает, а в железе срабатывает только прерывание "сравнение с А". "Сравнение с Б" не работает вообще, почему? PS в книге Евстегнеева сказано "Режим СТС (сброс при совпадении) В этом режиме счетный регистр тоже функционирует как обычный суммирующий счетчик,...Однако максимально возможное значение счетного регистра и, следовательно, разрешающая способность счетчика определяются либо регистром сравнения блока A OCR1A, либо регистром захвата ICR1..." тогда зачам вообще нужно прерывание Timer1 Compare B?
|