Главная страница  Комбинированное использование портов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ 22 ] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

ACCcHI

ACCdLO

ACCdHI

temp

sign

include mpreg.h org 0

*******************************************************************************, SIGNED equ FALSE ; TRUE для версии со знаками,

; FALSE для версии без знаков.

********************************************************************************

; Деление с двойной точностью (16 / 16 -> 16).

: (АССЬ / АССа -> АССЬ остаток помещается в байт АССс).

; Частное помещается в байт АССЬ (ACCbHI. ACCbLO), а остаток в АССс (ACCcHI, ACCcLO). ; Предварительно надо убедиться, что делимое больше, чем делитель.

D divS

dloop

nochk

SIGNED

CALL

S SIGN

ENDIF

call

setup

clrf

ACCcHI

clrf

ACCcLO

STATUS.CARRY

ACCdLO

ACCdHI

ACCcLO

ACCcHI

movf

ACCaHI.w

subvirf

ACCcHI,w

btfss

STATUS,Z bit

goto

nochk

movf

ACCaLO,w

sutwf

ACCcLO,w

btfss

STATUS.CARRY

goto

подо

(novf

ACCaLO,w

subwf

ACCcLO

btfss

STATUS,CARRY

decf

ACCcHI

movf

ACCaHI.w

subwf

ACCcHI

STATUS.CARRY

; Проверяем, a > с?

Если Ksb равны проверяем Lsb. Перенос * 1, если с > а.

Разность (с - а) помещается в с.

ACCbLO

ACCbHI

decfsz

temp

Цикл no всем разрядам.

goto

dloop

SIGNED

btfss

sign, msb ;

Проверка знака.

retlw

goto

neg B ;

Меняем знак байта АССа (-АССа -> АССа).

ELSE

retlw

ENDIF

****************************

*********************************************

movlw

.16 ;

Для 16-ти повторов.

movwf

temp

movf

ACCbHI,w

Содержимое байта АССЬ перемещается в ACCd.

movwf

ACCdHI

movf

ACCbLO,w

movwf

ACCdLO

clrf

ACCbHI

clrf

ACCbLO

retlw

*********************************************************************************

; Меняем знак АССа (-АССа -> АССа).

nesLA comf ACCaLO

incf ACCaLO

btfsc STATUS,Z blt

decf ACCaHI

coraf ACCaHI

retlw 0

********************************************************************************* Раздел для деления со знаками.

; Устанавливаем бит переноса ; и сдвигаем в младший разряд.

SIGNED

movf

ACCaHI,W

xorwf

ACCbHI,W

movwf

sign

btfss

ACCbHI.msb

goto

chek A

comf

ACCbLO

incf

ACCbLO

btfsc

STATUS,Z bit

Если 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

LOCAL

NOCHK

LOCAL

NOGO

STATUS,CARRY

ACCdLO

ACCdHI

ACCcLO

ACCcHI

movf

ACCaHI,w

subwf

ACCcHI, w ;

btfss

STATUS.Z bit

goto

NOCHK

movf

ACCaLO, w

subwf

ACCcLO.w ;

btfss

STATUS.CARRY;

goto

NOGO

movf

ACCaLO.w ;

subwf

ACCcLO

btfss

STATUS,CARRY



decf AOCcHI

dlvNac

movf ACCaHI.w

divNac

sutMf ACCcHI

dlvMac

bsf STATUS,CARRY; Установка бита переноса.

dlvMac

NOGO rlf ACCbLO

dlvHac

rlf ACCbHI

divMac dlvHac

ENDM

divMac

************ **************

divMac divMac

; Деление с двойной точностью (16 / 16 -> 16).

divMac

; (АССЬ / АССа -> АССЬ, остаток помещается в АССс.)

divMac

; Частное помещается в АССЬ (ACCbHI,ACCbLO), а остаток в АССс (ACCcHI, ACCcLO).

divMac

di\c

; До вызова этой подпрограммы надо убедиться, что делимое больше, чем делитель.

divMac

divNac

setup movlw .16 ;

Для 16-ти переносов.

movwf temp

SIGNED

movf ACCbHI,w ;

Перемещение байта АССЬ в ACCd.

btfss

sign, MSB

movwf ACCdHI

retlw

movf ACCbLO,w

goto

neg B

movwf ACCdLO

ELSE

clrf ACCbHI

retlw

clrf ACCbLO

ENDIF

retlw 0

t**************************i

t**************************************

neg A comf

ACCaLO ;

incf

ACCaLO

btfsc

STATUS,Z bit

decf

ACCaHI

comf

ACCaHI

retlw

**************

D divF

SIGMED

CALL

S.SIGN

ENDIF

call

setup

clrf

ACCcHI

clrf

ACCcLO

>*********♦********

; Проверка знака.

; Меняем знак байта АССа (-АССа -> 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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ 22 ] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

© 2000 - 2022 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.