Vai al contenuto
PLC Forum


Lm 35 - conversione binario BCD


kucaio

Messaggi consigliati

Salve a tutti,

ho una domanda banale da porvi, ho un pic 16F877A con un ingresso analogico da cui ricevo il valore di temperatura espresso in volt e convertito dall’ADC in un valore binario con 10 bit di risoluzione sui registri ADRESL e ADRESH.

La mia prima domanda è:

Avendo 10 bit di risoluzione e volendoli utilizzare tutti (altrimenti non considero il registro ADRESL).

Come faccio ad effettuare la seguente conversione in assembler?

Valore temperatura attuale: Valore letto su ingresso / 1023 * range di lettura + Valore minimo

Dove:

Valore letto su ingresso è il valore presente sui registi ADRESL e ADRESH

1023 sarebbe un valore numerico ma espresso in 10 bit. ( come faccio?)

range di lettura = 205 ( 150 tmax e -55 tmin)

Valore minimo = -55 °C determinato dal dtasheet dell’LM35

La seconda domanda è:

dopo aver ottenuto il valore reale della temperatura letta, come faccio a trasferirlo su un display LCD ? o meglio come faccio a convertire il valore binario ottenuto sulla variabile Valore temperatura attuale ad esempio 12 espresso in 00001100’b in due byte 00110001 ( corrispondente ad 1 in ASCII) e 00110010 (corrispondente in 2 in ASCII) da inviare al display?

Grazie.

Link al commento
Condividi su altri siti


devi risolvere l'equazione t= valoreletto*205/1023 ed hai la temperatura in gradi a cui sommi -55 che equivale allo zero.

L'ideale sarebbe disporre di libreirie FP o usare "C".

Fai una ricerca usando come chiave BIN to BCD per PIC. Al limite ti metto il codice di una mia vecchia func in "C" da cui puoi ricavarne la filosofia.

Link al commento
Condividi su altri siti

Intanto perchè 1023 con l'A/D 10bit dividi per 1024 multiplo di due quindi ti basta fare shift a destra di 10bit ovviamente dopo aver moltiplicato altrimenti ti perdi tutto quindi

(valore*range)/1024 nell'ordine

se vuoi arrotondare ci metti ((valore*range)+512)/1024 così ti arrotonda meglio

per le operazioni matematiche in asm ho trovato queto con google

http://www.piclist.com/techref/microchip/math/index.htm

Modificato: da accacca
Link al commento
Condividi su altri siti

Piccolo errore.

Gli A/D dei PIC convertono in 8 o 10 bits.

La conversione su 10 bits da come valore massimo 1023 counts ovvero (2^10)-1. Considerare un fs di 1024 comporta un ulteriore errore di quasi 0.1%, a cui si sommano gli erori di conversione e gli arrotondamenti delle operazioni aritmentiche.

Link al commento
Condividi su altri siti

Signori non litigate ma risolvetemi il problema...ovviamente sto scherzando e vi ringrazio per la collaborazione, l'argomento mi ha suscitato ancora pi' interesse e chiedo a Livio vista la mia immensa ignoranza cosa sono le libreirie FP.

mentre chiedo ad accacca cosa voleva dire con questo:

se mi puo' indicare l'esempio in codice perchè non ho capito...

Infine chiedo, una volta ottenuto il valore esempio 12 °C sulla variabile valore_letto, come faccio a trasferirlo al Display o meglio come faccio a convertire un byte di valore numerico binario = 00001100 (12 °C ) in due byte

00110001 ( corrispondente ad 1 in ASCII)

e 00110010 (corrispondente in 2 in ASCII) da inviare al display?

mi potreste far eun piccolo esempio in assembler ?

PS (Per Livio ) :Quale libro mi consigli per avvicinarmi al C dei Pic?

Grazie ancora e scusate la durezza

Link al commento
Condividi su altri siti

Credo di parlare anche per Livio nessun litigio

io ho sbagliato Livio ha corretto fine

quello che mi chiedi serve ad arrotondare il risultato quando dividi due numeri e prendi la parte intera se ad esempio il tuo risultato è compreso tra 12 e 13 con la divisione normale ottieni 12 anche quando il risultato è 12.99

sommando metà del divisore prima di fare la divisione arrotondi in basso i valori minori di 12.5 e in alto quelli superiori secondo me l'approssimazione è migliore tutto qui

dimenticavo se vedi al link che ti ho indicato c'è tutto anche per al conversione hex->ascii ecc.

Modificato: da accacca
Link al commento
Condividi su altri siti

Nessun litigio anzi non si tratta di correzione, solo di precisazione; gli errori non son certo questi. Quando uno è un po' "sgamato" di simili semplificazione ne fa parecchie, l'importante è essere in grado di valutare quando si può e quando no.

La precisazione l'ho fatta più che altro perchè il consiglio è riferito a chi sembra un principiante.

Il "C" è sempre uguale nelle sue linee essenziali; io consiglio sempre il "linguaggio C" di D. M. RItchie e B. W. Kernigham c'è l'edizione in itlaiano ed un vero e proprio vangelo facile facile.

Poi in funzione del compilatore adottato ci sono le particolarità. Io uso, ad esempio, quello della CSC e mi basta l'help on line per capire le varie particolarità

Link al commento
Condividi su altri siti

In un convertitore a 10 bit la Vref è divisa in 1024 parti e quindi è giusto usare 1024 nella formula della tensione letta e non 1023.

Ciao.

Link al commento
Condividi su altri siti

Questo è un errore che commette chi non considare che nei 1024 passi è conpreso lo 0, pertanto il fondo scala vale, come ho scritto, (2^10)-1. Questa è matematica, non opinione.

Basta cominciare a contare in binario con le varie combinazioni:

1 bit ==> 0 - 1

2 bits ==> 0 - 1 - 2 - 3 ==> [(2^2)-1]

3 bits ==> 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 ==> [(2^3)-1]

......

e così via

oppure, se hai una calcolatrice che ammette differenti basi, prova a scivere un numero binario di 10 bits tutti ad 1 ed esegui la conversione in decimale: risultato 1023 (guarda caso)

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Commetti un errore; tracurabile, ma è sempre un errore.

Con riferimento a 5v ottieni passi da 4,887585mV, considerando 1023 gradini, oppure 4,882812mV considerando 1024 gradini. L'errore è pari a 4,773uV, cioè circa 0,1% come ho scritto in precedenza.

Si usa sempre e comunque Vref. Nel caso dei convertitori dei PIC, per alcuni modelli, ti puoi avvalere di una tensione di riferimento esterno che determina anche il valore di fondo scala, oppure, più semplicemente, si assume come valore di riferimento il valore della tensione di alimentazione.

In entrambi i casi, con 10 bits si ottengo 1023 gradini discreti, perchè il primo è sempre 0.

Non può essere altrimenti perchè con 10 bits si ottiene il numero binario 11.1111.1111 o 3FF in esadecimale.

Sarebbe come sostenere che con 3 decadi si contano 1000 passi! Con 3 decdi se ne possono contare solo 999.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...