N equ d’51’; Параметр задержки
DELAY_208 movlw N; Берем параметр задержки, 1~
D_LOOP addlw -1; Декрементируем счетчик N~
btfss -1; STATUS,Z; Пропускаем, ЕСЛИ ноль, N +1~
goto; D_LOOP; ИНАЧЕ повторяем, 2*(N-1)~
return; Выходим, 2~
В Программе 6.3 мы познакомились с подпрограммой, формирующей задержку номинальной длительностью 100 мс. Причем длительность этой задержки была подсчитана довольно приблизительно, так как мы просто умножили величину задержки, формируемую основным блоком (1 мс), на число проходов внешнего цикла, равного 100. Вычислите точную задержку при использовании 4-МГц резонатора и определите величину ошибки (в процентах).
Решение
Просматривая приведенный ниже текст подпрограммы, мы можем вычислить общее количество машинных циклов, основываясь на времени выполнения каждой команды и ее положении относительно тела цикла.
; Два цикла на переход к подпрограмме 2~
DELAY_100MS
movlw d’100’; 1~
movwf COUNT1; 1~
; Внешний цикл --------------
DELAY_1MS
movlw 249; Эта команда выполняется 100 раз, 100*1~
; Внутренний цикл -----------
D LOOP
addlw -1; 249 раз по 100 249*100~
btfss STATUS,Z; плюс один раз при пропуске 250*100~
goto D_LOOP; 248 раз по 2- и по 100 раз 248*2*100~
; ---------------------------------
decfsz COUNT1,f; 10 плюс один при пропуске 100+1~
goto DELAY_1MS; 99 раз 2*99~
; ---------------------------------
return ; 2~
В результате мы получим 99 905 циклов. Это на 95 меньше требуемого. Таким образом, ошибка составляет — (95/100000) x 100 = -0.95%
Одна команда пор, размещенная перед командой decfsz COUNT1,f, даст нам дополнительные 100 циклов. В результате длительность задержки будет равна 100.05 мкс, что соответствует ошибке +0.005 %.
Для полноты картины необходимо написать подпрограмму, формирующую минутную задержку.
Решение
Шестидесятисекундную задержку можно реализовать как 240 х 255 мс. Наше решение, код которого приведен в Программе 6.10, будет иметь точно такую же структуру, как и подпрограмма формирования задержки длительностью
25 с. Задав теперь количество повторений внешнего цикла, равное 240, мы получим требуемые 60 с задержки.
COUNT1 equ h’30’; Счетчики в регистре h’30’
COUNT2 equ h’31’; и h’31’
; *********************************
; * ФУНКЦИЯ: Формирует задержку длительностью ~ 1 мин при частоте резонатора 4 МГц *
; * ВХОД: Нет *
; * ВЫХОД: W и STATUS изменяются *
; * Регистры h’34:35:36’ обнуляются *
; **********************************
DELAY_1_MIN
movlw d’240’; Инициализируем внешний цикл 1~
movwf COUNT2; 1~
DELAY_250MS
movlw d’250’; Инициализируем средний цикл 1~
movwf COUNT1; для задержки 250 мс 1~
;Внутренний цикл (1 мс)
DELAY_1MS
movlw d’249’; 250*240~
D_LOOP addlw -1; 249*250*240~
btfss STATUS,Z; (249+1)*250*240~
goto D_LOOP; (2*(249+1)*250*240)~
decfsz COUNT1,f; (250+1)*240~
goto DELAY_1MS; 2*(250-1)*240~
decfsz COUNT2,f; 240+1~
goto DELAY_250MS; 2*(240-1)~
return; 2~