Задача такая:
Имеется промежуток времени - 1000 тактов. Через время t [~0;1000] должно наступить событие S(скажем должен податься уровень 1 на ногу PB7) с точностью до 1 такта. Вначале промежутка время события t известно. Наступление этого события требуется сгенерировать программно, не используя какие-либо прерывания.
По логике вещей нужно после преобразования значения t в значение счетчика декрементировать его до наступления этого события, т.е. примерно так:
Код
ldi R16, 200 ; Считаем, что 200 - уже преобразованное значение счетчика, соответствующее t = 800
Decrement:
dec R16 ; Вычитаем 1
cpi R16, 0; Сравниваем с 0
brne Decrement; Перейти если не равно 0
sbi PORTB, 7 ; Событие S - подаем уровень 1 на ногу PB7
Decrement:
dec R16 ; Вычитаем 1
cpi R16, 0; Сравниваем с 0
brne Decrement; Перейти если не равно 0
sbi PORTB, 7 ; Событие S - подаем уровень 1 на ногу PB7
Все бы хорошо, но вышеописанный подход позволяет генерировать событие S через время t кратное 4, т.е. 16, 20, 24 и т.д., поскольку код в операциях dec, cpi и brne занимает 4 такта

Помогите!