Главная страница Комбинированное использование портов
include mpreg.h org 0 *******************************************************************************, SIGNED equ FALSE ; TRUE для версии со знаками, ; FALSE для версии без знаков. ******************************************************************************** ; Деление с двойной точностью (16 / 16 -> 16). : (АССЬ / АССа -> АССЬ остаток помещается в байт АССс). ; Частное помещается в байт АССЬ (ACCbHI. ACCbLO), а остаток в АССс (ACCcHI, ACCcLO). ; Предварительно надо убедиться, что делимое больше, чем делитель. D divS dloop nochk
; Проверяем, a > с? Если Ksb равны проверяем Lsb. Перенос * 1, если с > а. Разность (с - а) помещается в с.
********************************************************************************* ; Меняем знак АССа (-АССа -> АССа). nesLA comf ACCaLO incf ACCaLO btfsc STATUS,Z blt decf ACCaHI coraf ACCaHI retlw 0 ********************************************************************************* Раздел для деления со знаками. ; Устанавливаем бит переноса ; и сдвигаем в младший разряд.
Если msb = 1. меняем знак байта AOCb. Меняем знак байта АССЬ. decf ACCbHI conf ACCbHI chek A btfss ACCaHI,MSB ; Если MSB = 1, то меняем знак байта АССа. retlw О goto neg A ENDIF Тестовая программа. Загрузка констант в байты АССа и АССЬ для теста. main self movlw 1 movwf ACCaHI movlw OFF movwf ACCaLO movlw 07F movwf ACCbHI movlw OF movwf ACCbLO call D divS goto self org PIC54 goto main END Загрузка константы 01FF в байт АССа. Загрузка константы 7FFF в байт АССЬ. Остаток помещается в байтАССс. Здесь АССЬ = 0040 и АССс = 003F. Листинг 4.6 *********************************************************************** Деление 16 на 16 бит (быстрая версия). *********************************************************************** Деление: АССЬ (16 бит) / АССа (1ббит) -> АССЬ (16 бит). Остаток помещается в байты АССс (16 битов). (A) Делитель помещается в байты ACCaHI и ACCaLO (16 бит). (B) Делимое помещается в байты ACCbHI и ACCbLO (16 бит). (C) Вызов D div. (D) Частное (16 бит) помещается в байты ACCbHI и ACCbLO. (E) Остаток (16 бит) помещается в байты .ACCcHI и ACCcLO. Показатели: памяти: 370; количество циклов: 263. Показатели указаны для версии без знаков, то есть со строкой SIGNED equ FALSE. Программа соответствует инструкции по применению AN526 фирмы Microchip. tt******************************************************************************* ACCaLO equ Ю ACCaHI equ 11 АССЫО equ 12 ACCbHI equ 13 , . ACCcLO equ 14 ACCcHI equ 15 ACCdLO equ 16 ACCdHI equ 17 taip equ 18 sign equ 19 include nipreg.h org 0 ;**********************************************t*********,***t**t***t************* SIGNED equ FALSE ; TRUE для версии с учетом знаков. ; FALSE для версии без учета знаков. ********************************* ***************t******,,,,,, Макрос деления. divNac MACRO
retlw 0 t**************************i t**************************************
>*********♦******** ; Проверка знака. ; Меняем знак байта АССа (-АССа -> ADCa). *************** *1r**************************t******t-k*ttt-k**-k-k***-kt*l:******1,tttl,1,i Раздел скомпонован только для случая деления со знаками. SIGNED S.SIGN movf ACCaHI.w xorwf ACCbHI.W movwf sign btfss ACCbHI.MSB ; Если старший бит равен единице, ; меняем знак байта АССЬ. chek А goto ; Изменение байта АССЬ. Вызов макроса divMac 16 раз. comf ACCbLO incf ACCbLO btfsc STATUS.Z bit decf ACCbHI comf ACCbHI chek A btfss ACCaHI.MSB ; Если младший бит равен единице, меняем знак байта АССа. retlw О goto neg A ENDIF
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |