Newsgroup: it.hobby.elettronica.digitale
Titolo: uControllori e binario to BCD

Ciao
 
 
primo argomento nuovo del 2015?
 
Spesso,quando si ha di mezzo un display o un terminale si deve 
convertire un valore da binario a BCD.
Ci sono vari algoritmi,librerie,moduli c o asm già fatti ecc.
Mi chiedo però,come mai solitamente non è implementata in HW in un 
uControllore?
La risposta che mi do è che essendo un'operazione che ha che fare con la 
velocità di percezione umana non servano tempi brevissimi...
è così?
 


A me sembra che i micro siano tirati all'osso:
 
1) La conversione bin->BCD e` un compito specifico non sempre necessario.
 
2) A quante "cifre" dovrebbe essere realizzata? (con il rischio che 
siano troppe o troppo poche)
 
 


ok,ma i microcontrollori sono tipicamente pieni di moduli che fanno 
compiti non necessari
per esempio uno potrebbe non avere bisogno dell'ADC,della 
UART,dell'RTC,touch sensing ecc probabilmente alcuni di questi moduli 
sono anche di più difficile implementazione
 
Cifre...facciamo 10 max per rappresentazioni a 32 bit e uno si sceglie 
quante usarne
 

 quante usarne
 
E' una funzione che anche se implementata nel microcodice richiede svariati cicli macchina e non avvantaggia granché le prestazioni rispetto ad un algoritmo.
Inoltre è tipica dei CISC e non dei RISC come attualmente sono confezionati la maggior parte dei micro.
Per essere fruibile dovrebbe poter convertire un numero arbitrario di byte che a questo punto non possono risiedere nei registri del micro ma puntati da un registro in modo indiretto.
Quindi occorrerebbero:
- registro puntatore dato binario sorgente
- registro puntatore dato BCD destinazione
- contatore di cifre a decremento
- eventuali opzioni (numeri negativi, virgola, esponenziale, ecc.)
Magari velocizzi l'operazione del 50% ma non credo ne valga la pena proprio per il motivo che tu stesso hai identificato: è una trasduzione per gli umani e quindi lenta.
Su di uno strumentino con qualche digit effettuo tale conversione 7 volte al secondo perché se vado oltre vedo solo degli inutili "8".
Praticamente, per tale operazione la CPU viene impegnata meno dell'un per mille.
E usando la virgola genero molte cifre.
 
Piccio.

 compiti non necessari
 
Quello che č non necessario per te puň essere indispensabile per qualcun
altro. La differenza fra un ADC e una ALU che supporta BCD č che il primo
serve a piů persone della seconda.
 
E' normale che i costruttori di MPU implementino ciň che serve a piů
persone; č una questione puramente economica, non esiste nessun motivo
tecnologico per non farlo, tanto č vero che con semplici ricerche in google
puoi trovare parecchi articoli accademici che trattano l'aritmetica BCD ad
alte prestazioni:
 
http://www.owlnet.rice.edu/~km9/website/papers/iscas.pdf
 
http://www.csjournals.com/IJCSC/PDF5-1/22.%20ujjwal.pdf
 
 
-- 
Fletto i muscoli e sono nel vuoto.

 tecnologico per non farlo, tanto è vero che con semplici ricerche in 



Infatti la conversione bin-bcd serve quasi
esclusivamente nell'output verso gli umani
che notoriamente acquisiscono dati numerici
con molta lentezza e percio' la velocita'
di conversione realizzata in software e'
ampiamente sufficiente.
Tuttavia ai primordi dell'informatica, quando
una unica cpu costosissima, lenta era suddivisa
tra centinaia di utenti, era vantaggioso
eseguire la conversione bin-bcd all'interno
delle stampanti che dovevano stampare lunghissimi
tabulati di dati contabili o scientifici.
Non esistevano i micro e la conversione era
eseguita in hardware.
I dati arrivavano alla stampante in binario
seriale e un semplice circuito abbastanza
geniale composto solo da pochi TTL era in
grado di convertire serialmente senza ritardi
qualunque stringa di bit nel corrispondente BCD.
Il problema della conversione binario decimale
comunque doveva essere sentito anche all'epoca
dei primi microprocessori. L'Intel 8080 e seguenti
(Z80, 8086, ecc.) avevano apposite istruzioni
per eseguire operazioni su dati BCD, in modo da
evitare conversioni. Penso che tali istruzioni
siano ancora presenti come fossili in tutti i
Pentium e derivati attuali.

Pentium e derivati attuali.
 
Si, i 283-386 hannole istruzioni DAA (Decimal Adjust after Addition)
e  DAS (Decimal Adjust after Subtraction), lavorano solo su AL (8 bits)
e come molte altre funzionano anche sui processori moderni.
 
Un esempio:
 
	MOV	AL,12
	SUB	AL,03	;AL=0FH
	DAS		;AL=09H
 
Mi sento ringiovanito di almeno 5 lustri   :-)
 
--
ciao
  Stefano

 Mi sento ringiovanito di almeno 5 lustri   :-)
 
Io, invece, con l'avanzare dell'età sto rincoglionendo e non riesco quasi più a contare o meglio conto in base 4: uno, due, molti, troppo.
 
Piccio.