реклама на сайте
подробности

 
 
> Использование команды ijmp
Sprite
сообщение Jul 13 2008, 16:45
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 173
Регистрация: 11-05-08
Пользователь №: 37 414



Доброго времени суток, товарищи! Программирую я на 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 тактаsad.gif А как быть если t = 513? Добить NOP-ами просто не получится, поскольку t постоянно меняется каждые 1000 тактов. Товарищ посоветовал использовать команду ijmp, но как ей пользоваться я не разобрался.
Помогите!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 10:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016