;*************************
; * ФУНКЦИЯ: Формирует задержку длительностью 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(cal
l) + 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