Převod 10 bit > 4 digity PIC ASM

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

Převod 10 bit > 4 digity PIC ASM

#1 Příspěvek 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.
Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 00:00
Bydliště: Plzen-jih

#2 Příspěvek od mat100 »

Uživatelský avatar
mat100
Příspěvky: 480
Registrován: 04 lis 2009, 00:00
Bydliště: Plzen-jih

#3 Příspěvek od mat100 »

Nebo ještě moje úprava - neobsahuje násobení !
Přílohy
Prevod_16bitu_do_DEC.asm
(6.21 KiB) Staženo 165 x
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#4 Příspěvek od procesor »

Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#5 Příspěvek 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.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#6 Příspěvek 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á.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#7 Příspěvek od forbidden »

Nojo, kdo umí, umí, dobrej algoritmus, počítám, že mě by zabral výpočet půlku paměti mcu :lol:
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#8 Příspěvek od procesor »

Až máš málo miesta a kopec času skús toto
Přílohy
16bitToBCD.txt
(1.55 KiB) Staženo 146 x
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#9 Příspěvek 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
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#10 Příspěvek 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ší.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#11 Příspěvek od procesor »

Toto by ťa mohlo zaujímať (Unpacked Mutiplication)
Edit: Zabudol som na link
http://academic.evergreen.edu/projects/ ... am/bcd.htm
Naposledy upravil(a) procesor dne 18 lis 2011, 17:59, celkem upraveno 2 x.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#12 Příspěvek 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?
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#13 Příspěvek od piitr »

Aha, přehlížím - ono se na tu pětku nevolá to adjDEC, ale končí se rotací.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#14 Příspěvek od piitr »

Dobrý, už tomu rozumím. Je to moc pěkný.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#15 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“