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.
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)Cislice1000000;
Vystup[0]+=Cislice;
Cislice = Vstup / 100000;
Vstup -= (long int)Cislice100000;
Vystup[1]=(Cislice<<4);
Cislice = Vstup / 10000;
Vstup -= (long int)Cislice10000;
Vystup[1]+=Cislice;
Cislice = Vstup / 1000;
Vstup -= (long int)Cislice1000;
Vystup[2]=(Cislice<<4);
Cislice = Vstup / 100;
Vstup -= (long int)Cislice100;
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]http://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