Задержка на МК 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 регистре, по завершению цилов выходим из подпрограммы.

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

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Вячеслав

    Классно.

    Полезная вещь.

    Для Attiny2313a call заменить на rcall

    Спасибо автору.

    Ответить
  2. Гость

    DELAY: ;процедура задержки

    subi R17,1

    sbci R18,0

    ; sbci R19,0 ;подключаем если нужны задержки больше

    brcc DELAY

    ret

    Ответить