// Добавка из-за длинных команд и других обработчиков,
// которая уже воспринимается как "авария"
#define MAX_JITTER
// Меньше этого быть не может (сумма тактов ухода на вектор, jmp оттуда
// и тактов обработчика до точки in ZL, TCNT0
#define MIN_DELAY
#define MAX_DELAY (MIN_DELAY+MAX_JITTER)
TIMER0_OVF_vect:
push ZL
in ZL, SREG
push ZL
push ZH
in ZL, TCNT0
cpi ZL, MAX_DELAY
brsh too_high_delay ; на ветвь обработчика ошибки (мало
; заказали MAX_JITTER)
clr ZH
subi ZL, low( - (pm(t0_jtable) - MIN_DELAY ) )
sbci ZH, high( - (pm(t0_jtable) - MIN_DELAY ) )
ijmp
t0_jtable:
.rept MAX_DELAY - MIN_DELAY
nop
.endr
; тут выровнялись и пошли работать
pop ZH
pop ZL
out SREG, ZL
pop ZL
reti