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 5V 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


Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


lo puoi approssimare con
con un errore di
. 

![\[T=\frac{5}{1024\,0.01}\,ADC\] \[T=\frac{5}{1024\,0.01}\,ADC\]](/forum/latexrender/pictures/baa91db445bff502c931c8b5748d4e68.png)
è il valore a 10 bit del ADC.![\[T=0.48828125\,ADC\] \[T=0.48828125\,ADC\]](/forum/latexrender/pictures/498a0bc82ac64d67b364dedb04da4f78.png)
. La divisione per 2 la puoi fare con una rotazione a destra dei bit, facile e poco costosa.
il calcolo è leggermente più preciso. La divisione per 64 è una rotazione a destra di 6 bit.
con ADC valore ad 8bit contenuto in ADCH dico bene?
per la divisione per 20 potrei utilizzare uno shift a destra , in assembly esiste il comando: " lsr registro " uhm quanti shift in questo caso?![\[1+\frac{1}{1+\frac{1}{20+\frac{1}{3}}} = \frac{125}{64} = 1.953125\] \[1+\frac{1}{1+\frac{1}{20+\frac{1}{3}}} = \frac{125}{64} = 1.953125\]](/forum/latexrender/pictures/b28f5d6f8011f5737c266c64c74f9d2b.png)