Как вы понимаете задержка в микроконтроллерном программировании весч не просто нужная, а просто необходимая.
И если написать на 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 регистре, по завершению цилов выходим из подпрограммы.
Увеличить продолжительность зажержки можно путем добавления пустых операций в тело циклов, а также можно использовать пересылки данных с одним источником и приёмником.
Классно.
Полезная вещь.
Для Attiny2313a call заменить на rcall
Спасибо автору.
DELAY: ;процедура задержки
subi R17,1
sbci R18,0
; sbci R19,0 ;подключаем если нужны задержки больше
brcc DELAY
ret