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

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

в листингах 4.1 и 4.2 вам предлагаются две версии програм

♦ быстрая версиятребует 35 ячеек памяти и исполняется за 37 мандных циклов;

♦ компактная версия требует 16 ячеек памяти и исполняется за 7 командный цикл.

Перемножаемые числа задаются переменными mulplr и mulcntj Результат будет предоставлен в двух байтах H byte и L byi:e, где Н Ьу te - старший байт произведения.

Листинг 4.1

*♦* ****♦******♦*******♦♦ ************************* **************************♦**

Умножение 8x8 битов (компактная версия).

************ **************************************************************** (,

Множитель должен быть загружен в переменную mulplr. Множимое должно быть загружено в переменную mulcnd. Результат помещается в байты H byte и L byte.

Показатели:

объем программной памяти: 15; количество циклов: 71; объем используемого ОЗУ: 0.

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

mulcnd

; Множимое восьми битов.

mulplr

; Множитель восьми битов.

H byte

; Старший байт результата.

Lbyte

; Младший байт результата.

count

; Счетчик циклов.

include mpreg.h

;*****

******>*

* Начало умножения ***.****..*...**.....*****************

mpy S

clrf

H byte

clrf

L byte

movlw

movwf

count

movf

mulcnd,w

STATUS,CARRY

Сброс переноса.

loop

mulplr

btfsc

STATUS,CARRY

addwf

H byte, Same

rrf H byte,Same ; rrf L byte,Same ;

decfsz count ; goto loop ;

retlw 0 ;

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

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

.tttt*************************************************

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

iain movlw movwf movlw movwf

mulplr OF

mulcnd

call mpy S

Множитель равен OFF. Множимое равно OFF.

Результат OFF * OPF = FE01 помещается в H byte и L byte.

self goto self

org 01FF

goto main

Листинг 4.2

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

Умножение 8x8 битов (быстрая версия).

********************** *********<, *****************************************<

Множитель должен быть загружен в переменную mulplr. Множимое должно быть загружено в переменную mulcnd. Результат помещается в байты H byte и L byte.

Показатели: объем памяти: 35; количество циклов: 37; объем используемого ОЗУ: 0.

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

lend EQU 09 ; Множимое. Iper EQU 10 ; Множитель.



H byte EQU 12 L byte EQU 13

; Старший байт результата. ; Младший байт результата.

include mpreg.h

Определение макроса сложения и сдвига вправо.*********************

mult MACRO bit ; Начало макроса,

btfsc mulplr, bit

addwf H byte, Same

rrf H byte, Same

rrf L byte, Same BJDM ; Конец макроса.

;.********.****** Начало умножения **********************************

mpy F clrf H byte clrf L byte movf mulcnd.w bcf STATUS.CARRY;

Множимое помещается в регистр W. Сброс переноса.

mult О

mult 1

mult 2

mult 3

mult 4

mult 5

mult 6

mult 7

retlw 0

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

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

****♦* ***** ******* ***♦***♦****♦♦****♦******************************

movlw

movwf

mulplr

movlw

movwf

mulcnd

call

mpy F

goto

self

01FF

goto

main

; Результат OFF * OFF = FE01 ; помещается в H byte и L byte.

00oe и беззнаковое умножение Зарядных чисел

подпрограмма вычисляет произведение двух 16-разрядных чи-формирует 32-разрядный результат. Подпрограмма использует jjoMCHOCTH условного ассемблирования, имеющиеся в ассемблере JJpALC фирмы Microchip. Для получения беззнакового варианта ум-дия достаточно ассемблировать подпрограмму с командой:

Signed equ FALSE

д чтобы получать знаковое умножение, надо всего лищь заменить эту строку: Signed equ TRUE

Две версии подпрограммы даны в листингах 4.3 и 4.4:

быстрая версия: требует 240 ячеек программной памяти и выполняется за 233 командных цикла;

Ф компактная версия: требует 33 ячейки программной памяти и выполняется за 333 командных цикла.

Обе подпрограммы оперируют с двумя 16-разрядными числами, одно из которых образуют байты ACCaLO и АССаШ, а другое - АССЫО иАССЬНГ. Байты HI - старшие байты чисел (high). Результатразмеща-етсявчетырехбайтах ACCbHI, АССЫО, АССсНТи ACCcLO, где ACCbHI - старший байт произведения.

Лиаинг4.3

************** ttt*tll********t******************t,*r1ll******1,,,1,t,,,,,.,,j,.,,,

Умножение 16x16 разрядов (компактная версия).

************************* ******** t ,t* ************ *******

Умножение АССЬ (16 битов) * АССа (16 битов) -> АССЬ.АССс (32 бита)

(А) Первый операнд помещается в байты ACCaLO и АССаН! (16 битов). (8) Второй операнд помещается в байты ACCbLO и ACCbHI (16 битов). (С) Вызов - D mpy.

(0) Результат помещается в байты ACCbHI, ACCbLO, ACCcHI. ACCcLO. Показатели:

*ем памяти: 33 ячейки; личество циклов: 333.

Показатели указаны для версии без учета знаков, т.е. с кoмaдoй Signed equ FALSE. Рограмма соответствует инструкции по применению AN526 фи)ны Microchip.



ft **** *Jt*4* *********

k**ir************* ********

ACCaLO

ACCaHI

ACCbLO

ACCbHI

ACCcLO

ACCcHI

ACCdLO

ACCdHI

temp

sign

Flags

include mpreg.h org 0

SIGNED equ TRUE ; TRUE для версии с учетом знаков,

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

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

D add bcf Flags,CARRY ; Сброс переноса

movf ACCaLO,w ; Сложение (АССЬ + АССа -> АССЬ). addwf ACCbLO ;

btfsc STATUS,CARRY; Прибавление переноса.

incf ACCbHI

btfsc STATUS,CARRY

bsf Flags,CARRY

movf ACCaHI,w

addwf ACCbHI

btfsc Flags, CARRY

bsf STATUS,CARRY

retlw 0

Умножение с двойной точностью (16x16 -> 32). (АССЬ * АССа -> АССЬ, АССс): результат представляется в 32 битах, старшие разряды помещаются в байты АССЬ (ACCbHI, ACCbLO), младшие - в АССс (ACCcHI, ACCcLO).

D mpyS ; Результат помещается в АССЬ(16 Msb) и АССс(16 Isb). F SIGNED call S.SIGN ENDIF

ACCdLO :

Правый сдвиг.

btfsc

STATUS,CARRY ;

Проверка бита переноса.

call

D add ;

Вызов переменной D add. -

ACCbHI ;

Правый сдвиг.

ACCbLO .;

Правый сдвиг.

ACccHI ;

Правый сдвиг.

ACccLO ;

Правый сдвиг.

decfsz

temp ;

Декрементирование и проверка на 0.

goto

mloop ;

Повтор.

SIGNED

btfss

sign,MSB

retlw

comf

ACCCLO ;

Инвертирование байта ACCbLO.

incf

ACCCLO

btfsc

STATUS,Z bit

decf

ACCcHI

comf

ACCcHI

btfsc

STATUS.Z bit

comf

ACCbLO ;

Инвертирование байта ACCbLO.

incf

ACCbLO

btfsc

STATUS, Z bit

decf

ACCbHI

comf

ACCbHI ;

Инвертирование байта ACCbHI.

retlw

ELSE

retlw

ENDIF

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

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

movlw

movwf

temp

movf

ACCbHI,w ;

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

movwf

ACCdHI

movf

ACCbLO.w

movwf

ACCdLO

clrf

ACCbHI

clrf

ACCbLO

retlw

mloop

call setup

rrf ACCdHI

; Правый сдвиг.

* **♦***** *

Ш comf incf btfsc decf comf

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

ACCaLO ; Изменение знака (дополнение) ACCaLO. ACCaLO

STATШ,Z bit ACCaHI ACCaHI



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