Programowanie - Szukam algorytmu
Masz problem? Zapytaj na forum elektroda.pl
From: Slawomir Sidor <slawek_at_nospam_graficomp.com.pl>
Subject: Programowanie - Szukam algorytmu
Date: Tue, 28 Jan 2003 21:22:04 +0100
Witam.
Tak sobie pisze i pisze i ....
Szukam algorytmu (zakoduje sobie sam) zamiany liczby binarnej na ludzko
dziesietna :)
Chodzi mi dokladnie o wyswietlenie na LCD zawartosci jakiegos rejestru.
Ma ktos pomysl ? Gotowy algorytm ? Jakos nic madrego i w miare szybkiego
nie przychodzi mi do glowy :(
Pozdrawiam ...
--
Slawomir Sidor (601 ALEKSA) N 51 58.1385 E020 09.1966
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Tue, 28 Jan 2003 21:24:19 +0100
Slawomir Sidor wrote:
Szukam algorytmu (zakoduje sobie sam) zamiany liczby binarnej na ludzko
dziesietna :)
Wystarczy obliczyc reszte z dzielenia liczby przez 10, dodac kod znaku
'0' i wyswietlic jako ostatnia cyfre. Potem dzielimy liczbe przez 10 i
jezeli nie wyszlo zero - powtarzamy operacje, wyswietlajac kolejne znaki
od konca (od prawej do lewej). Chyba proste?
--
Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows
From: Slawomir Sidor <slawek_at_nospam_graficomp.com.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Tue, 28 Jan 2003 21:48:21 +0100
od konca (od prawej do lewej). Chyba proste?
K... a ja tu od godziny kombinuje :)
--
Slawomir Sidor (601 ALEKSA) N 51 58.1385 E020 09.1966
From: "JoeBack" <joeback_at_nospam_poczta.wp.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Tue, 28 Jan 2003 21:54:37 +0100
Użytkownik "Adam Dybkowski" <adybkows_at_nospam_amwaw.edu.pl> napisał w wiadomości
news:3E36E6F3.4040709_at_nospam_amwaw.edu.pl...
Slawomir Sidor wrote:
Szukam algorytmu (zakoduje sobie sam) zamiany liczby binarnej na ludzko
dziesietna :)
Wystarczy obliczyc reszte z dzielenia liczby przez 10, dodac kod znaku
'0' i wyswietlic jako ostatnia cyfre. Potem dzielimy liczbe przez 10 i
jezeli nie wyszlo zero - powtarzamy operacje, wyswietlajac kolejne znaki
od konca (od prawej do lewej). Chyba proste?
Dzielenie nie jes wydajne, szczególnie w prockach, które nie mają instrukcji
dzielenia.
W ogóle operacja dzielenia jest najbardizej niewdzięczną operacją a
arytmetyce mikrokontrolerów.
Proponuje inaczej.
Algorytm, który realizuję na MSP430 (który niestety nie dzieli) odejmuje od
liczby kolejne potęgi dziesiątki (dziesiątki tysięcy, tysiące, setki ,
dziesiątki) na końcu pozostają jedności. Dla 16-bitowej liczby jest to
maksymalnie 6 (bo 65 tysięcy) + 10 (tysięcy) + 10 (setek) + 10 (dziesiątek)
czyli max. 36 odejmowań.
Dla 8 bitów odejmowan jest do 12.
To jest naprawdę bardziej wydajne.
---
Pozdrawiam
JoeBack
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: Programowanie - Szukam algorytmu
Date: Tue, 28 Jan 2003 22:45:51 GMT
On Tue, 28 Jan 2003 21:54:37 +0100, JoeBack wrote:
Szukam algorytmu (zakoduje sobie sam) zamiany liczby binarnej na ludzko
dziesietna :)
Wystarczy obliczyc reszte z dzielenia liczby przez 10 [...]
Dzielenie nie jes wydajne, [...] proponuje [...] odejmuje od
liczby kolejne potęgi dziesiątki (dziesiątki tysięcy, tysiące, setki ,
dziesiątki) na końcu pozostają jedności. Dla 16-bitowej liczby jest to
maksymalnie 6 (bo 65 tysięcy) + 10 (tysięcy) + 10 (setek) + 10 (dziesiątek)
czyli max. 36 odejmowań.
No i porownania lub dodawania ..
Jest to jakas propozycja. Ale dzielenie przez 10 klasycznie zrobione
po bicie z innych instrukcji nie jest znowu takie trudne, a krokow
tylko 16 trzeba.
Inny pomysl ostatnio tu padl, IMHO ciekawy. Liczbe binarna
przesuwamy w lewo, a wychodzace bity dodajemy do tymczasowej,
ktora co krok mnozymy przez dwa ... ale w BCD.
J.
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 01:59:31 +0100
J.F. wrote:
Inny pomysl ostatnio tu padl, IMHO ciekawy. Liczbe binarna
przesuwamy w lewo, a wychodzace bity dodajemy do tymczasowej,
ktora co krok mnozymy przez dwa ... ale w BCD.
A potem trzeba jeszcze ta BCD rozpakowac w czasie wyswietlania? Kaszana.
No i nie wszystkie procki maja arytmetyke BCD (np. AVRy). Niby da sie
zrobic, ale bardzo naokolo i wtedy juz nie jest to wydajna metoda.
--
Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 21:33:52 GMT
On Wed, 29 Jan 2003 01:59:31 +0100, Adam Dybkowski wrote:
J.F. wrote:
Inny pomysl ostatnio tu padl, IMHO ciekawy. Liczbe binarna
przesuwamy w lewo, a wychodzace bity dodajemy do tymczasowej,
ktora co krok mnozymy przez dwa ... ale w BCD.
A potem trzeba jeszcze ta BCD rozpakowac w czasie wyswietlania? Kaszana.
No i nie wszystkie procki maja arytmetyke BCD (np. AVRy). Niby da sie
zrobic, ale bardzo naokolo i wtedy juz nie jest to wydajna metoda.
Jesli to ci przeszkadza, to zrob 1 cyfre na bajt i podwajanie z
korekcja dziesietna programowo - to w koncu dosc banalna operacja..
J.
From: rkcz <rkcz_at_nospam_op.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 10:34:13 +0100
Dzielenie nie jes wydajne,
zgoda
szczególnie w prockach, które nie mają instrukcji
dzielenia.
Nooo tu juz calkiem wydajne nie jest
W ogóle operacja dzielenia jest najbardizej niewdzięczną operacją a
arytmetyce mikrokontrolerów.
Proponuje inaczej.
Algorytm, który realizuję na MSP430 (który niestety nie dzieli) odejmuje od
liczby kolejne potęgi dziesiątki (dziesiątki tysięcy, tysiące, setki ,
dziesiątki) na końcu pozostają jedności. Dla 16-bitowej liczby jest to
maksymalnie 6 (bo 65 tysięcy) + 10 (tysięcy) + 10 (setek) + 10 (dziesiątek)
czyli max. 36 odejmowań.
Dla 8 bitów odejmowan jest do 12.
To jest naprawdę bardziej wydajne.
Dla 8051
instrukcja liczba cykli oscylatora (maszynowych)
SUBB 12 (1)
DIV 48 (4)
MUL 48 (4)
Czyli dla liczby 8-bitowej
12 odejmowan przeciwko 2 dzieleniom (12 > 4*2)
dla 16 bitowej
36 odejmowan przeciwko 4-em dzieleniom (36 > 4*4)
Tak, ze jednak raczej dzielenie wbrew pozorom.
Chyba, ze procek nie ma istr dzielenia (ktory tak ma?), to trzeba
dzielic za pomaca odejmowan, chociaz mozna na pewno wykorzystac
algorytmy dzielenia, ktore musialbym sobie przypominac.
W kazdym razie odejmowanie jest jednym ze sposobow na wykonanie
dzielenia, tak jak dodawanie na wykonanie mnozenia i jezeli procek to ma
to trza dzielic a nie kombinowac.
Acha nie mam teraz ksiazki z liczbami cykli dla procesorow 80x86,
ale raczej tez bedzie podobnie
From: Slawomir Sidor <slawek_at_nospam_graficomp.com.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 18:33:57 +0100
Chyba, ze procek nie ma istr dzielenia (ktory tak ma?), to trzeba
Z80 nie ma.
Ja akurat pisze to na AVRa.
--
Slawomir Sidor (601 ALEKSA) N 51 58.1385 E020 09.1966
From: "GG" <gayosek_at_nospam_poczta.onet.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 20:47:57 +0100
Użytkownik "Slawomir Sidor" <slawek_at_nospam_graficomp.com.pl> napisał
Z80 nie ma.
Ja akurat pisze to na AVRa.
A to masz sprawę załatwioną. W przykładzie avr204.asm masz konwersję
16-bit. Zajmuje to 760 cykli proca. Bardzo prosto da się zwiększyć długość
liczby - dla 32bit ilość cykli to około 2500.
Metoda taka jak opisał Tomcio-x
--
Grzesiek Gajewski
gayos_at_nospam_interia.pl
From: Slawomir Sidor <slawek_at_nospam_graficomp.com.pl>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 22:59:38 +0100
A to masz sprawę załatwioną. W przykładzie avr204.asm masz konwersję
) Dzieki.
Przyznam sie, ze jestem psychiczny i wszystko pisze sam prawie od zera :))
(Dlatego k.... zanim nie podejrzalem co zrobic ze stosem) ;)
--
Slawomir Sidor (601 ALEKSA) N 51 58.1385 E020 09.1966
From: Tomcio-x <geto_at_nospam_poczta.fm>
Subject: Re: Programowanie - Szukam algorytmu
Date: Wed, 29 Jan 2003 03:39:57 +0100
Witam
Ja znam taki algorytm BIN > BCD
N bitową liczbę BIN przesuwasz o N pozycji w lewo (po lewej
otzrymujesz kod BCD), jednak przed każdym przesunięciem sprawdzasz czy
jakaś dekada jest większa od 4, jeśli tak dodajesz do niej 3
(oczywiście może być takich kilka na raz)
pozdrawiam