dzielnie liczby 16 bitowej na 8051



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "yo!rek" <jarekz_at_nospam_kki.net.pl>
Subject: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 02:43:47 +0100


cze.
mój nastęny problem dotyczący pracy dyplomowej: jak podzielić liczbe 16
bitową (wartość z licznika T0 lub T1) przez coś (konkretnie 20 w moim
przypadku). chodzi mi o gotowe procedury, jeśli ktos ma, bo na 8052.com
napisali że są skomplikowane i tyle :(((

a w drodze jeszcze kilka problemów :))

--
yo!rek
jarekz_at_nospam_kki.net.pl
http://yorek.prawda.org



Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 09:59:59 +0100


Witam,

"yo!rek" wrote:

mój nastęny problem dotyczący pracy dyplomowej: jak podzielić liczbe 16
bitową (wartość z licznika T0 lub T1) przez coś (konkretnie 20 w moim
przypadku). chodzi mi o gotowe procedury, jeśli ktos ma, bo na 8052.com
napisali że są skomplikowane i tyle :(((

Kłamali. To nie jest skomplikowane. Dzielenie jest dokładnie takie
samo, jak dzielenie w słupku, to z podstawówki, tylko podstawą nie jest 10
a 2. Nie dam Ci gotowej procedury pod 51 (mogę dać na Z80)- musiałbym ją
wymyślić...
Ale do rzeczy:
Jeśli wynik ma się zmieścić w jednym bajcie (a ma?) to robi się to tak:
Z:
d = d1 + 256 * d2, d2 jest pod starszym adresem- dzielna
k- dzielnik,
i- iloraz
l- licznik.
l = 8;
czy d2 > k?
tak:
nie zmieści się w jedym bajcie- błąd.
nie:
o'k, idziemy dalej;
petla:
d << 1;
i << 1;
czy d2-k>0 ?
tak:
i |=1;
d2 -= k;
nie:
nie robi nic;
l--;
czy l==0?
tak:
koniec;
nie:
petla;
koniec:

w i masz iloraz, w d2- resztę.

Ten algorytm ma jedną dużą (czasem) zaletę- przesuwanie jest tylko w
jedną stronę- w lewo.

Jeśli nie musi się zmieścić w jednym bajcie:
Zrób to samo, tylko zapisz dzielną w 3 bajtach a iloraz w dwóch, do
licznika wstaw 16 zamiast 8 i w algorytmie odejmowanie rób od d3 (gdzie d =
d1 + 256 * (d2 + 256*d3) i d3 na 'dzień dobry' jest równe 0); resztę
będziesz miał w d3.
Możesz też wykorzystać ten algorytm 2 razy- najpierw do starszego bajtu
(podzielić starszy bajt przed dzielnik), resztę potraktować jako starszy
bajt nowej dzielnej (co jest o tyle łatwe, że odpowiednia wartość już jest
tam, gdzie trzeba), do młodszego bajtu nowej dzielnej wstawić młodszy bajt
dzielnej wyjściowej i zapuścić algorytm ponownie. Iloraz z pierwszego
przebiegu algorytmu jest bardziej znaczącą częścią tego, co chcesz
otrzymać, z drugiego- młodszą. Reszta jest jedna, więc nie ma problemu :-).





Pozdrawiam,

Marcin.


--
'My experience is that it is hard to find software producers that aren't
fuzzy.'




Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: 28 Nov 2000 11:43:55 GMT


On Tue, 28 Nov 2000 09:59:59 +0100, Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl> wrote:
mój nastęny problem dotyczący pracy dyplomowej: jak podzielić liczbe 16
bitową (wartość z licznika T0 lub T1) przez coś (konkretnie 20 w moim
przypadku). chodzi mi o gotowe procedury, jeśli ktos ma, bo na 8052.com
napisali że są skomplikowane i tyle :(((

Kłamali. To nie jest skomplikowane. Dzielenie jest dokładnie takie

Rzecz wzgledna :-)

Jeśli wynik ma się zmieścić w jednym bajcie (a ma?) to robi się to tak:

Raczej nie ma. Jak podzieli 50000 przez 20 to sie wynik nie zmiesci.
A jakby mial sie zmiescic to przeciez jest rozkaz ktory to zalatwia :-)

J.

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 13:30:50 +0100




"J.F." wrote:

Kłamali. To nie jest skomplikowane. Dzielenie jest dokładnie takie

Rzecz wzgledna :-)

Czy sugerujesz, że dzielenie w słupku jest skomplikowane? Hmmmmmmm.... ;-))) To co w
takim razie nie_jest skomplikowane?


Jeśli wynik ma się zmieścić w jednym bajcie (a ma?) to robi się to tak:

Raczej nie ma. Jak podzieli 50000 przez 20 to sie wynik nie zmiesci.
A jakby mial sie zmiescic to przeciez jest rozkaz ktory to zalatwia :-)

Niezupełnie. Rozkaz dzieli bajt przez bajt. A to, co napisałem dzieli dwa bajty przez
bajt. Nie jest to bynajmniej błahe rozszerzenie, jako, że dzięki niemu można dzielić
liczbę dowolnej długości (odpowiednio wiele razy wywołując podany algorytm) przez bajt,
czego rozkaz 'div' nie zapewnia. Inaczej- tym, co napisałem, da się podzielić 400 przez
20. Spróbuj to zrobić div-em...


Pozdrawiam,

Marcin.


--
'My experience is that it is hard to find software producers that aren't fuzzy.'





Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: 28 Nov 2000 12:54:55 GMT


On Tue, 28 Nov 2000 13:30:50 +0100, Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl> wrote:
"J.F." wrote:
Kłamali. To nie jest skomplikowane. Dzielenie jest dokładnie takie
Rzecz wzgledna :-)

Czy sugerujesz, że dzielenie w słupku jest skomplikowane? Hmmmmmmm.... ;-))

No - takie bardzo trywialne nie jest :-)
Zobacz ile procesorow DSP dzielic nie potrafi :-)

Jeśli wynik ma się zmieścić w jednym bajcie (a ma?) to robi się to tak:

Raczej nie ma. Jak podzieli 50000 przez 20 to sie wynik nie zmiesci.
A jakby mial sie zmiescic to przeciez jest rozkaz ktory to zalatwia :-)

Niezupełnie. Rozkaz dzieli bajt przez bajt. A to, co napisałem dzieli dwa bajty przez
bajt. Nie jest to bynajmniej błahe rozszerzenie,

Rozkaz dzieli dwa bajty przez bajt ... albo juz mnie pamiec zawodzi ...

Inaczej- tym, co napisałem, da się podzielić 400 przez
20. Spróbuj to zrobić div-em...

Najpierw dwa shifty, a potem przez 100 :-)

J.

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 16:10:46 +0100


Witam :-),

"J.F." wrote:

Kłamali. To nie jest skomplikowane. Dzielenie jest dokładnie takie
Rzecz wzgledna :-)

Czy sugerujesz, że dzielenie w słupku jest skomplikowane? Hmmmmmmm.... ;-))

No - takie bardzo trywialne nie jest :-)

Nie, no oczywiście. To trzeba dobrą i drogą szkołę skończyć, zrobić doktorat i te sprawy,
żeby dwie liczby podzielić. Inaczej- nie da rady... ;-)))


Zobacz ile procesorow DSP dzielic nie potrafi :-)

Ech, mało się tym zajmowałem i ostatnio jakoś straaasznie dawno temu- nic już nie pamiętam
(w tym- jak to było z dzieleniem- wiem, że z mnożeniem było całkiem-całkiem), poza
'śmiesznymi' rozkazami 'skoku z opóźnieniem', które uważam za super pomysł...


Niezupełnie. Rozkaz dzieli bajt przez bajt. A to, co napisałem dzieli dwa bajty przez
bajt. Nie jest to bynajmniej błahe rozszerzenie,

Rozkaz dzieli dwa bajty przez bajt ... albo juz mnie pamiec zawodzi ...

Po Twoim poprzednim poście też miałem wątpliwości. Ale nie- sprawdziłem- dzieli bajt przez
bajt. :-)


Inaczej- tym, co napisałem, da się podzielić 400 przez
20. Spróbuj to zrobić div-em...

Najpierw dwa shifty, a potem przez 100 :-)

??? Chyba jest już późno, bo nie chwytam- dlaczego przez 100? rozumiem, gdyby 2 razy w
prawo dzielną i przez 5 resztę. Albo nawet raz w prawo dzielną i przez 10.???


Pozdrawiam,

Marcin.

PS. Do autora wątku: czy to Ci wystarczy?


--
'My experience is that it is hard to find software producers that aren't fuzzy.'




Poprzedni Następny
Wiadomość
Spis treści
From: "yo!rek" <jarekz_at_nospam_kki.net.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Wed, 29 Nov 2000 22:18:47 +0100


Marcin.

PS. Do autora wątku: czy to Ci wystarczy?
dzięki, potrzbuję kolka dni żeby usiąść i to przetrawić, jak będzie mi
czegoś brakować dam znać.



--
yo!rek
jarekz_at_nospam_kki.net.pl
http://yorek.prawda.org



Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Wolcendorf <wolcendo_at_nospam_free.polbox.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Wed, 29 Nov 2000 04:27:38 +0100


A tym razem sam sobie.


Marcin Wolcendorf wrote:

d = d1 + 256 * d2, d2 jest pod starszym adresem- dzielna
k- dzielnik,
i- iloraz
l- licznik.
l = 8;
czy d2 > k?
tak:
nie zmieści się w jedym bajcie- błąd.
nie:
o'k, idziemy dalej;
petla:
d << 1;

To powyżej (jedna linia) jest błędem. ta linia powinna byc trochę
niżej...

i << 1;
czy d2-k>0 ?
tak:
i |=1;
d2 -= k;
nie:
nie robi nic;
l--;
czy l==0?
tak:
koniec;
nie:


Czyli tu. Tak to jest, jak się coś robi 'na papierze' :-).

petla;
koniec:

w i masz iloraz, w d2- resztę.

Reszta jest w porządku.

M.W.



--
'My experience is that it is hard to find software producers that aren't
fuzzy.'


Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 22:47:04 GMT


On Tue, 28 Nov 2000 20:07:21 +0100, Libido wrote:
Dzielic przez 20 mozna w prosty sposob. Jesli wynik ma byc wyswietlony to
mozna liczbe binarna podzielic przez 2 (przesunac o 1 bit), przeksztalcic na
dziesietna i teraz podzielic przez 10 (przesunac o 4 bity). Jasne i proste ?


A jak sie zamienia na dziesietna? Dzielimy przez 10, bierzemy reszte
... :-)

J.


Poprzedni Następny
Wiadomość
Spis treści
From: "Libido" <libido_at_nospam_ds2.pg.gda.pl>
Subject: Re: dzielnie liczby 16 bitowej na 8051
Date: Tue, 28 Nov 2000 20:07:21 +0100


Dzielic przez 20 mozna w prosty sposob. Jesli wynik ma byc wyswietlony to
mozna liczbe binarna podzielic przez 2 (przesunac o 1 bit), przeksztalcic na
dziesietna i teraz podzielic przez 10 (przesunac o 4 bity). Jasne i proste ?
LIBIDO

Użytkownik "yo!rek" <jarekz_at_nospam_kki.net.pl> napisał w wiadomości
news:8vvpm7$gob$1_at_nospam_news.tpi.pl...
cze.
mój nastęny problem dotyczący pracy dyplomowej: jak podzielić liczbe 16
bitową (wartość z licznika T0 lub T1) przez coś (konkretnie 20 w moim
przypadku). chodzi mi o gotowe procedury, jeśli ktos ma, bo na 8052.com
napisali że są skomplikowane i tyle :(((

a w drodze jeszcze kilka problemów :))

--
> yo!rek
> jarekz_at_nospam_kki.net.pl
> http://yorek.prawda.org
>
>