Имеется устройство в котором на вход таймера T1 подаются счётные импульсы. Таймер работает в режиме Normal с разрешением прерываний при достижении заданного предела. После сброса импульсы великолепно считаются и всё работает как надо. После окончания счёта таймер останавливается и при повторной инициализации на счёт не считает входные импульсы. Вроде всё правильно сделал, хотя возможно что-то пропустил... После Hard Reset считает нормально... Что-бы это значило?
Ниже представлена процедура инициализации таймера T1.
Код
...
.equ Init_TCCR1B = 0b00000000; Таймер остановлен, режим работы NORMAL
.equ Wait_TCCR1B = 0b00000100; Таймер с предделителем на 256
.equ Calc_TCCR1B = 0b00000111; Таймер считает внешний сигнал по фронту
;
.equ Init_TIMSK = 0b00000001; Разрешить совпадение для T0
.equ Wait_TIMSK = 0b10000001; Разрешить совпадение для T0 и переполн. для T1
.equ Calc_TIMSK = 0b01000001; Разрешить совпадение для T0, совпад.T1A
...
WorkTimer:
cli ; Запретить прерывания
;
ldi Temp, Init_TCCR1B ; Остановка таймера T1
out TCCR1B, Temp ; Загрузили
;
clr Temp ; Обнулить рабочий регистр
out TCNT1H, Temp ; Записать старший байт
out TCNT1L, Temp ; Записать младший байт
;
; Установим предел счёта счётчика
;
lds XH, DefVolH ; Заданный объём (целая часть)
ldi XL, VodomerTick ; Число импульсов водомера в литре
mul XH, XL ; Перемножить
movw XH:XL, R1:R0 ; Сохранить результат
;
out OCR1AH, XH ; Старший байт
out OCR1AL, XL ; Младший байт
;
; Очистить предделитель
;
ldi Temp, (1<<PSR10) ; Сброс предделителя
out SFIOR, Temp ; Загрузили
;
; Теперь очистим возможные прерывания
;
in Temp, TIFR ; Прочитать регистр флагов прерываний и сбросить лишние
andi Temp, ~((1<<OCF1A) | (1<<OCF1B) | (1<<TOV1))
out TIFR, Temp ; Загрузить регистр флагов прерываний
;
; Разрешить необходимые прерывания
;
ldi Temp, Calc_TIMSK ; Режим прерываний таймеров
out TIMSK, Temp ; Загрузить
;
; Запустим таймер для работы с водомером
;
ldi Temp, Calc_TCCR1B ; Режим работы счётчиком импульсов водомера
out TCCR1B, Temp ; Установить
;
sei ; Разрешить прерывания
;
ret ; Возврат
После выполнения этой подпрограммы в цикле происходит считывание регистров таймера и вывод на экран. Вот такой вот простой контроль.