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

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

(B) Мантисса второго операнда помещается в байты ACCbLO и ACCbHI (16 бит), порядок - в ЕХРЬ (8 бит).

(C) Вызов F sub.

(D) Мантисса результата помещается в байты ACCbLO и ACObLHI (16 бит), порядок - в ЕХРЬ (8 разрядов).

Объем занимаемой памяти: 61 ячейка.

**************************************t ***********************************tt Умножение:

АССЬ (16 битов) ЕХР(Ь) . АССа (16 бит) ЕХРа -> АССЬ (16 битов) ЕХРЬ.

(A) Мантисса первого операнда помещается в байты ACCaLO и ACCaHI (16 бит), порядок - в ЕХРа (8 бит).

(B) Мантисса второго операнда помещается в байты ACCbLO и ACCbHI (16 бит), порядок - в ЕХРЬ (8 бит).

(C) Вызов F nipy.

(D) Мантисса результата помещается в байты ACCbLO и ACCbLHI (16 бит), порядок - в ЕХРЬ (8 разрядов).

Получение 32-разрядного результата (мантиссы) возможно при замене строки

Мос1е16 equ TRUE на Model6 equ FALSE.

В этом случае 32-разрядная мантисса результата будет

размещена в байты ACCbHI, ACCbLO, ACCcHI, ACCcLO, a порядок - в ЕХРЬ.

Объем программной памяти: 102 ячейки.

Программа соответствует инструкции по применению AN526 фирмы Microchip. ****************************************************************************

AOCaLO

ACCaHI

ЕХРа

ACCbLO

ACCbHI

ЕХРЬ

ACCcLO

ACCcHI

ACCdLO

ACCdHI

temp

sign

include mpreg.h

Hodeie equ TRUE org 0

; FALSE для умножения с 32-разрядной мантиссой.

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

рцчятание чисел с плавающей запятой (АССЬ - АССа -> АССЬ)

scloop

call

neg A ;

Изменение знака байта АССа и сложение.

raovf

EXPa.w

subwf

EXPb,w ;

Выбор наибольшего порядка.

btfsc

STATUS,Z bit

goto

padd ;

Порядки равны.

btfsc

STATUS, CARRY

call

F swap ;

Если А > В, то меняем их местами.

movf

EXPa.w

subwf

EXPb

call

shftSR

incfsz

EXPb

goto

scloop

movf

EXPa.w

movwf

EXPb

movf

ACCaHI.w

iorwf

ACCbHI.W

movwf

sign

call

D add ;

Сложение с двойной точностью.,

btfss

sign,MSB

btfss

ACCbHI,MSB

retlw

STATUS,CARRY

incf

EXPb

goto

shftR

******************************* * *******1,**1,1,***1,1r**mt* ********** t***************

Вычитание с двойной точностью (АССЬ - АССа -> АССЬ).

call

neg A ;

movf

ACCaLO. w ;

addwf

ACCbLO ;

btfsc

STATUS, CARRY;

incf

ACCbHI

movf

ACCaHI.w

addwf

ACCbHI ;

retlw

****** *** *** *********************♦****♦*******♦************** ******♦**** .***

tSft bcf STATUS, CARRY

btfsc ACCbHI,MSB ,

bsf STATUS.CARRY



shftR

shftSL

ACCbHI

ITOVWf

, ACCbLO

ACCbLO

movlw

retlw

addwf

EXPb

STATUS,CARRY

goto

finup

Hodeie

ftoemovf

IBOVWf

ACCbLO, w ACCbHI

ACCcLO

movf

ACCcHI, w

ACCcHI

movwf

ACCbLO

endif

nrovlw

ACCbLO

addwf

EXPb

rlf bcf

ACCbHI ACCbHI,MSB

ENDIF

btfsc

retlw

STATUS,CARRY ACCbHI,MSB 0

finup btfss goto

sign,MSB F norm

** ******in,ti,i,m,t ******** tiittttttiitticiitttti,* ***********************************

Умножение с плавающей запятой:

АССЬ (16 битов) ЕХР(Ь) . АССа (16 битов) ЕХРа -> АССЬ (16 битов) ЕХРЬ. F nipy

ACCdLO

btfsc

STATUS, CARRY

; Сложение необходимо?

call

D add

ACCbHI

ACCbLO

ACCcHI

ACCcLO

decfsz

temp

; Цикл по всем битам.

goto

mloop

movf

EXPa.w

addwf

EXPb

Hodeie

movf

ACCbHI

btfss

STATUS,Z blt

goto

finup

; Если байт ACCbHI не равен 0.

movf

ACCbLO

btfss

STATUS, Z bit

goto

ShftOe

; Если байт ACCbLO не равен 0 и ACCbHI

movf

ACCcHI,w

movwf

ACCbHI

; Если АССЬ = 0, тогда

; содержимое байта АССс геремещается в

movf

ACCcLO. w

neg B

decf

comf

btfsc

decf

comf

btfsc

decf

comf

btfsc

decf

comf

goto

ACCcLO ACCcLO STATUS,Z bit ACCcHI ACCcHI

STATUS,Z bit

ACCbLO ACCbLO STATUS,Z.bit ACCbHI ACCbHI

F norm

Изменение знака байта АССс.

; Изменение знака байта АССЬ.

; Для 16-ти сдвигов.

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

movlw

movwf

temp

movf

ACCbHI, w

movwf

ACCdHI

movf

ACCbLO,w

roovwf

ACCdLO

clrf

ACCbHI

clrf

ACCbLO

retlw

; Обнуление байта АССЬ (ACCbLO и ACCbHI). *********************************************************************************



neg A comf ACCaLO ; Изменение знака байта АССа (-АССа -> АССа).

incf ACCaLO

btfsc STATUS,Z.bit

decf ACCaHI

comf ACCaHI

retlw 0

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

t**************************************************************************t***t Подпрограмма нормализации.

Нормализует байт АССЬ для использования в операциях с плавающей запятой. Эта подпрограмма максимизирует мантиссу и уменьшает порядок, что позволяет достичь максимальной точности.

movf

ACCbHI

btfss

STATUS,Z bit

goto

C.norm

movf

ACCbLO

btfsc

STATUS,Z bit

retlw

btfsc

ACCbHI,6

retlw

call

shftSL

decf

EXPb

goto

C norm

J*************************************************************** *****************

еняеи местами байты АССа и АССЬ [(АССа.ЕХРа) <-> (АССЬ,ЕХРЬ)].

ACCaHI <-> ACCbHI.

movf

ACCaHI,W

xorwf

ACCbHI,W

movwf

sign

btfss

ACCbHI. MSB

; Если MSB = 1, меняем знак байта АССЬ.

goto

chek A

comf

ACCbLO

; Изменение знака байта АССЬ.

incf

ACCbLO

btfsc

STATUS.Z bit

decf

ACCbHI

comf

ACCbHI

btfss

ACCaHI,MSB

; Если MSB = 1, меняем знак байта АССа.

retlw

goto

neg A

movf

ACCaHI,w

raovwf

temp

movf

ACCbHI,w

movwf

ACCaHI

movf

temp,w

movwf

AOCbHI

movf

ACCaLO,w

movwf

temp

IBOVf

ACCbLO.w

movwf

AOCaLO

movf

temp.w

movwf

ACCbLO

movf

EXPa.w

movwf

temp

movf

EXPb.w

movwf

EXPa

movf

temp.w

movwf

EXPb

retlw

ACCaLO <-> ACCbLO.

EXPa <-> EXPb.

***********************************************t**t***************************** Тестовая программа.

************************************************** ti,*t****i,i,*t**i,**** *********** Загрузка констант в байты (АССа, ЕХРа) и (АССЬ. ЕХРЬ) для тестирования.

; Загрузка константы 01FF ЕХР(4) в байт АССа.

movlw

movwf

ACCaHI

movlw

movwf

ACCaLO

movlw

movwf

EXPa

movlw

movwf

ACCbHI

movlw

movwf

ACCbLO

movlw

; Загрузка константы 7FFF EXP(6) в байт АССЬ.



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.
Копирование материалов разрешено исключительно при условии цититирования.