; *************************************
; * ФУНКЦИЯ: Перемножает два байта и возвращает *
; * 2-байтное произведение *
; * ПРИМЕР: MULTIPLICAND = h’10’, MULTIPLIER = h’FF’ *
; * PRODUCT_H: PRODUCT_L = h’0FF0’ (d’16 x 255 = 4080’) *
; * ВХОД: MULTIPLICAND = PSP, MULTIPLIER = PSP-1 *
; *: FSR указывает на следующий после MULTIPLIER регистр *
; * ВЫХОД: PRODUCT_H = PSP-3, PRODUCT_L = PSP-4 *
; * ВЫХОД: Изменяются W и STATUS *
; **************************************
; При вызове FSR ---> MULTIPLICAND_H (старший байт множимого)
; Задачи 1 и 2: Расширить множимое и обнулить произведение
MUL_S clrf INDF
decf FSR,f; FSR ---> PRODUCT_L
clrf INDF
decf FSR,f; FSR ---> PRODUCT_H
clrf INDF
decf FSR,w; Теперь устанавливаем указатель
movwf PSP; на нижнюю границу фрейма
; Задача 3: ВЫПОЛНЯТЬ
; Задача 3а: Сдвинуть множитель на один бит вправо
incf FSR,f;
incf FSR,f;
incf FSR,f; FSR ---> MULTIPLICANDS
MUL_LOOP bcf STATUS,С; Сбрасываем флаг переноса
rrf INDF,f
; Задача 3б: ЕСЛИ С == 1, TO прибавить множимое к произведению
btfss STATUS,С; ЕСЛИ С == 1, ТО выполняем сложение
goto MUL_COMT; ИНАЧЕ пропускаем эту операцию
incf FSR,f; JSR ---> MULTIPLICAND
movf INDF,w; Выполняем сложение
decf F5R,f
decf FSR,f
decf FSR,f; FSR ---> PRODUCT_L
addwf INDF,f: Сначала младшие байты
decf FSR,f; FSR ---> PRODUCT_H
bcfsc STATUS,С; ЕСЛИ нет переноса, переходим к старшим байтам
incf INDF,f; ИНАЧЕ учитываем перенос
incf FSR,f
incf FSR,f; FSR ---> MULTIPLICANDS
movf INDF,w; Теперь старшие байты
decf FSR,f
decf FSR,f; FSR ---> PRODUCT_H
addwf INDF,f
; Задача 3в: Сдвинуть множимое на один бит влево
MUL_CONT movf PSP,w; Устанавливаем FSR на нижнюю границу фрейма
addlw 5
movwf FSR; FSR ---> MULTIPLICAND
bcf STATUS,С; Сбрасываем бит переноса
rlf INDF,f
decf FSR,f
decf FSR,f; FSR ---> MULTIPLICANDS
rlf INDF,f
; ПОКА множитель не равен нулю
incf FSR,f; FSR ---> MULTIPLIER
movf INDF,f; Проверяем множитель на равенство нулю
btfss STATUS,Z
goto MUL_LOOP; ЕСЛИ не ноль, TO повторяем вычисления
; Задача 4: Очистка стека
movlw 5; Устанавливаем FSR на верхнюю границу фрейма,
addwf PSP,f; прибавляя 5 к указателю PSP
return; Выходим из подпрограммы
Напишите подпрограмму, формирующую фиксированную задержку длительностью 208 мкс. Частота тактового сигнала процессора составляет 4 МГц.
Решение
Для коротких временных интервалов, сравнимых с заданным, наилучшим решением будет код, приведенный в Программе 6.1.
При частоте 4 МГц длительность машинного цикла равна 1 мкс, соответственно нам потребуется 208 машинных циклов. Воспользовавшись формулой со стр. 176, получим
4 + 4 х
4 x
Чему будет равно