scrivere leggere in eeprom esterna una viarbile maggiore 255

salve

non riesco a scrivere una variabile su una eeprom esterna 24c32 con la libreria Eeprom24C32_64.h

praticamente devo scrivere il valore di temperatura

eeprom.writeByte(485, (setTempC * 10));

dove setTempc è un valore 27.5 gradi che moltiplicato per 10 mi diventa 275

ho provato a fare una cosa del genere ma non mi funziona

int setTempc;

eeprom.writeByte(485, highByte(setTempc));
eeprom.writeByte(485 + 1, lowByte(setTempc));

poi per richiamare il valore

setTempc = (eeprom.readByte(485)*256)+eeprom.readByte(485+1);
setTempC /= 10;

ma non mi funziona

mi potete aiutare per favore?

Ciao Non me ne intendo ma (salvo errore di copia) la eeprom si Legge con un "readbyte".

Ciao pippo72

pippo72: Non me ne intendo ma (salvo errore di copia) la eeprom si Legge con un "readbyte".

Logica semplice, lineare e vera. ;) ;) :D ;) ;D ;) Ciao Uwe

con la libreria Eeprom24C32_64.h per leggere la eeprom si usa eeprom.readByte

birrohgt:
con la libreria Eeprom24C32_64.h per leggere la eeprom si usa eeprom.readByte

Ok, ma funziona con eeprom.readByte al posto di
setTempc = (eeprom.writeByte(485)*256)+eeprom.writeByte(485+1);
?
Ciao Uwe

si se uso ad esempio

eeprom.writeByte(485, 50);

mi scrive perfettamente il valore 50 nella cella 485

logicamente se il valore è superiore a 255 non me lo scrive in questo modo

allora hai risolto? Ciao Uwe

non ancora cercavo un vostro aiuto

Ma la mia osservazione l'hai capita? Nel primo post hai scritto che la eeprom la scrivi con eeprom.writebyte e la leggi ancora con un altro writebyte. Facendo una cosa alla volta un singolo byte lo leggi e lo scrivi senza problemi?

Ciao Pippo72

scusa ho sbagliato a scrivere dovevo scrivere readByte

birrohgt: scusa ho sbagliato a scrivere dovevo scrivere readByte

Ok, e cosa hai scritto nello sketch?

Ciao Uwe

readByte come deve essere

Se utilizzassi due indirizzi per salvare?

Mi spiego.

Nel caso in cui il numero da salvare sia superiore a 255 (es. 270), sottrai 255 a tale valore (270) e memorizzi la differenza in una nuova variabile (20). Successivamente, 255 lo salvi all'indirizzo 0 e la differenza (20) all'indirizzo 1. Se il valore che devi salvare è inferiore a 255, all'indirizzo 1 salvi il valore 0. Al momento della lettura fai la somma dei due indirizzi.

Non so per cosa ti serva, ma credo che in qualsiasi caso con un po' di ottimizzazione te la dovresti cavare con pochissimo codice.

Può andare come soluzione?

birrohgt: poi per richiamare il valore

setTempc = (eeprom.readByte(485)*256)+eeprom.readByte(485+1);
setTempC /= 10;

ma non mi funziona

Certo che non funziona, la eeprom.readByte ritorna un dato byte, se lo moltiplichi per 256 ottieni il risultato della moltiplicazione troncato ai primi otto bit, ovvero ottieni sempre zero. Devi fare un casting a intero oppure assegna il valore della prima readbyte ad una variabile locale intera prima della moltiplicazione, poi fai la moltiplicazione, o uno shift a sinistra di otto bit, e sommi il secondo valore.

RoMZERO: Se utilizzassi due indirizzi per salvare?

Mi spiego.

Nel caso in cui il numero da salvare sia superiore a 255 (es. 270), sottrai 255 a tale valore (270) e memorizzi la differenza in una nuova variabile (20). Successivamente, 255 lo salvi all'indirizzo 0 e la differenza (20) all'indirizzo 1. Se il valore che devi salvare è inferiore a 255, all'indirizzo 1 salvi il valore 0. Al momento della lettura fai la somma dei due indirizzi.

Non so per cosa ti serva, ma credo che in qualsiasi caso con un po' di ottimizzazione te la dovresti cavare con pochissimo codice.

Può andare come soluzione?

potrebbe ma il valore è un valore variabile perché è una temperatura

[/quote]

astrobeed: Certo che non funziona, la eeprom.readByte ritorna un dato byte, se lo moltiplichi per 256 ottieni il risultato della moltiplicazione troncato ai primi otto bit, ovvero ottieni sempre zero. Devi fare un casting a intero oppure assegna il valore della prima readbyte ad una variabile locale intera prima della moltiplicazione, poi fai la moltiplicazione, o uno shift a sinistra di otto bit, e sommi il secondo valore.

scusa ma non ho capito bene mi faresti un esempio?

grazie

birrohgt: potrebbe ma il valore è un valore variabile perché è una temperatura

La mia proposta è un artificio, che potrebbe funziona (almeno credo), ma non ho grande esperienza in merito.

Aldilà di quanto ti ho proposto, ho fatto un po' di ricerca e mi sono imbattuto in questa libreria, che dovrebbe semplificare di molto la gestione "automatica" dei diversi formati durante il write/read sulla eeprom.

http://thijs.elenbaas.net/2012/07/extended-eeprom-library-for-arduino/

Il problema NON è nella EEPROM e nemmeno nella libreria ... ... è che se leggi un valore di tipo byte e lo moltiplichi per 256 ... VAI IN OVERFLOW !!!

La soluzione è o mettere i bytes in variabili di tipo int (16 bit) o, più semplicemente, usare l'operatore "cast" per indicare al compilatore di trattare qull'operazione con il giusto tipo !!!

Guglielmo

ma non leggo un valore tipo byte ma di tipo int

birrohgt: ma non leggo un valore tipo byte ma di tipo int

Perché tu credi che "eeprom.readByte()" legga un int ? ? ? :o

Guglielmo

Ma io leggo da due gg il topic, mi sembra impossibile che non ti sia venuto in mente di registrare 27.5 su due celle della eeprom, prendi il numero, separalo e fine…

io non credo che avrai mai una temperatura ambiente superiore ai 255 gradi, e come decimali non penso superiori a 99