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

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

 

См. также:  Первый проект на ассемблере AVR ATmega в AVR Studio
Понравилась статья? Поделиться с друзьями:
Blablacode
Комментарии: 2
  1. Вячеслав

    Классно.

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

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

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

  2. Гость

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

    subi R17,1

    sbci R18,0

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

    brcc DELAY

    ret

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: