Newsgroup: it.hobby.elettronica.digitale
Titolo: routine conversione 10 bit bin a/d a bcd

ciao a tutti,
ho un problema con un pic.
ho due registri che sono il risultato di A/D conversione.
Il problema è il seguente: qualcuno sa dirmi dove trovare una routine di
conversione
bin 10bit a bcd 5bit?
grazie


static unsigned char BCD[5];
void BCD2ASCII (unsigned long i)
{
  BCD[0]='0';
  BCD[1]='0';
  BCD[2]='0';
  BCD[3]='0';
  BCD[4]='0';
  while (i>=10000){ BCD[0]++; i-=10000;}
  while (i>=1000) { BCD[1]++; i-=1000;}
  while (i>=100)  { BCD[2]++; i-=100; }
  while (i>=10)   { BCD[3]++; i-=10;  }
  BCD[4]+=i;
}


Secondo me si sprecano inutilmente un mucchio di cicli macchina,con questa
routine.
meglio fare
unsigned char cifra1; //unita
unsigned char cifra2; //decine
unsigned char cifra3; //centinaia
unsigned char cifra4; //migliaia
unsigned char cifra5; //decine migliaia
void decbcd (unsigned int valore){
cifra1 = valore % 10;
valore = valore / 10;
cifra2 = valore % 10;
valore = valore / 10;
cifra3 = valore % 10;
valore = valore / 10;
cifra4 = valore % 10;
cifra5=valore/10;
}
Ciao,
Pier.
www.piergm.com

 
Su microcontrollori sprovvisti di supporto hardware per le
operazioni di moltiplicazione/divisione, non sono sicuro che
questa versione sarebbe piu' performante di quella postata
da Oliver...
Ciao!
Roberto

 Roberto
Ciao,
Pier.
www.piergm.com

 moltiplicazione/divisione), mi hai incuriosito.
Mettiamola cosi': nei casi in cui si sia un po' "risicati"
per quanto riguarda il tempo di cpu, conviene provare entrambe le
implementazioni e poi verificare quale delle due di "comporta"
meglio per l'accoppiata hardware-compilatore utilizzata.
Facci sapere i risultati delle simulazioni.
Ciao!
Roberto


Ho fatto alcune prove veloci, ed e' praticamente sempre piu' rapida la
routine di Olivier, avevi ragione.
:)


 routine di Olivier, avevi ragione.
Hehe, tengo cmq a precisare che non č mia, l'ho scoppiazzata!  =)
Olivier.

 routine di Olivier, avevi ragione.
Buono a sapersi. ;)
Grazie
Ciao
Roberto

 ha scritto nel messaggio
news:dq5196$ane$1...@area.cu.mi.it...



Non capisco cosa intendi per "bcd a 5 bit"; il bcd codifica ogni cifra 
decimale con 4 bit, forse intendi bcd con 5 cifre? Ma per rappresentare 
un numero binario a 10bit, di cifre decimali ne bastano 4 (infatti 2^10 
= 1024, che appunto sono 4 cifre).
Se spieghi meglio cosa vuoi fare possiamo aiutarti in maniera più accurata.
ciao
Francesco

 ha scritto nel messaggio
news:hysxf.124635$65.35...@twister1.libero.it...


 Francesco

 C.
La routine in ASM gią fatta non ce l'ho.
Posso spiegarti la funzione in C, poi sta a te implementarla in ASM
static unsigned char BCD[5]; // assegna 5 byte che saranno i valori BCD
void BCD2ASCII (unsigned long i) // i č il numero che vuoi convertire
{
  BCD[0]='0';    // scrivi in ognuno dei 5 byte '0'
  BCD[1]='0';    // attenzione, non 0, ma '0' (ascii)
  BCD[2]='0';    // ovvero il 48 se non sbaglio
  BCD[3]='0';
  BCD[4]='0';
  while (i>=10000){ BCD[0]++; i-=10000;}
// finchč i č maggiore o uguale a 10000 incrementa BCD[0] e sottrai 10000 a i
  while (i>=1000) { BCD[1]++; i-=1000;}  // come sopra
  while (i>=100)  { BCD[2]++; i-=100; }  // come sopra
  while (i>=10)   { BCD[3]++; i-=10;  }  // come sopra
  BCD[4]+=i;
// quello che resta di i va dommato a BCD[4]
}
tutto questo non č difficile in ASM, l'unica complicazione sono le sottrazioni e
i confronti (che poi sono sottrazioni anche loro) con numeri a 16 bit.
Olivier.

00526e 16Bit to BCD.
io utilizzo comunemete la routine microchip nelle mie applicazioni e
funziona bene
ti ho fatto un copia ed incolla della routine che utilizzo vedi se ti
funziona
;********************************************************************
;                  Binary To BCD Conversion Routine
;   Questa routine converte il numero binario a 16 bit mHbyte+mLbyte
;  in BCD ponendo il risultato nei 5 digit contenuti in mR0,mR1,mR2
;  (msb nei 4 bit meno significativi di R0)
;
;
;
;   Performance :
;               Program Memory  :       35
;               Clock Cycles    :       885
;
;
;
;*******************************************************************;
;
B2_BCD 
                SWAP_TO_BANK0
 
    movf	FSR,0
    movwf	TempFSRbcd	;salvo il valore di FSR in un registro
temporaneo            
	bcf     STATUS,0                ; clear the carry bit
	movlw   .16
	movwf   mcount
	clrf    mR0
	clrf    mR1
	clrf    mR2
loop16  rlf     mLbyte,F
	rlf     mHbyte,F
	rlf     mR2,F
	rlf     mR1,F
	rlf     mR0,F
;
	decfsz  mcount,F
	goto    madjDEC
 
	;restore FSR
    movf	TempFSRbcd,0	;metto il vecchio valore di FSR in W
    movwf	FSR
 
 
	RETLW   0
;
madjDEC  movlw   mR2
	movwf   FSR
	call    madjBCD
;
	movlw   mR1
	movwf   FSR
	call    madjBCD
;
	movlw   mR0
	movwf   FSR
	call    madjBCD
;
	goto    loop16
;
madjBCD  movlw   3
	addwf   0,W
	movwf   mtemp
	btfsc   mtemp,3          ; test if result > 7
	movwf   0
	movlw   0x30
	addwf   0,W
	movwf   mtemp
	btfsc   mtemp,7          ; test if result > 7
	movwf   0               ; save as MSD
	RETLW   0
;

 ha scritto nel messaggio
news:7coes1p6qbomk9l9v...@4ax.com...


E' lo stesso che riscontro problemi.
si
lo avevo scritto anche io
tra le routines microchip pero' ricordo che dovetti fare qualche
piccola modifica
non ricordo se anche in questa avevo cambiato qualche particolare
cmq....
io quella di cui ti ho fatto il copia ed incolla la utilizzo in
diverse applicazioni e danno sempre risultati corretti
fa un piccolo progettino con solo qualche riga nel programma
principale che richiama questa routine e mandamela per posta.
Appena ho un'attimo gli do' un'occhiata e ti dico cosa non va
Di piu' non posso fare
:-)
ciaociao
  Marcello
P.S.
il mio indirizzo e-mail è valido
Ciao
 Marcello
-Catania-