;*************************
; * ФУНКЦИЯ: Формирует задержку длительностью 1 мс *
; * при частоте резонатора 4 МГц *
; * ВХОД: Нет *
; * ВЫХОД: Изменяются флаги и W *
;**********************
N equ d’249’; Параметр задержки, см. текст
DELAY_1MS
movlw N; Инициализируем цикл 1~
; ЦИКЛ -----------------
D_LOOP
addlw -1; Декрементируем счетчик N-
btfss STATUS,Z; Проверяем: равен нулю? N+1~
goto D_LOOP; ЕСЛИ нет, ТО повторяем 2*(N—1)~
; -------------------------
return
Чтобы вычислить общее число машинных циклов, которое тратится на выполнение подпрограммы, и, таким образом, определить величину N, нужно оценить, сколько времени выполняется та или иная команда подпрограммы:
1. Команда call DELAY_1MS, используемая для перехода к подпрограмме, выполняется за 2 машинных цикла.
2. Команда movlw, предшествующая входу в цикл, выполняется за один машинный цикл.
3. Команды addlw, декрементирующие содержимое рабочего регистра, затрачивают в общей сложности
4. Команда btfsc STATUS,Z, проверяющая состояние флага Z (не стал ли W равен нулю после предыдущего декрементирования?), также выполняется
5. Поскольку выход из цикла происходит за счет пропуска команды goto, она выполняется только
6. Заключительная команда return выполняется за 2 цикла.
Таким образом, общее число циклов равно
2(call) + 1(movlw) +
Приравняв это выражение числу 1000, получим
2 + 1 +
4 + (4 х
4 x
Наша подпрограмма задержки в значительной степени ограничена тем, что рабочий регистр, как и все регистры данных микроконтроллеров PIC, является 8-битным, т. е. максимальное значение N равно b’11111111’, или десятичному 255. На самом деле значение
Задержку можно немного увеличить, добавляя в тело цикла команды пор (нет операции). Каждая команда пор добавляет один машинный цикл, не влияя при этом на флаги регистра STATUS. Таким образом, вставка после команды addlw -1 четырех команд пор, как показано в Программе 6.2, даст суммарную задержку длительностью 4 + 8 х
; ***********************
; * ФУНКЦИЯ: Формирует задержку длительностью 2 мс *
; * при частоте резонатора 4 МГц… *
; * ВХОД: Нет *
; * ВЫХОД: Изменяются флаги и W *
; ***********************
N equ d’249’; Параметр задержки, см. текст
DELAY_2MS
movlw N; Инициализируем цикл 1~
; ЦИКЛ ----------------
D_LOOP
addlw -1; Декрементируем счетчик N~
nop; Добавляем четыре дополнительных N~
nор; цикла с помощью команд N~
nор; «нет операции» N~
nop; N~
btfss STATUS,Z; Проверяем: равен нулю? N+1~
goto D_LOOP; ЕСЛИ нет, ТО повторяем 2*(N-1)~
; ------------------------
return