Newsgroup: it.hobby.elettronica.digitale
Titolo: Calcolo Floating point a 10 bit

Ciao a tutti.
Campiono un segnale a 10 bit con un MCU a 8 bit (16F876), e vorrei
visualizzare il risultato del campionamento su un display LCD. Per risultato
intendo il valore fisico, non il valore 0-1023. Ora avrei bisogno come
minimo di fare un prodotto e una somma su un numero a 10 bit, e qui posso
trovare in rete le routines matematiche. Il risultato (che sarà
ragionevolmente un numero Float a 16 bit), andrebbe troncato alla seconda
cifra decimale e poi visualizzato sul display. Come faccio? Conviene usare i
fixed point? prima della conversione in ascii devo passare per il BCD?
Olivier.

 intendo il valore fisico, non il valore 0-1023.
ma non è più semplice una RAM esterna di decodifica?
il valore fisico è l'indirizzo, quello che c'è a quell'indirizzo è il
"valore da visualizzare"

 
Io in questo caso ho usato una eeprom esterna contenente una tabella, 
come da te descritto. Nel mio caso la conversione richiedeva 
moltiplicazioni e divisioni complesse, alla fine le ho fatte con excel e 
ho inserito i risultati nella eeprom
ciao

 ho inserito i risultati nella eeprom
appunto, sopratutto se deve essere veloce IMHO non ha senso perdere 100
cicli per un campionamento...

 "valore da visualizzare"
E' una buona idea, ma i valori di calibrazione (le costanti da
sommare/moltiplicare), cambiano (cambieranno) dinamicamente. Anche il
campionamento mi piacerebbe farlo a 14-16 bit in un futuro, e a quel punto
la soluzione della tabella diventerebbe improponibile!  =)
Ho letto la AN670 della microchip in proposito, ma non c'ho capito molto per
la verità...
Olivier.

 cifra decimale e poi visualizzato sul display. Come
faccio?
Non c'è bisogno di usare numeri floating point!!!
Puoi fare tutto usando gli interi e la rappresentazione
fixed point.
Codifichi le costanti in virgola fissa (per esempio a 6
bit), esegui la moltiplicazione intera del numero a 10 bit
con quello a 6 (ottenendo un numero a 16 bit), tronchi il
risultato shiftando verso destra di un numero opportuno di
bit e sommi l'altro fattore.
Non posso essere più preciso perchè non conosco esattamente
ll'entità dei fattori di conversione ed il numero di
cifre che ti serve rappresentare...
Ciao,
Antonio

 cifre che ti serve rappresentare...
Ok, mi pare una buona idea non usare i FP!  =)
E' un paio di giorni che cerco info sulla virgola mobile, c'è un sacco di
roba in giro ma non ho trovato niente di chiaro e ben commentato. Anche le
AN della microchip non sono quel gran che...
Ritornando alla virgola fissa e alle operazioni tra interi, dovrebbe venir
fuori una cosa del tipo:
xxxxxxxx xxxxxxxx (PER) xxxxxxxx xxxxxxxx =
^unità   ^centinaia     ^unità   ^centinaia
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
^unità (16 bit)   ^ parti decimali da troncare
dove xxxxxxxx xxxxxxxx = numero da 0..256 + 0..2,56 = 0..258,56
Non mi risulta tanto chiara la cosa. Hai sottomano un esempio/link dove
approfondire? Le routine per le operazioni con numeri interi fino a 32bit le
conosco già, il fatto è che non so trattare i decimali.
Inoltre dovrei anche gestire numeri negativi.
Ti faccio un esempio di una tipica operazione da fare:
Risultato del campionamento = X = 10 bit = 0..1023
valore da visualizzare sull'LCD = (X - 529.25) * 0.03018
ovvero (X - 529.25) / 33.13
che restituisce numeri -16,00..15,00
graziie dell'aiuto
Olivier.

 che restituisce numeri -16,00..15,00
Ispirandomi fedelmente all'esempio direi di fare così:
1) aggiungi ai 10 bit del dato altri 6 bit a destra (6 bit è
arbitrario, per comodità diciamo...), per rappresentare la
parte decimale.
2) converti la costante da sommare nello stesso formato
(10+6). Per fare questo ti basta moltiplicare il numero
decimale per 2^6 ( = 64) e convertire in binario solo la
parte intera.
Es: 529.24*64 = 33871,36 = 33871 = 1000010001001111
Questo numero va intepretato come 1000010001.001111, però al
fine dei calcoli lo devi trattare come se fosse un normale
intero a 16 bit.
3) Azicchè moltiplicare per 0.03018, cercherei di utilizzare
una routine per la divisione tra interi, convertendo 33.13
nel formato a 16 bit di sopra (sempre moltiplicandolo per
64).
Se non riesci a trovare una routine per la divisione, devi
utilizzare un numero di bit  molto più grande per la parte
decinale, perchè 1/33.13 è già piccolo per essere
rappresentato bene con 6 bit.
4) Ottenuto il risultato a 16 bit devi interpretarlo come
detto, e quindi convertire in BCD la parte intera e decimale
separatamente.
Buon divertimento!
Antonio

> Buon divertimento!
Grazie dei consigli.
Per google: ho trovato anche questo link interessante per chi avesse il mio
stesso problema: 
http://www.embedded.com/98/9804fe2.htm
Olivier.