Доброго времени суток, товарищи! Программирую я на atmega8535.
Задача такая:
Имеется промежуток времени - 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
Все бы хорошо, но вышеописанный подход позволяет генерировать событие S через время t кратное 4, т.е. 16, 20, 24 и т.д., поскольку код в операциях dec, cpi и brne занимает 4 такта

А как быть если t = 513? Добить NOP-ами просто не получится, поскольку t постоянно меняется каждые 1000 тактов. Товарищ посоветовал использовать команду
ijmp, но как ей пользоваться я не разобрался.
Помогите!