kucaio Inserito: 26 maggio 2010 Segnala Share Inserito: 26 maggio 2010 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 minimoDove: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’LM35La 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 More sharing options...
Livio Orsini Inserita: 27 maggio 2010 Segnala Share Inserita: 27 maggio 2010 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 More sharing options...
accacca Inserita: 27 maggio 2010 Segnala Share Inserita: 27 maggio 2010 (modificato) 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'ordinese vuoi arrotondare ci metti ((valore*range)+512)/1024 così ti arrotonda meglioper le operazioni matematiche in asm ho trovato queto con googlehttp://www.piclist.com/techref/microchip/math/index.htm Modificato: 27 maggio 2010 da accacca Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 27 maggio 2010 Segnala Share Inserita: 27 maggio 2010 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 More sharing options...
accacca Inserita: 28 maggio 2010 Segnala Share Inserita: 28 maggio 2010 bhe Livio togliamoci pure il piccolo è un errorela procedura è sbagliata anche se sul 10bit produce un piccolo errore. Link al commento Condividi su altri siti More sharing options...
kucaio Inserita: 28 maggio 2010 Autore Segnala Share Inserita: 28 maggio 2010 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 byte00110001 ( 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 More sharing options...
accacca Inserita: 28 maggio 2010 Segnala Share Inserita: 28 maggio 2010 (modificato) Credo di parlare anche per Livio nessun litigioio ho sbagliato Livio ha corretto finequello 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.99sommando 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 quidimenticavo se vedi al link che ti ho indicato c'è tutto anche per al conversione hex->ascii ecc. Modificato: 28 maggio 2010 da accacca Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 28 maggio 2010 Segnala Share Inserita: 28 maggio 2010 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 More sharing options...
giacomo56 Inserita: 28 maggio 2010 Segnala Share Inserita: 28 maggio 2010 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 More sharing options...
Livio Orsini Inserita: 29 maggio 2010 Segnala Share Inserita: 29 maggio 2010 (modificato) 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 - 12 bits ==> 0 - 1 - 2 - 3 ==> [(2^2)-1]3 bits ==> 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 ==> [(2^3)-1]......e così viaoppure, 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: 29 maggio 2010 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 29 maggio 2010 Segnala Share Inserita: 29 maggio 2010 D'accordo ma nel calcolare la tensione fornita dall'adc io uso la Vref e non il valore massimo, questa è la differenza. Ciao. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 29 maggio 2010 Segnala Share Inserita: 29 maggio 2010 (modificato) 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: 29 maggio 2010 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 29 maggio 2010 Segnala Share Inserita: 29 maggio 2010 Grazie della risposta Livio.Ciao. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora