Stránka 1 z 2
Převod 10 bit > 4 digity PIC ASM
Napsal: 16 lis 2011, 19:29
od forbidden
Chtěl jsem se jen zeptat, jestli někdo nemá osvědčenou rutinu na převod 10 b čísla na 4 digity. To 10 b je uložený ve dvou 8 b registrech a výsledek má být ve čtyřech registrech (tisíce, stovky, desítky a jednotky).
Jde o zpracování dat z ADC, třeba pro pohodlný zobrazení na displayi. Rutina by měla umět i násobit výsledek 1-9 krát.
Já si naprogramoval svou, funkční, jenže vzhledem k mým programátorským schopnostem má lehce přes 200 slov, což je docela dost.
Radši bych něco úspornějšího.
Díky.
Napsal: 16 lis 2011, 20:27
od mat100
Napsal: 16 lis 2011, 20:29
od mat100
Nebo ještě moje úprava - neobsahuje násobení !
Napsal: 16 lis 2011, 21:21
od procesor
Napsal: 16 lis 2011, 22:15
od forbidden
Díky za odpovědi, ten z 8bitu.cz jsem právě našel a zkoušel, ale nějak mi nechodil, furt se to někde cyklilo. Tak jsem radši napsal svůj, než bych hledal chybu v cizím programu. Jinak se kouknu na oba dva a něco třeba vyberu.
Napsal: 16 lis 2011, 22:53
od procesor
To 16b5d je funkčné, môžem dať aj kratšie, ale urobí cca 880 taktov.
Ten 16b5d je s podrobným popisom na stránke...ani som sa nesnažil pochopiť, ale maká.
Napsal: 17 lis 2011, 17:57
od forbidden
Nojo, kdo umí, umí, dobrej algoritmus, počítám, že mě by zabral výpočet půlku paměti mcu

Napsal: 17 lis 2011, 18:59
od procesor
Až máš málo miesta a kopec času skús toto
Napsal: 17 lis 2011, 19:09
od forbidden
Ani se mi nechce věřit, že to jde napsat tak krátký. 880 taktů nevadí, v programu, kam to plánuju použít, není čas tak důležitej.
Díky moc
Napsal: 17 lis 2011, 21:07
od forbidden
No tak ještě jednu pomoc bych uvítal, potřebuju ještě podprogram na násobení dvou 4-ciferných čísel (každá cifra zase v jednom registru) a výsledek je 8-ciferný číslo (opět každá cifra zvlášť v registru).
Moje "brute force" metoda má 250 slov.
Já se snad začnu učit C, vím, že výsledný stroják asi nebude moc úsporný, ale alespoň program samotný bude přehlednější.
Napsal: 17 lis 2011, 22:31
od procesor
Toto by ťa mohlo zaujímať (Unpacked Mutiplication)
Edit: Zabudol som na link
http://academic.evergreen.edu/projects/ ... am/bcd.htm
Napsal: 18 lis 2011, 08:11
od piitr
procesor píše:Až máš málo miesta a kopec času skús toto
Což o to, krátký to je, ale moc nechápu, jak to funguje. Třeba když chci převést číslo 5, tak se mi zdá, že vyjde 8. Ze začátku se jen rotuje, v posledním taktu se přidají 3, koukne se že to je větší než 7, což je, tak se to přidané uloží a tím se končí, takže tam zbyde 8. To ale není dobře. Nebo něco přehlížím?
Napsal: 18 lis 2011, 08:14
od piitr
Aha, přehlížím - ono se na tu pětku nevolá to adjDEC, ale končí se rotací.
Napsal: 18 lis 2011, 08:16
od piitr
Dobrý, už tomu rozumím. Je to moc pěkný.
Napsal: 18 lis 2011, 14:30
od ZdenekHQ
Na MCU51 s instrukcí DIV je to základní dělení docela jednoduchý.
Dělení 0..15 obstará toto :
Kód: Vybrat vše
Del_n:
;*****
;#Reg_mat - 4 byte matematickýregistr
;delka N = R2 = 4
;v r3 je delitel 0..15, v B vraci zbytek
;podil v Mat_reg, v B zbytek
mov r1,#(Mat_reg+3)
mov r2,#4
mov b,#0
Deln_1:
mov a,@r1
anl a,#0f0h
add a,b
swap a
mov b,r3
div ab
swap a
xch a,@r1
anl a,#0fh
swap a
add a,b
swap a
mov b,r3
div ab
add a,@r1
mov @r1,a
dec r1
djnz r2,Deln_1
ret
Tohle se 4x "zavolá" na matematický registr, registr R3=10, t.j. dohromady dělím 1000 a zbytek po každým výpočtu se vždycky rovnou pošle na displej či uloží na potřebné místo.
Pro 10 bitů lze zkrátit Mat_registr i r2.