Scrivere in EEprom

Ho la necessità di salvare dei dati in modo permanente nel 328P di arduino. In particolare i dati sono di tipo double e interi.

Si possono salvare sia double che interi così direttamento oppure c'è il limite di 8 bit.?

In caso del limite come si può ovviare?

Ciao grazie.

la EEPROM: http://arduino.cc/en/Reference/EEPROM
permette di scrivere un byte alla volta.
Quindi sta a te trovare un modo per indicare che tipo di dato stai per scrivere, suddividerlo nell’adeguato numero di byte, trovare abbastanza locazioni di memoria EEPROM libere e scrivere il tutto.
Ah e infine indicare che non ci sono più dati in EEPROM

un po' di tempo fa avevo provato ad usarla, non mi ricordo bene se era possibile salvare variabili incrementano il contatore di 4 o 8 a seconda che sia un int o un double (magari è una riminiscenza di plc).

In alternativa, puoi andare di shift, per un int ad esempio:

salvi i primi 8 bit nella prima cella della eeprom sposti a destra di 8 bit e salvi nella seconda cella ... e avanti così fino a completare i 4 byte che compongono un int.

Quindi devo fare a manina, cercavo una libreria che facesse il lavoro in automatico, quindi se non c'è mi tocca scriverla, anche se non sono molto ferrato.

Se c'è qualcuno che ha le stesse necessità si faccia sentire che vediamo se si può creare un libreria.

Ok grazie, ciao.

vuoi lavorare via i2c oppure no?

vuoi lavorare via i2c oppure no?

No, cioè non ho necessità di usare EEprom esterna, ma semplicemente ho dei valori che passo via seriale che devono essere salvati nel micro, e ripresi al reset.

ps: Ho seguito il progetto acquario anche se non ho l'acquario.

Stavo guardando il playground la mia attenzione è caduta sulla macro PROGMEM, anche se credo di non poterla usare nel mio caso.

Mi pare di aver capito che posso creare variabili che anziche risiedere in ram risiedono in flash programm, ma queste devo definirle prima, non so sono un po confuso.

Ok ciao grazie.

non conosco questa macro...

però alle eeprom ero interessato anche io...

mi piacerebbe sapere come intendi "capire" se nella eeprom c'è qualcosa oppure no, senza cambiare il codice ovviamente... mi spiego meglio... te parti la prima volta e salvi i valori... ma come fai a sapere che è la prima volta che parti e non la seconda?

le eeprom sono inizializzate in qualche modo?

non conosco questa macro... però alle eeprom ero interessato anche io...

Ancora ne so poco, quindi di stronz..ate ne dirò. Guardando la libc avr ho scoperto questa macro, poi mi pare di averla vista all'interno di qualche sorgente del core di arduino. Ora faccio un pò di confusione: Quando vuoi salvare variabili nello heap anziche nello stack i programmatori in c usano "const", leggendo in libc, mi ricordo di aver capito che questa cosa con arduino si comporta in modo diverso.

mi piacerebbe sapere come intendi "capire" se nella eeprom c'è qualcosa oppure no, senza cambiare il codice ovviamente... mi spiego meglio... te parti la prima volta e salvi i valori... ma come fai a sapere che è la prima volta che parti e non la seconda?

Scusa ma non ti seguo, forse perchè quello che devo fare io è diverso da quello che devi fare tu.

Io devo fare questo: Invio dei dati ad arduino tramite seriale il programma converte questi dati e inizializza le variabili in memoria, se questi dati sono buoni devono essere salvati, quindi l'utente invia via seriale il comando "store". Nella EEprom ci devono essere già dei dati di default, o almeno ci deve essere una struttura.

Tu forse hai la necessità di salvare il lavoro ad esempio una fase del programma, se va via la corrente tu vorresti che il micro ripartisse a fare quello che stava facendo prima dell'interruzione, in questo caso la cosa si fa più complicata, ma se avessi un orologio potresi salvare l'orario quando salvi i dati però non so quati cicli di salvataggio si accumulano così, troppi cicli potrebbero mettere in crisi le EEprom (morte prematura).

Spiegati meglio facendo un'esempio delle tue necesità.

Ciao.

Ho provato il codice di esempio nel playground e funziona e anche bene.
Il link è questo:
http://www.arduino.cc/playground/Code/EEPROMLoadAndSaveSettings

Comunque ci sono altri esempi persino un database ma non ho letto tutti i vari link.

Qui riporto solo quello che fa al caso mio.

Creo un struttura in C, chiamo loadSetting e saveSetting quando serve.
Semplice e immediato.

Ciao.

Io devo fare questo: Invio dei dati ad arduino tramite seriale il programma converte questi dati e inizializza le variabili in memoria, se questi dati sono buoni devono essere salvati, quindi l'utente invia via seriale il comando "store". Nella EEprom ci devono essere già dei dati di default, o almeno ci deve essere una struttura.

immaginavo di non essermi spiegato bene.... in sostanza te salvi dei dati sulla eeprom.... quindi li vorrai anche caricate no?... probabilmente te li caricherai "a comando"... io invece pensavo che li caricassi all'avvio (come vorrei fare io)....

io devo salvare dei dati, che li salvo appena immessi, per l'ora c'è rtc.... però io all'avvio dovrei caricare i dati in memoria... se presenti... in sostanza è questo il mio problema... il non sapere se ci sono o no dei dati (buoni) nelle eeprom...

Mi sembra un problema di programmazione, non di elettronica.
Riservi i primi byte della Eeprom per un “contatore” che viene aggiornato man mano che i dati vengono estrapolati da oppure salvati in memoria, una specie di puntatore allo stack, che indica sempre l’ultima locazione di memoria occupata. Ovviamente, se la locazione è maggiore di un certo valore, allora hai dei dati nella Eeprom.

Facciamo un esempio.
Hai una Eeprom da 32 KB, una taglio medio. Immaginiamo che devi salvare sia int che double, quindi 2 oppure 4 byte. Immaginiamo di far sì che ogni cella sia larga 4 byte, così perdì sì 2 byte salvando un int ma non perdi dei bit salvando un double in tagli di spazio inferiore.

Detto questo, 32 KB=32768 byte, che fanno 8192 celle da 4 byte.
Per indirizzare 8192 locazioni diverse hai la necessità di usare 13 bit, che arrotondati, diventano 4 byte. Quindi, riservi i primi 4 byte per il contatore.
Se il contatore è a 0, non hai dati in memoria, se è a 1, il 1° dato è nei byte $0004-0007, (ti ricordo che i byte da $0000 a 0003) sono il contatore. ecc... Se nel contatore leggi 1000 vuol dire che hai 1000 dati in memoria, di cui l'ultimo è sempre a partire dal byte (4*contatore)

@ Brig

Ok ho capito male, ora ci siamo ed quello che devo fare io anzi che ho fatto proprio grazie a quel codice nel playground.

Ci sono due funzioni: loadConfig e saveConfig loadConfig la metti nel setup, se in EEprom non ci sono dati, questo accade la prima volta, vengono presi i dati di default inseriti nella struct.

Poi quando vuoi chiami saveConfig per salvare tutto in EEprom.

Un grazie per il codice nel playground và all'autore Joghurt.

Ciao.

se in EEprom non ci sono dati, questo accade la prima volta

è una certezza, una tua supposizione, una supposizione di qualcuno, una specifica o che so io?

è questa una domanda importante per me… e la risposta determinerà il codice…

Immaginiamo che devi salvare sia int che double, quindi 2 oppure 4 byte.

mi risulta che un intero sia 4 byte anche in ardu :wink: (feci la prova con sizeof…)

er indirizzare 8192 locazioni diverse hai la necessità di usare 13 bit, che arrotondati, diventano 4 byte.

mi sono perso questo arrotondamento…
cmq il contatore iniziale… ok… ma siamo sicuri (come ho detto sopra) che all’inizio sia vuota la memoria? non è che ci sono dei bit casuali che possono venire interpretati come dati?

cmq devo andalizzare a modo quel codice li del playground… non lo ho capito molto bene…

Io mi sono basato sul reference, dove è scritto che un int siano 2 byte (http://arduino.cc/en/Reference/Int). Non ho mai provato con

Per l'arrotondamento, ho sbagliato :D Sono 2 byte, perché per indirizzare 8192 celle mi occorrono 13 bit, il multiplo di 8 più vicino a 13 è 16, che sono appunto 2 byte.