Sistemi per aumentare i numeri di scrittura affidabile su eeprom

Per un progetto dovrei tracciare il tempo effettivo di utilizzo di un Arduino con una precisione di ~1minuto e far durare la scheda almeno 10 anni (a spanne) quindi ~ 500k cicli.

Ho pensato più modi e vorrei avere un vostro parere su quale sia il migliore (anche per capire se alcuni sono overkill) e se vi siano altre opzioni più affidabili, sempre evitando di comprare un ulteriore componente hardware.

Metodo1:

Uso tre usigned long salvati sui byte 0->11, li scrivo e leggo tutti contemporaneamente. Se vi sono discrepanze (attese solo su uno alla volta) rilevo l'errore di scrittura. Questo metodo potrebbe essere usato anche con 5 numeri per aumentare la statistica.

Non ho trovato informazioni su come la eeprom inizi a rovinarsi (una superato un certo limite ne fallisce molto o solo sporadicamente?)

Metodo2:
Salvare i dati come 10 x unsigned int (2 byte) nella eeprom, e una volta raggiunto il valore massimo (o 50k) sul primo int iniziare ad incrementare il secondo. Così facendo potrei raggiungere i 500k cicli e basterebbe sommare tutti i 10 numeri.

Metodo3:
Utilizzare tre unsigned char per la definizione delle locazioni di memoria per la scrittura di 3 usigned long con una gestione simile al metodo 1. Una volta rilevato un errore ci si sposta nell'indirizzo libero successivo.

Esistono delle librerie che fanno già questi giochetti?

Grazie

Per un progetto dovrei tracciare il tempo effettivo di utilizzo di un Arduino con una precisione di ~1minuto e far durare la scheda almeno 10 anni (a spanne) quindi ~ 500k cicli.

60 minuti * 24 ore * 3560 giorni = 5.265.000 (5000K) :wink:

C'è un Application Note di Atmel relativa all'argomento ... ti allego il tutto ...

Guglielmo

AVR101 - High Endurance EEPROM Storage.pdf (47.3 KB)

Atmel - High Endurance EEPROM Storage.c (4.31 KB)

penso che qualsiasi metodo tu voglia impiegare una volta sctitti i dati vai a rileggerli e se sono uguali a quello che hai scritto ha funzionato, se il risultato è diverso cambi posizione di scrittura...
o altrimenti segui i consigli forniti dai pdf di Guglielmo dell'uso del buffer circolare :slight_smile:

Mah, lo so che ha chiesto di non usare componenti esterni, ma alla fin fine considerando pro e contro, non sarebbe più affidabile e semplice usare una NVRAM esterna?...

Patrick_M:
60 minuti * 24 ore * 3560 giorni = 5.265.000 (5000K) :wink:

Era per vedere se eravate attenti :smiley:

Patrick_M:
penso che qualsiasi metodo tu voglia impiegare una volta sctitti i dati vai a rileggerli e se sono uguali a quello che hai scritto ha funzionato, se il risultato è diverso cambi posizione di scrittura...
o altrimenti segui i consigli forniti dai pdf di Guglielmo dell'uso del buffer circolare :slight_smile:

Effettivamente molto più comoda, e inoltre
-> permette di estendere la vita al massimo effettivo
-> permette di capire il livello di consumo attuale (byte difettosi / byte funzionanti)

La domanda sorge però spontanea, la lettura è sempre ripetibile o è possibile che superato il tempo massimo diverse letture diano risultati differenti?

docdoc:
Mah, lo so che ha chiesto di non usare componenti esterni, ma alla fin fine considerando pro e contro, non sarebbe più affidabile e semplice usare una NVRAM esterna?...

Attualmente userò arduino 1 con relay shield, avere un componente volante risulterebbe molto scomodo.

Secondo me é emglio usare una RAM esterna che non si cancella come un FRAM e che ha un numero di scritture molto alte.
Ciao Uwe

brazoayeye:
Non ho trovato informazioni su come la eeprom inizi a rovinarsi (una superato un certo limite ne fallisce molto o solo sporadicamente?)

Ho fatto uno stress test. Le celle hanno iniziato a scantinare dopo circa 10 milioni di scritture, cioè cento volte il limite minimo garantito. Il fallimento era random, possono reggere altre cento scritture come solo due, e immagino che il tutto peggiori continuano a scriverci su. Non ho verificato se la rilettura continua dava sempre lo stesso valore.

In ogni caso dividerei la memoria in blocchi da 4 unsigned long.
Nel primo blocco si scrive solo l'indice di quello in uso (basta un byte da 1 a 63)

In ogni blocco si scrivono tre volte i dati e il numero di volte che il blocco è stato scritto.

Arrivati a 83500 scritture si passa al blocco successivo, per un totale di 63*83500 = 5260500 scritture, e si ha ancora un 20% di margine sul minimo garantito.

Ma si possono anche usare altri metodi per "consumare uniformemente" la memoria, tipo cambiare blocco ogni 64 scritture.

Claudio_FF:
Ho fatto uno stress test. Le celle hanno iniziato a scantinare dopo circa 10 milioni di scritture, cioè cento volte il limite minimo garantito.

Hai fatto il test fuori dalle specifiche del produttore. Oltre che quel dato vale per dei integrati EEPROM e non per la EEprom interna del ATmega328.

Le specifiche garantisco la retenzione del dato nella cella di memoria in condizioni di un range di temperature e per un determinato tempo dopo la scrittura ( da 10 a 99 anni) e un numero garantiro di cancellazioni/riscritture.

Il test che fai tu dove leggi il dato subito dopo la scrittura non dice niente per quanto tempo il dato resta invariato nella memoria.

Usa una memoria dove il produttore garantisce il numero di scritture che devono essere fatti.

Ciao Uwe

Ciao Uwe

uwefed:
Secondo me é emglio usare una RAM esterna che non si cancella come un FRAM e che ha un numero di scritture molto alte.

Concordo, infatti anche io avevo scritto "ma alla fin fine considerando pro e contro, non sarebbe più affidabile e semplice usare una NVRAM esterna?...".
Tra pro e contro non vedo tutto questo problema, a meno che l'OP non ci dica perché non possa/voglia/debba usare una FRAM (o anche solo una MicroSD forse è sufficiente...).