[an error occurred while processing this directive]
|
; Таймер TCNT1 у меня молотит от 16000/64 КГЦ,
; то есть на входе TCNT1H у меня период 1.024 мс -
; вполне достаточно точности в 2%
ldi tmp1,250 ; Вызов задержки на 250 мс
rcall delay_ms ;
...
...; Собственно подпрограмма задержки на 2..255 мс
delay_ms:
in tmp2,TCNT1L ; Фиктивное конвейерное чтение младшего байта
in tmp2,TCNT1H ; Реальное чтение старшего байта
add tmp1,tmp2 ; TMP1 = delay+TCNT1H, переполнение не страшно
delm_lp:
in tmp2,TCNT1L ; Фиктивное конвейерное чтение младшего байта
in tmp2,TCNT1H ; Реальное чтение старшего байта
cpse tmp1,tmp2 ; Висим в цикле, пока TCNT1H не доедет до TMP1
rjmp delm_lp ;
ret ; Готово, выходим
Ну, а по-хорошему надо флажок ставить при помощи OCR1x - тогда МК вместо непроизводительного висения в цикле может просто изредка проверять этот флажок, и спокойно заниматься другими делами, пока флажок не взведется таймером по Compare