Предположим, в основной программе необходимо реализовать задержку 1000 мкс. Фрагмент программы требуется оформить в виде подпрограммы т.к. предполагается, что основная программа будет к ней многократно обращаться.
;************************************************
Delay_1ms Подпрограмма формирования задержки 1 мс
;************************************************
X EQU D’249’ ; параметр задачи
COUNT EQU H’20’ ; счетчик цикла
DELAY
MOVLW .X ;1м.ц.
MOVWF COUNT ;1м.ц.
AGAIN
DECFSZ COUNT,f ;1м.ц.
GOTO AGAIN ;2м.ц.
RETURN ;1м.ц.
Рис.9.3. Программа задержки малой длительности
Для того, чтобы вычислить общее число машинных циклов, которые тратятся на выполнение подпрограммы, и таким образом определит величину Х, нужно оценить сколько времени исполняется та или иная команда подпрограммы:
1. Команда CALL DELAY_1ms, используемая для перехода к подпрограмме, выполняется за 2 мкс
2. Команда MOVLW, предшествующая входу в цикл, выполняется за 1 мкс
3. Команда MOVWF также заминает 1 мкс
4. Команда DECFSZ декрементирующая состояние счетчика, затрачивает Х циклов (Х проходов цикла), выполняется за 1 мкс
5. Команда GOTO выполняется тоже Х раз, каждое её выполнение занимает 2мкс
6. Поскольку выход из цикла происходит за счет пропуска команды GOTO последний раз она исполняется за 1 мкс. Таким образом, общая задержка, вносимая командами DECFSZ и GOTO составит (1+2)Х–1 мкс
7. Заключительная команда RETURN выполняется за 1 мкс
Величина задержки в подпрограмме DELAY_1ms Рис.9.3. ограничена тем, что любой регистр данных микроконтроллера (счетчик) является 8-ми битным, т.е. максимальное значение Х=255. Каким образом. Максимальная величина задержки подпрограммы составляет 4+3*255=770.
Задержку можно немного увеличить Рис. 9.4,добавив в тело цикла команды NOP. Каждая команда добавляет один машинный цикл. Таким образом, вставка перед командой DECFSZ одной команды дает суммарную задержку длительностью
Т=4+4Х мкс
4=4Х=1000
4Х=996
Х=249
;************************************************
Delay_1ms Подпрограмма формирования задержки 1 мс
;************************************************
X EQU D’249’ ; параметр задачи
COUNT EQU H’20’ ; счетчик цикла
DELAY_1ms
MOVL X ; загрузка
MOVWF COUNT ; счетчика цикла
LOOP
NOP ; пустая команда
DECFSZ COUNT,f ; ЕСЛИ содержимое счетчика не0
GOTO LOOP ;ТО цикл
RETURN ; ИНАЧЕ выход из процедуры
Рис. 9.4. Программа увеличения времени задержки
Примечание: все, сказанное выше, относится и к команде INCFSZ. Отличие - только в направлении счета (+1).