Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Целочисленная арифметика для PIC18
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
=GM=
Народ, предлагаю всем заинтересованным поделиться арифметическими подпрограммами общего пользования. Открываю топик программой деления беззнакового 24-битного числа на беззнаковое 24-битное число с получением 24-битного результата.
CODE

;File: DIV2424.ASM
;Title: The 24-bit Division Routine
;Version: 1.5
;Last updated: 29.05.08
;Author: GM
;Target: Microchip microcontroller of PIC18 family
;
;Support E-mail: pdp11@bk.ru
;
;DESCRIPTION
;This routine divides an unsigned 24-bit value by an unsigned
;24-bit value to get an unsigned 24-bit quotient
;using: call udiv2424
;processing time: 418-562 machine cycles
;input data:
; dividend - in variables dvd2,dvd1,dvd0(lsb)
; divisor - in variables dvs2,dvs1,dvs0(lsb)
;output data:
; quotient - in variables dvd2,dvd1,dvd0(lsb)
; remainder- in variables rmn2,rmn1,rmn0(lsb)
LIST P=PIC18F45J10
#include "P18F45J10.INC"

global udiv2424
extern dvd2,dvd1,dvd0
extern dvs2,dvs1,dvs0
extern rmn2,rmn1,rmn0
extern bitcnt

code
udiv2424
clrf rmn0 ;clear remainder
clrf rmn1
clrf rmn2
movlw .24 ;bit shift counter
movwf bitcnt
bcf STATUS,0
udiv241
rlcf dvd0
rlcf dvd1
rlcf dvd2
rlcf rmn0
rlcf rmn1
rlcf rmn2
movf dvs0,w ;rmn-dvs-->rmn
subwf rmn0,f
movf dvs1,w
subwfb rmn1,f
movf dvs2,w
subwfb rmn2,f
bc udiv242 ;Cy=1 if rmn>=0
movf dvs0,w ;rmn+dvs-->rmn
addwf rmn0,f
movf dvs1,w
addwfc rmn1,f
movf dvs2,w
addwfc rmn2,f
bcf STATUS,0
udiv242
decfsz bitcnt,f
bra udiv241
rlcf dvd0
rlcf dvd1
rlcf dvd2
return
end

Как видите, код достаточно компактный, и достаточно быстрый, по крайней мере в сети быстрее не нашёл. Ну, можно ещё немного ускорить, циклов на 50, с разумным увеличением размера программы. Немного позже добавлю программу деления 32/32-->32.
andrej2005
Да, темка интересная. Сейчас немогу, а через месяц здесь обязательно что-нибудь покажу. В сети примеров много, но не все они корректно работают, надо самому поковыряться.
=GM=
Цитата(andrej2005 @ May 29 2008, 12:30) *
В сети примеров много, но не все они корректно работают, надо самому поковыряться

Ну, я проверял, может и не в полном объёме. Вот обещанная программа беззнакового деления 32/32=32.
CODE

;File: DIV3232.ASM
;Title: The 32-bit Division Routine
;Version: 1.5
;Last updated: 29.05.08
;Author: GM
;Target: Microchip microcontrollers of PIC18 family
;Support E-mail: pdp11@bk.ru
;
;DESCRIPTION
;This routine divides an unsigned 32-bit value by an unsigned
;32-bit value to get an unsigned 32-bit quotient
;using: call udiv3232
;processing time: 684-940 machine cycles
;input data:
; dividend - in variables dvd3,dvd2,dvd1,dvd0(lsb)
; divisor - in variables dvs3,dvs2,dvs1,dvs0(lsb)
;output data:
; quotient - in variables dvd3,dvd2,dvd1,dvd0(lsb)
: remainder- in variables rmn3,rmn2,rmn1,rmn0(lsb)

udiv3232
clrf rmn0 ;clear remainder
clrf rmn1
clrf rmn2
clrf rmn3
movlw .32 ;bit shift counter
movwf bitcnt
bcf STATUS,0
udiv321
rlcf dvd0
rlcf dvd1
rlcf dvd2
rlcf dvd3
rlcf rmn0
rlcf rmn1
rlcf rmn2
rlcf rmn3
movf dvs0,w ;rmn-dvs-->rmn
subwf rmn0,f
movf dvs1,w
subwfb rmn1,f
movf dvs2,w
subwfb rmn2,f
movf dvs3,w
subwfb rmn3,f
bc udiv322 ;Cy=1 if rmn>=0
movf dvs0,w ;rmn+dvs-->rmn
addwf rmn0,f
movf dvs1,w
addwfc rmn1,f
movf dvs2,w
addwfc rmn2,f
movf dvs3,w
addwfc rmn3,f
bcf STATUS,0
udiv322
decfsz bitcnt,f
bra udiv321
rlcf dvd0
rlcf dvd1
rlcf dvd2
rlcf dvd3
return
end

Аналогов по скорости и компактности в сети не находил. Вот на этом сайте есть неплохая подборка по тематике ветки.
andrej2005
Цитата(=GM= @ May 29 2008, 18:44) *
Вот на этом сайте есть неплохая подборка по тематике ветки.


Да, да. Знаем-с.
=GM=
Добавлю ссылку до кучи. Вот здесь опубликовал ещё одну подпрограмму деления 16/8->16 для пик18. (Немного непатриотично по отношению к нашему сайту, но так получилось. Народ, поактивнее участвуйте)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.