реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Целочисленная арифметика для PIC18, деление 24/24=24, 32/32=32
=GM=
сообщение May 29 2008, 13:14
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Народ, предлагаю всем заинтересованным поделиться арифметическими подпрограммами общего пользования. Открываю топик программой деления беззнакового 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.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
andrej2005
сообщение May 29 2008, 13:30
Сообщение #2





Группа: Новичок
Сообщений: 14
Регистрация: 20-04-08
Пользователь №: 36 922



Да, темка интересная. Сейчас немогу, а через месяц здесь обязательно что-нибудь покажу. В сети примеров много, но не все они корректно работают, надо самому поковыряться.

Сообщение отредактировал andrej2005 - May 29 2008, 13:33
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 29 2008, 14:44
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(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

Аналогов по скорости и компактности в сети не находил. Вот на этом сайте есть неплохая подборка по тематике ветки.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
andrej2005
сообщение May 29 2008, 14:48
Сообщение #4





Группа: Новичок
Сообщений: 14
Регистрация: 20-04-08
Пользователь №: 36 922



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


Да, да. Знаем-с.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 27 2009, 10:59
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Добавлю ссылку до кучи. Вот здесь опубликовал ещё одну подпрограмму деления 16/8->16 для пик18. (Немного непатриотично по отношению к нашему сайту, но так получилось. Народ, поактивнее участвуйте)


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016