Newsgroup: it.hobby.elettronica.digitale
Titolo: Conversione binario --> BCD

Ho un valore in formato binario, lungo 8 bit (so però che il valore
memorizzato non supererà mai 70, quindi 01000110).
Qual'è il modo migliore/piu' semplice/piu' efficente per convertire
questo valore in due cifre BCD da 0 a 9 (quindi senza A...F) da
mandare a un display?
Spero che ci sia un metodo piu' comodo di una LUT...
Grazie Boiler

mandare a un display?
trovi le routines tra le application notes microchip
ci sono tra le vecchie librerie matematiche le routine di conversione
sia di un numero binario a 16 bit che di uno a otto bit in formato BCD
ottieni i valori dei digit in nibbles
per inviare al display non fai altro che prendere i valori dei nibbles
e sommarci 48 in modo da ottenere il corretto codice ascii

e sommarci 48 in modo da ottenere il corretto codice ascii
Mi sfugge questo punto... Io devo pilotare un display a 7 segmenti
tramite il solito decodificatore BCD --> 7 segmenti. A cosa mi serve
l'ASCII?
Ciao Boiler

 wrote in message
nin1p1pqcf1pkodro...@4ax.com...

Esistono tantissimi algoritmi per fare la conversione di base,
alcuni anche molto belli che lavorano su numeri di lunghezza
arbitraria.
Nel tuo caso, visto il valore massimo, probabilmente ti conviene
un banalissimo ciclo di incremento e aggiustamento decimale, che
e' un'operazione disponibile in quasi tutte le cpu.
b=numero binario
d=0
ripeti b volte
    {
    d=d+1
    aggiusta decimale d
    }
print d

l'ASCII?
ops
scusami
ho scritto il post senza leggere nel dettaglio
stavo pensando ai classici display LCD :-)

print d
Cosa si intende per aggiustamento decimale?
Il convertire, per esempio, il 2 in 0 e riporto di 1 quando si lavora
in binario?
Grazie Boiler


Se non lo trovi....
ti ho fatto il copia ed incolla dal PDF 
nel listato ci sono anche i numeri di riga ma....
cancellarli ora è troppo faticoso
:-)
 00078         PAGE
 00079
;*******************************************************************;
 00080 ;                  Binary To BCD Conversion Routine (8 bit)
 00081 ;
 00082 ;       This routine converts the 8 bit binary number in the W
Reg
 00083 ; to a 2 digit BCD number in location BCD( compacted BCD Code)
 00084 ;       The least significant digit is returned in location LSD
and
 00085 ; the most significant digit is returned in location MSD.
 00086 ;
 00087 ;   Performance :
 00088 ;               Program Memory  :  10
 00089 ;               Clock Cycles    :  62  (worst case when W = 63
Hex )
 00090 ;                                      ( i.e max Decimal number
99 )
 00091
;*******************************************************************
 00092 ;
 00093 BinBCD
 00094         clrf     BCD, F
 00095 again
 00096         addlw    -10
 00097         btfss    ALUSTA,C
 00098         goto     swapBCD
 00099         incf     BCD, F
 00100         goto     again
 00101 swapBCD
 00102         addlw    10
 00103         swapf    BCD, F
 00104         iorwf    BCD, F
 00105         return
 00106 ;
 00107         PAGE
 ;********************************************************************

ti ho fatto il copia ed incolla dal PDF 
Gentilissimo!
Grazie Boiler

in binario?
Per numeri a 4 bits quando il risultato supera 9 si aggiunge 6, per numeri a 8
bits è più complicato.
--
ciao
  Stefano


Esiste anche sui PIC?
Ciao Boiler

 wrote:

Mi sembra di no, comunque si può simulare con una routine, basta che ci sia un
half carry.
Io ho fatto una DAA per AVR Atmel, qualcuno l'avrà fatta anche per i Pic.
Comunque è preferibile convertire il byte da Binario a BCD direttamente prima
della visualizzazione perchè le varie operazioni si fanno meglio in binario,
quindi anche senza DAA basta una routine BIN2BCD e via...
--
ciao
  Stefano

 basta che ci sia un half carry.
Si c'e' il flag DC (bit 1 registro status) che e' un carry a 4 bit. Tuttavia
avendo un range cosi' ridotto 0..70 forse si fa prima a sottrarre N volte 10
e quello che resta sono le unita'. Una cosa del genere dovrebbe funzionare e
fa al massimo 7 cicli:
;-----------------------------------------
; Input: DL=valore binario (0..99)
; Output: DL=unita'(0..9) CL=decine (0..9)
;-----------------------------------------
 clrf cl
 movlw -10
 addwf dl,w
 btfsc STATUS,C
 return
 movwf dl
 incf cl,f
 goto $-6
Claudio F

fa al massimo 7 cicli:
Buona idea anche questa!
Grazie Boiler

 wrote:

No, ma ne ho ritrovate due, una per AVR e l'altra per Motorola HC05, ovviamente
vanno chiamate subito dopo un operazione che muova l'half-carry.
INC - DEC ecc.
E' roba vecchia, soprattutto quella per HC05, ma dovrebbero funzionare.
Non chiedermi di convertirle in ASM per i pics, è un esercizio che dovresti fare
tu   ;-)
______________________________
;Atmel  AVR
DAA:	ldi	Temp1,6  
	in	Mreg,Sreg	
	brcs	Dah		
	cpi	A,99H		
	brlo	Dal		
	breq	Dal             
 
Dah:	neg	A		
	subi	A,60H		
	brne	Dah0		
	sec			
	rjmp	Dah1		
 
Dah0	neg	A		
Dah1	brcs	Rec		
	rcall	Dal		
	ret			
 
Rec	rcall	Dal		
	sec			
	ret			
 
Dal	;brhc	Dao		
	sbrs	Mreg,5		
	rjmp	 Dao		
	seh			
	add	A,Temp1		
	ret			
 
Dao	clh                     
	add	A,Temp1		
	brhs	Drt		
	sub	A,Temp1		
Drt	ret			
____________________________
; HC05P9
*DECIMAL ADJUST ACCUMULATOR
DAA:	BCS	DAH
	CMP	#$99
	BLS	DAL
DAH	NEGA
	SUB	#$60
	BNE	DAH0			;NEG di 0 = 0, NO CARRY
	SEC
	BRA	DAH1
DAH0	NEGA
DAH1	BCS	REC
	BSR	DAL
	RTS
REC	BSR	DAL
	SEC
	RTS
DAL	BHCC	DAO
	ADD	#$06
	RTS
DAO	ADD	#$06	
	BHCS	DRT
	SUB	#$06
DRT	RTS
______________________
 
--
ciao
  Stefano