Задержка на МК AVR ATmega на asm

Как вы понимаете задержка в микроконтроллерном программировании весч не просто нужная, а просто необходимая.

И если написать на C может и дурак (в виде цикла конечно), то на asm не все начинающие..

Итак. Задержка делается путём реализации вложенного цикла.

Нам понадобиться 2 регистра и немного команд из набора ассемблера для AVR.

При помощи директив ассемблера зададим 2 параметра. Количество проходов внешнего и внутренного циклов.

.equ delay_time1 = 255
.equ delay_time2 = 255

Сразу скажу, что максимальная задержка таким методом составляет 195856 тактов, что при частоте 8Мгц составляет примерно 24 милисекунды.

Итак подпрограмма задержки:

Delay:
         ldi r21, delay_time1
 delay1: ldi r20, delay_time2
 delay2: dec r20
         brne delay2
         dec r21
         brne delay1
 ret

тут всё предельно просто. Грузим в регистр 21 число 255 затем создаём цикл1 в котором грузим в 20 регистр 255 (delay_time2) после чего создаём вложенный цикл 2. В нём на каждом проходе уменьшаем значение в регистре 20 на еденицу после чего проверяем результат на обнуление. По завершению цикла2 продолжается цикл1, уменьшается значение в регистре 21, проверяем значене в 21 регистре, по завершению цилов выходим из подпрограммы.

Увеличить продолжительность зажержки можно путем добавления пустых операций в тело циклов, а также можно использовать пересылки данных с одним источником и приёмником.

Просмотров:   16103

Комментарии

вс, 10/27/2013 - 13:24
Вячеслав

Классно.
Полезная вещь.
Для Attiny2313a call заменить на rcall
Спасибо автору.

ср, 12/24/2014 - 07:57
Гость

DELAY: ;процедура задержки
subi R17,1
sbci R18,0
; sbci R19,0 ;подключаем если нужны задержки больше
brcc DELAY
ret

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!