Discussione:
Conversione binario --> BCD
(troppo vecchio per rispondere)
Boiler
2005-12-02 23:56:18 UTC
Permalink
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
Marcello
2005-12-03 09:24:36 UTC
Permalink
Post by Boiler
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?
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
Boiler
2005-12-03 09:32:02 UTC
Permalink
Post by Marcello
trovi le routines tra le application notes microchip
Vado a cercare.
Post by Marcello
per inviare al display non fai altro che prendere i valori dei nibbles
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
Marcello
2005-12-03 09:49:01 UTC
Permalink
Post by Boiler
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?
ops
scusami
ho scritto il post senza leggere nel dettaglio
stavo pensando ai classici display LCD :-)
Marcello
2005-12-03 09:53:27 UTC
Permalink
Post by Boiler
Vado a cercare.
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
;********************************************************************
Boiler
2005-12-03 09:58:34 UTC
Permalink
Post by Marcello
Post by Boiler
Vado a cercare.
Se non lo trovi....
ti ho fatto il copia ed incolla dal PDF
Gentilissimo!

Grazie Boiler
Valeria Dal Monte
2005-12-03 09:46:58 UTC
Permalink
Post by Boiler
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...
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
Boiler
2005-12-03 09:51:24 UTC
Permalink
On Sat, 03 Dec 2005 09:46:58 GMT, "Valeria Dal Monte"
Post by Valeria Dal Monte
Esistono tantissimi algoritmi per fare la conversione di base,
alcuni anche molto belli che lavorano su numeri di lunghezza
arbitraria.
Quelli per fare le conversioni a mano li conosco, ma non mi sembrano
proprio il massimo da dare in pasto a un processore.
Post by Valeria Dal Monte
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
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
SB
2005-12-03 12:25:11 UTC
Permalink
Post by Boiler
Post by Valeria Dal Monte
b=numero binario
d=0
ripeti b volte
{
d=d+1
aggiusta decimale d
}
print d
Cosa si intende per aggiustamento decimale?
Si intende la conversione fatta con un istruzione apposita, ad esempio nello Z80
c'è la DAA Decimal Adjust accumulator

http://www.le.infn.it/~fulvio/z80varie.htm
Post by Boiler
Il convertire, per esempio, il 2 in 0 e riporto di 1 quando si lavora
in binario?
Per numeri a 4 bits quando il risultato supera 9 si aggiunge 6, per numeri a 8
bits è più complicato.


--
ciao
Stefano
Boiler
2005-12-03 12:27:11 UTC
Permalink
Post by SB
Post by Boiler
Cosa si intende per aggiustamento decimale?
Si intende la conversione fatta con un istruzione apposita, ad esempio nello Z80
c'è la DAA Decimal Adjust accumulator
http://www.le.infn.it/~fulvio/z80varie.htm
Esiste anche sui PIC?

Ciao Boiler
SB
2005-12-03 12:54:45 UTC
Permalink
Post by Boiler
Post by SB
Post by Boiler
Cosa si intende per aggiustamento decimale?
Si intende la conversione fatta con un istruzione apposita, ad esempio nello Z80
c'è la DAA Decimal Adjust accumulator
http://www.le.infn.it/~fulvio/z80varie.htm
Esiste anche sui PIC?
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
Claudio F
2005-12-03 14:31:41 UTC
Permalink
Post by SB
Mi sembra di no, comunque si può simulare con una routine,
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
Boiler
2005-12-03 16:32:59 UTC
Permalink
Post by Claudio F
Post by SB
Mi sembra di no, comunque si può simulare con una routine,
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
Buona idea anche questa!

Grazie Boiler
SB
2005-12-05 12:07:54 UTC
Permalink
Post by Boiler
Post by SB
Post by Boiler
Cosa si intende per aggiustamento decimale?
Si intende la conversione fatta con un istruzione apposita, ad esempio nello Z80
c'è la DAA Decimal Adjust accumulator
http://www.le.infn.it/~fulvio/z80varie.htm
Esiste anche sui PIC?
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

Continua a leggere su narkive:
Loading...