Хочу немного покритиковать программу.
1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени.
1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени.
Вы не учли вот эту проверку:
Код
in R5, ICR1H
tst R5
brne _do_not_correct_result
tst R5
brne _do_not_correct_result
которая происходит перед "in AL, TIFR"
Цитата
2) Вполне возможно, что если прерывания TIM1_OVF и TIM1_CAPT возникли в течение указанного периода, то прерывание TIM1_OVF выполнится после TIM1_CAPT и ПОВТОРНО скорректирует результат в r3-r2 (не уверен на все 100, надо проверять).
Вот это помагает избежать данной проблеммы:
Код
out TIFR, AL
Цитата
3) Вход в прерывание TIM1_CAPT означает конец интервала измерения ...
или начало ....
Ну например если мы хотим измерять длительность единичного импульса на входе.
Цитата
Ну и последнее, в подобных случаях предпочитаю использовать конструкцию
Вместо эквивалентной
что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1.
Код
subi r2,-1 ;
sbci r3,-1 ;
sbci r3,-1 ;
Вместо эквивалентной
Код
add R2,сonst1 ;
adc R3,сonst0 ;
adc R3,сonst0 ;
что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1.
subi на регистрах R0-R15 ?! ню...ню...