Prevod 24-bit BIN do BCD asm

Ahojte,
nemate niekto pls tip na nejaku funkcnu proceduru na prevod 24-bitoveho binarneho cisla do BCD format (8 cislic) pre PIC16? Nejak sa mi to nedari najst a sam to nezvladnem napisat.

Vdaka.

Jestli Ti to stačí v C, tak by to mohlo být nějak takhle :

[code]unsigned char BCD[4];
long int PrevadeneCislo;

void PrevodDoBCD(unsigned char *Vystup, long int Vstup)
{
unsigned char Cislice;

Cislice = Vstup / 10000000;
Vstup -= (long int)Cislice10000000;
Vystup[0]=(Cislice<<4);
Cislice = Vstup / 1000000;
Vstup -= (long int)Cislice
1000000;
Vystup[0]+=Cislice;

Cislice = Vstup / 100000;
Vstup -= (long int)Cislice100000;
Vystup[1]=(Cislice<<4);
Cislice = Vstup / 10000;
Vstup -= (long int)Cislice
10000;
Vystup[1]+=Cislice;

Cislice = Vstup / 1000;
Vstup -= (long int)Cislice1000;
Vystup[2]=(Cislice<<4);
Cislice = Vstup / 100;
Vstup -= (long int)Cislice
100;
Vystup[2]+=Cislice;

Cislice = Vstup / 10;
Vstup -= (long int)Cislice*10;
Vystup[3]=(Cislice<<4);
Vystup[3]+=Vstup;

}[/code]

Volání je pak :

  PrevodDoBCD(BCD, PrevadeneCislo);

Asi budeš muset přihodit nějaký to přetypování, ale jinak by to mělo chodit.

Zkus to projít, určitě to nějak dáš…
sites.google.com/a/asu.edu/sreekar/other-interests/embedded-systems/binary-to-bcd-in-embedded-uc-code
piclist.com/techref/microchip/math/radix/index.htm?key=Looking%20for%20work
ww1.microchip.com/downloads/en/AppNotes/00526e.pdf

Stačí hledat-

[code]https://forum.mcontrollers.com/t/matematika-pic-24b-pro-osmibitove-mikroprocesory/412/1]

Zdravim,
Balů: Vdaka, istotne to pouzijem ako studijny material jedneho dna ked to konecne vzdam s assemblerom a prejdem na C.

Anonymní: Prvy link uzitocny, pekne vysvetlenie principu na prevod 8-bitoveho cisla, ale update na tri 8-bitove registre ktore treba previest do 10 ascii digitov by bol vazne komplikovany.
Druhy link: tie 24bit to bcd procedury bud nefunguju, alebo som ich zle pouzil.
Treti link: neriesi 24-bitove cisla.

**JohnBoss:**Uzitocny link v pripade ak chcem 24-bitovo nasobit alebo delit, prevod do ascii tam ale nie je.

Po dlhom hladani sa mi podarilo nakoniec najst proceduru ktora funguje, takze ju tu pastnem, mozno v buducnosti niekto z toho vytazi

; ****************** Convert 24 bit binary to ASCII ************ ; ToAscii ; --- Do binary to packed BCD first ; b2bcd movlw 24 ; 24-bits movwf rI ; Make cycle counter clrf rBcd ; Clear result area clrf rBcd+1 ; clrf rBcd+2 ; clrf rBcd+3 ; ; b2bcd2 movlw rBcd ; Make pointer movwf FSR ; movlw 8/2 ; Eight BCD nibbles, four packed bytes movwf rCnt ; ; b2bcd3 movlw 0x33 ; Add 3 to each nibble addwf INDF,F ; btfsc INDF,3 ; Test if low result > 7 andlw 0xf0 ; Low result >7 so don't take the 3 out btfsc INDF,7 ; Test if high result > 7 andlw 0x0f ; High result > 7 so don't take the 3 out subwf INDF,F ; Any results <= 7, subtract back incf FSR,F ; Point to next decfsz rCnt,F ; Dec byte count goto b2bcd3 ; Do next byte... ; rlf rBin+2,f ; Get another bit rlf rBin+1,f ; rlf rBin+0,f ; rlf rBcd+3,f ; Put it into bcd rlf rBcd+2,f ; rlf rBcd+1,f ; rlf rBcd+0,f ; decfsz rI,f ; All done? goto b2bcd2 ; No, loop ; ; ; ; --- Convert the 8 binary coded digits (4 bytes) starting at ; <bcd> into an ascii string also starting at <bcd>. Original ; bcd digits are lost. ; bcd2a movlw rAscii+7 ; movwf rPto ; Destination pointer movlw rBcd+3 ; movwf rPti ; Source pointer movlw 4 ; 4 bytes to process movwf rCnt ; ; bcd2a1 movf rPti,W ; Get current input pointer movwf FSR ; decf rPti,F ; Prepare for next movf INDF,W ; Get 2 bcds movwf rTemp ; Save for later movf rPto,W ; Get current output pointer movwf FSR ; decf rPto,F ; Prepare for next decf rPto,F ; movf rTemp,W ; Get digits back andlw 0x0f ; Process lsd movwf INDF ; movlw '0' ; addwf INDF,F ; To output decf FSR,F ; swapf rTemp,W ; Process msd andlw 0x0f ; movwf INDF ; movlw '0' ; addwf INDF,F ; To output decfsz rCnt,F ; All digits? goto bcd2a1 ; retlw 0

a zdroj (prispevok 2):

https://forum.sparkfun.com/viewtopic.php?t=5725

Dakujem.

Omlouvám se, špatně sem si přečetl dotaz, ale aspoň je vidět, že když je člověk po noční a nespal celej den, že má jít radši spát.¨

Já používám toto, je to předělané na 18F, ale stačí upravit FSR a INDF podle řady PIC

;************************************************************************** ; Prevod 24 \ na DEC ; vstup C3,2,1 ; pouziva FSR2, C1,C2,C3,TMP1,D1,D2 ; vystup dec0 - 7 ;************************************************************************** BIN2dec lfsr 2,dec0 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 clrf POSTINC2 movlw .24 ; Initiate bit loop banksel D1 movwf D1 BITLOOP banksel C1 rlcf C1, F ; Every iteration of this loop will copy the next rlcf C2, F ; bit of the bin value, starting with the MSB, rlcf C3, F ; to the carry flag lfsr 2,dec0 movlw .8 movwf D2 ; The following is executed 8 times per bit movff STATUS,TMP1 decLOOP banksel 0 movff TMP1,STATUS rlcf INDF2, F ; Multiply decn by two with carry, decn * 2 + C movlw .246 ; See note above - test for decn > 9 addwf INDF2, W ; W = decn -10, if W = positive or zero, C = 1 btfsc STATUS, C ; decn has overflowed (>>9) if carry is set movwf INDF2 ; If carry is set decn = decn - 10 movff STATUS,TMP1 incf FSR2L, F ; Carry is CARRIED over to next multiply banksel D2 decfsz D2, F goto decLOOP ; Multiply next decn decfsz D1, F goto BITLOOP ; Do next bit retlw 0 ; Could be RETURN on most pics