Saper/nolin11
Guest
Sun Feb 11, 2007 6:22 pm
Witam,
heh mam głupie pytanie jak skonwertować uint8 (jak tez i większe) do bcd
dwucyfrowej w jednej zmiennej??
Dokładniej, np. 47 = 0010 1111b ,a chcę rozpisać to w tak: 0100 0111b (4 7)
czyli tak jak to robi "bcd()" z bascoma...
Wiem iż to jest proste ale nie bijce mnie prosze ://
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Analog
Guest
Sun Feb 11, 2007 7:00 pm
Saper/nolin11:
Quote:
heh mam głupie pytanie jak skonwertować uint8 (jak tez i większe) do bcd
dwucyfrowej w jednej zmiennej??
Najprosciej (ale nie najszybciej (dzielenie)) dla u8:
(n%10)|((n/10)<<4)
Dziala niestety tylko dla 0-99.
Dla innych zakresow trzeba podejsc kilkuetapowo:
dzielac przez 100, liczac mod 100, oraz kownertujac
kolejne wartosci do bcd uzywajac powyzszego kodu.
Osobiscie, gdybym mial troche wolnego miejsca (w rom),
uzylbym 100 bajtowej tablicy jako lookup do liczenia bcd
z zakresu 0-99. Wtedy pozostaje tylko n=table[m].
W bardzo "low-endowych" systemach czasami w specyficznych sytuacjach
(proste liczniki, gdzie zliczamy wartosci ze stalym krokiem) lepiej
uzyc funkcji (inc/dec) ktore operuja od razu na bcd (i sprawdzaja
przeniesienie do nastepnej dziesiatki na biezaco).
--
Analog
Saper/nolin11
Guest
Sun Feb 11, 2007 7:35 pm
Analog wrote:
Quote:
Saper/nolin11:
heh mam głupie pytanie jak skonwertować uint8 (jak tez i większe) do bcd
dwucyfrowej w jednej zmiennej??
Najprosciej (ale nie najszybciej (dzielenie)) dla u8:
(n%10)|((n/10)<<4)
Dziala niestety tylko dla 0-99.
powiedzmy że napisałem to tak :
uint8_t int2bcd(uint8_t i) {
return ((i / 10) << 4) | (i % 10);
}
Quote:
Dla innych zakresow trzeba podejsc kilkuetapowo:
dzielac przez 100, liczac mod 100, oraz kownertujac
kolejne wartosci do bcd uzywajac powyzszego kodu.
Potrzebuje to do wporwadzania danych do pcf'a więc do 99 jest ok

Zegarek
na led'ach

)
Quote:
Osobiscie, gdybym mial troche wolnego miejsca (w rom),
uzylbym 100 bajtowej tablicy jako lookup do liczenia bcd
z zakresu 0-99. Wtedy pozostaje tylko n=table[m].
yyyyyyy

)
Quote:
W bardzo "low-endowych" systemach czasami w specyficznych sytuacjach
(proste liczniki, gdzie zliczamy wartosci ze stalym krokiem) lepiej
uzyc funkcji (inc/dec) ktore operuja od razu na bcd (i sprawdzaja
przeniesienie do nastepnej dziesiatki na biezaco).
mam m32 (docelowo pewnie będzie m8535)
Nie wiem skąd ale mam nawyk jak najbardziej skracania kodu jak się da i
upraszczania ażyby mało zajmował
Może nawyk używania przez bardzo długi czas procesorów które miały tylko 2k
flash'a
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Grzegorz Kurczyk
Guest
Sun Feb 11, 2007 8:55 pm
Użytkownik Saper/nolin11 napisał:
Quote:
Nie wiem skąd ale mam nawyk jak najbardziej skracania kodu jak się da i
upraszczania ażyby mało zajmował
Może nawyk używania przez bardzo długi czas procesorów które miały tylko 2k
flash'a
Witam
Też mi pozostał taki nawyk

Ale dodatkowo mam manię wyciskania taktów
zegara z procedur i to traktuję jako priorytet. Skracaniem programu
zaczynam się zajmować dopiero jak flash się ma ku końcowi :)
Pozdrawiam
Grzegorz
Bogdan Gutknecht
Guest
Mon Feb 12, 2007 7:09 am
Quote:
Nie wiem skąd ale mam nawyk jak najbardziej skracania kodu jak się da i
upraszczania ażyby mało zajmował
Może nawyk używania przez bardzo długi czas procesorów które miały tylko
2k
flash'a
W assemblerze jest tak, że im krótszy kod źródłowy, tym krótszy wynikowy. W
c już tak nie jest. I często skracanie kodu źródłowego jest wydłużaniem
wynikowego. Warto wiedzieć jak się poszczególne instrukcje i funkcje
kompilują. Przydatna jest znajomość opcji kompilatora, żeby odpowiednio
optymalizował kod.
Adam Jurkiewicz
Guest
Mon Feb 12, 2007 3:41 pm
Quote:
heh mam głupie pytanie jak skonwertować uint8 (jak tez i większe) do bcd
dwucyfrowej w jednej zmiennej??
To się robi zwykłym algorytmem, nie rzeźbie po avr'ach ale mogę dać
Ci przykład na pica ;)
http://ajpic.zonk.pl/download/asm/math.inc
Algorytm można rozszerzać na dowolną ilość bajtów i chyba w miarę
prosto przenieść na inny procesor.
A tak poza tym to myślę, że takich przykładów musi być pełno na sieci.
Pozdrawiam,
sword
--
e-mail: sword@wywalic.ajpic.zonk.pl
www:
http://ajpic.zonk.pl/
gg#: 1781804