#define FREQ d’401; Задается программистом как множитель 100 кГц
org h’50’; Код начинается с адреса h’50’
; ************************************************
; * ФУНКЦИЯ: Поворот ротора на заданный угол (1…256 шагов) *
; * ВХОД: Число шагов в STEP *
; * ВХОД: Номер текущего вектора магнитного поля в POSITION *
; * ВЫХОД: POSITION обновляется, STEP = -1, W изменяется *
; * РЕСУРСЫ: Подпрограммы PATTERN, DELAY_10MS *
; *************************************************
MOTOR incf POSITION,w; Берем следующий вектор
andlw b’00000111’; Делим по модулю 8
movwf POSITION; Корректируем
call PATTERN; Получаем управляющий код
movwf PORTA; Выдаем на шаговый двигатель
call DELAY_10MS; Ждем 10 мс
decfsz STEP,f; Декрементируем число шагов,
goto MOTOR;пока не станет равно 0
return
; *************************************************
; * ФУНКЦИЯ: Преобразует целое число 0… 7 в управляющий код *
; * ВХОД: Целое число от 0 до 7 в W *
; * ВЫХОД: Код для управления обмотками ШД в W *
; *************************************************
PATTERN addwf PCL,f; Изменяем счетчик программ
retlw b’1000’; Север
retlw b’1100’; Северо-восток
retlw b’0100’; Восток
retlw b’0110’; Юго-восток
retlw b’0010’; Юг
retlw b’0011’; Юго-запад
retlw b’0001’; Запад
retlw b’1001’; Северо-запад
; *************************************************
; * ФУНКЦИЯ: Формирует 10-мс задержку, не зависящую от тактовой частоты *
; * ВХОД: Значение тактовой частоты, деленное на 100 кГц, в TEMP *
; * ВЫХОД: 10-мс задержка; DELAY обнуляется, W изменяется *
; *************************************************
DELAY_10MS
movlw FREQ; Тактовая частота указывается
movwf TEMP; программистом
; Цикл 10-мс задержки при тактовой частоте 100 кГц (1 цикл = 40 мкс)
DLOOP1 movlw d’62’ ; Счетчик цикла
movwf DELAY
DLOOP2 decf DELAY,f; 62*40 мкс
btfss STATUS,Z; 62*40 мкс
goto DLOOP2; 62*80 мкс
decfsz TEMP,f ; Декрементируем параметр и повторяем,
goto DLOOP1; пока он не станет равным нулю
return
DELAY_10MS
Эта подпрограмма формирует задержку длительностью 10 мс, независимую от частоты резонатора. Значение частоты задается программистом константой FREQ посредством директивы #define. Данная константа представляет собой множитель, равный значению тактовой частоты, деленной на 100 кГц. К примеру, для 8-МГц резонатора константа FREQ будет равна 80.
В основе подпрограммы лежит цикл, формирующий задержку длительностью 10 мс при тактовой частоте 100 кГц, т. е. при длительности машинного цикла, равной 40 мкс. Этот цикл повторяется FREQ раз. Так, в нашем примере с 8-МГц резонатором длительность базового цикла будет равна 10/80 мс, однако этот цикл будет повторен 80 раз, что и даст нам искомые 10 мс.
Доработайте функцию дешифратора клавиатуры из Программы 11.4, добавив к нему процедуру подавления дребезга подобно тому, как это было сделано в Программе 11.3.
Решение