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 :lol:

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.