Newsgroup: it.hobby.elettronica.digitale
Titolo: Help PIC ! ! !

Sto cercando di creare un sistema di aquisizione dati mezzo PIC (in
particolare dati atmosferici).
Nello sviluppo del progetto mi sono bloccato al punto in cui devo elaborare
i dati acqusiti dall'adc interno al pic 16f876 ( range 0 - 1024) e
visualizzarli su un display 16x2 (Nel caso della temperatura -20.0 ...
+80.0)
Sono riuscito a visualizzare i valori positivi con i decimali ma non riesco
a visualizzare i valori negativi sempre con i decimali.
Per riassumere, io dovrei far eseguire al PIC la seguente operazione:
             valoreADC * 100
temp = -------------------- - 20
                      1024
Ovviamente il calcolo deve comprendere almeno un decimale!
Qualcuno e' in grado di aiutarmi?
Non riesco piu' ad andare avanti nel mio progetto se non supero questo
ostacolo!
P.S. Dovro' usare anche altre 5 formule differenti per poter portare a
termine il mio progetto.

 termine il mio progetto.
Devi sicuramente rendere la formula più digeribile per il pic...(entra
nell'ottica che non fa operazioni complesse...ma è veloce), se vuoi
semplificare fatti una routine in C
io sono tutt'altro che esperto ed il tempo mi è tiranno ma
come ultima spiaggia c'è sempre la LUT. (look up table dove ogni dato
restituisce un valore preciso, la palla è che devi caricare tutti i 1024 valori
che vuoi far corrispondere... se non ha problemi di memoria...)
CIAO, Riccardo.

 Ovviamente il calcolo deve comprendere almeno un decimale!
Ciao,
Per avere un decimale ti conviene, innanzitutto, usare la seguente formula:
              valoreADC * 1000
 temp = -------------------- - 200
                       1024
e considerare il numero moltiplicato per 10 (in pratica l'unita' restituita
dalla formula e' il tuo decimale).
Inoltre ti conviene rappresentare il valore assoluto di temp e avere un bit
che rappresenta il segno (0= segno +, 1= segno -).
La moltiplicazione valoreADC*1000 puoi ottenerla adattando la funzione
multiply fornita dalla microchip (cerca sul sito oppure fammi un fischio che
te la mando), questa e' stata realizzata per fare moltiplicazioni fra 2 byte
ma non dovresti impazzire piu di tanto a trasformarla in 10 bit.
La divisione per 1024 si fa banalmente con 10 shift a destra dei byte da
dividere.
Per la sottrazione puoi fare cosi':
controlla i 2 byte + significativi del risultato della divisione (a 10 bit):
se sono diversi da 0 (valore senzaltro superiore a 200) sottrai 200 a questo
numero (risultato positivo), altrimenti fai il confronto fra il byte meno
significativo del risultato e 2000 avrai i due seguenti casi:
Il byte e' maggiore di 200: fai la sottrazione (byte - 200) (risultato
positivo)
Il byte e' minore di 200: sottrai il byte a 200 (200 - byte) e setta il bit
del segno (risultato negativo)
Spero di essere stato chiaro e non averti complicato la vita :-)
Ciao
Massimiliano

news:3A31ECC4...@libero.it...

 ha scritto nel messaggio
news:3A31ECC4...@libero.it...


hai finito.
....
mi sembra che alla fine si abbia valore ADC convertito in BCD e basta.
ma poi, non e' piu' semplice fare il confronto del segno in binario,
prima della divisione?
1: valore_ADC - (20*1024/100) = Valore_ADC - 205
se il risultato e' negativo ne faccio il complemento a due cioe'
   valore_ADC = 0 - valore_ADC  ed attivo il "segno"
adesso in valore_ADC c'e' il valore assoluto della temperatura
ecc ecc...

hai finito.


ecc ecc...
E' chiaro che ci possono essere piů algoritmi per risolvere
lo stesso problema e la mia proposta non č detto che sia
la piů efficiente.
Io avevo pensato prima di trasformare il numero in BCD
e poi sottrarre 20.0 con una semplice aritmetica BCD.
Tu proponi di eseguire prima la sottrazione e poi di
trasformare in BCD.
Forse la tua soluzione č piů efficiente ma al momento in cui
ho esaminato il problema mi č venuto in mente solo una
soluzione.
Ciao
Paolo