Ho un problema con il sensore LM35
Posted: 22 Nov 2012, 14:59
Ciao a tutti,
vorrei iniziare a programmare in BASCOM ma per adesso sto continuando a programmare in assembly e proprio qui cade l'asino.
scrivo per segnalarvi un problema riscontrato con il rilevamento di un segnale di tensione con un sensore. Sto lavorando in assembly con un mcu dell'Atmel. Ho settato un display lcd secondo il datasheet dell'hd44780 e dopo qualche piccolo problemino ha funzionato , riesco ad inviare qualunque frase e lui me la mostra. Il problema sorge con l'invio dei dati rilevati da sensore , un comunissimo lm35dz con range [0-100]°C , l'lcd non mi mostra la temperatura rilevata. Non è un problema dell'lcd perché esso funziona con qualunque dato inviato. Il sensore è apposto , ho controllato all'oscilloscopio. L'intero circuito non fa una grinza , i collegamenti sono esatti e come da datasheet. Credendo fosse un problema di potenza del segnale, avevo anche pensato di porre tra sensore e porta dell'adc un operazionale ma neanchè tale soluzione non fu valida. Ergo , il problema sta nel settaggio dell'adc. Il main del programma è il seguente:
ciclo:
rcall posiziona_cursore
rcall invia_temperatura
rjmp ciclo
La prima label non fa altro che posizionare il cursore all'indirizzo della ddram desiderato , mentre nella seconda invio in tale posizione la temperatura contenuta nel registro ADCH (il risultato è left adjusted per cui non prendo in considerazione il registro ADCL).
Ovviamente non posso inviare in maniera diretta ADCH sul bus dati dell'lcd , per cui ho scritto delle linee di codice di compare-branch che mi sdoppiassero il risultato della conversione , contenuto nel registro , in decine e unità in maniera tale da inviare un dato per volta (giusto no???). Un mio dubbio è il seguente: sul datasheet dell'lm35dz ho letto che ad 1°C corrispondono 10mV , per cui se ho 250 mV avrò una temperatura di 25°C. Alla fine di ogni conversione ho il dato (stringa di bit) in ADCH ma tale risultato è ancora una tensione (ad esempio 270mV) o è già un valore di temperatura (cioè 27°C)? perché se così fosse prima di effettuare le operazioni di compare-branch dovrei dividere il valore della conversione per 10, capite cosa intendo dire?
Per il resto non saprei , sul datasheet del mcu ho letto che l'inizializzazione dell'adc prevede il settaggio dei due registri ADMUX e ADCSRA , io li ho settati così:
Ho anche settato la modalità di sleep per l'adc reduction noise. Ogni conversione dura 25 cicli di clk a 250kHz sono circa 100uS , per cui mi son creato una routine di delay che richiamo appena pongo ADSC = 1.
Non riesco proprio a capire cosa c'è che non va , spero in qualche prezioso chiarimento
Vi ringrazio in anticipo
vorrei iniziare a programmare in BASCOM ma per adesso sto continuando a programmare in assembly e proprio qui cade l'asino.
scrivo per segnalarvi un problema riscontrato con il rilevamento di un segnale di tensione con un sensore. Sto lavorando in assembly con un mcu dell'Atmel. Ho settato un display lcd secondo il datasheet dell'hd44780 e dopo qualche piccolo problemino ha funzionato , riesco ad inviare qualunque frase e lui me la mostra. Il problema sorge con l'invio dei dati rilevati da sensore , un comunissimo lm35dz con range [0-100]°C , l'lcd non mi mostra la temperatura rilevata. Non è un problema dell'lcd perché esso funziona con qualunque dato inviato. Il sensore è apposto , ho controllato all'oscilloscopio. L'intero circuito non fa una grinza , i collegamenti sono esatti e come da datasheet. Credendo fosse un problema di potenza del segnale, avevo anche pensato di porre tra sensore e porta dell'adc un operazionale ma neanchè tale soluzione non fu valida. Ergo , il problema sta nel settaggio dell'adc. Il main del programma è il seguente:
ciclo:
rcall posiziona_cursore
rcall invia_temperatura
rjmp ciclo
La prima label non fa altro che posizionare il cursore all'indirizzo della ddram desiderato , mentre nella seconda invio in tale posizione la temperatura contenuta nel registro ADCH (il risultato è left adjusted per cui non prendo in considerazione il registro ADCL).
Ovviamente non posso inviare in maniera diretta ADCH sul bus dati dell'lcd , per cui ho scritto delle linee di codice di compare-branch che mi sdoppiassero il risultato della conversione , contenuto nel registro , in decine e unità in maniera tale da inviare un dato per volta (giusto no???). Un mio dubbio è il seguente: sul datasheet dell'lm35dz ho letto che ad 1°C corrispondono 10mV , per cui se ho 250 mV avrò una temperatura di 25°C. Alla fine di ogni conversione ho il dato (stringa di bit) in ADCH ma tale risultato è ancora una tensione (ad esempio 270mV) o è già un valore di temperatura (cioè 27°C)? perché se così fosse prima di effettuare le operazioni di compare-branch dovrei dividere il valore della conversione per 10, capite cosa intendo dire?
Per il resto non saprei , sul datasheet del mcu ho letto che l'inizializzazione dell'adc prevede il settaggio dei due registri ADMUX e ADCSRA , io li ho settati così:
ADMUX:
REFS0 = 1 , REFS1 = 0 ; tensione di riferimento 5 V con condensatore sul pin di aref
ADLAR = 1 ; risultato left-adjusted
MUX[0-4] = 0 ; acquisizione single-ended da ADC0
ADCSRA:
ADEN = 1 ; abilitazione dell'adc
ADSC = 1 ; inizio conversione
ADATE = 0 ; no auto-trigger
ADIF = 1 / ADIE = 1 ; abilitazione degli interrupt
ADPS[0-1] = 0 / ADPS2 = 1 ; fattore di prescaler = 16 (La freq.del sistema è 4MHz per cui la freq.dell'adc sarà 250kHz).
Ho anche settato la modalità di sleep per l'adc reduction noise. Ogni conversione dura 25 cicli di clk a 250kHz sono circa 100uS , per cui mi son creato una routine di delay che richiamo appena pongo ADSC = 1.
Non riesco proprio a capire cosa c'è che non va , spero in qualche prezioso chiarimento
Vi ringrazio in anticipo