Evitare di superare i cicli di scrittuta EEPROM !!!!!

Salve amici, sono un appassionato da Arduino, ho iniziato a fare i primi esempi, ma oggi mi sono imbattuto in un problema insolito.
Voglio memorizzare dati su EEPROM, ma essendo un ciclo non infinito mi sono detto ""COME FACCIO!!!!""
Avete in merito qualche suggerimento?

La EEprom la utilizzo per salvare gli stati dei pin in uscita, a ogni cambiamento di stato viene salvato in EEPROM, ma se in un giorno vengono fatti piu volte ho la paura che a breve si scotta Arduino.

Come potrei evitare questo......

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

OGNI cella della EEPROM di Arduino ha una vita garantita di almeno 100'000 scritture ...

... se veramente fai così tante scritture da raggiungere facilmente tale limite, allora puoi applicare un buffer circolare come descritto nella Application Note di Atmel - AVR101 che ti allego assieme all'esempio di codice da loro fornito da studiare ed adattare.

Guglielmo

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

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

Grazie mille gpb01 per le regole imposte e il suggerimento consigliato.
Essendo un nuovellino non mi sono molte cose chiare.
Ce qualche esempio gia compilato per Arduino in formato .ino?

Ho visto il file mandato e scritto in C,anche se arduino e scritto in C, per me e impossibile leggerlo.

Non saprei ... prova a fare un po' di ricerche ... ma ti annuncio che se sei appena agli inizi ... dovrai studiare parecchio; è un argomento non semplicissimo.

Hai calcolato il numeo effettivo di scritture che devi fare ? Quante sono in un giorno ?

Guglielmo

ho fatto una media di 50 cicli giornalieri per ogni cella(EEPROM), facendo dei calcoli ho visto che posso arrivare a 5 anni, non sono tantissimi ma neanche pochi.

Ho letto un articolo sul forum che avuto lo stesso mio problema ma ha lascito per questione di tempo,lui facendo calcoli a una vita di 10 anni lasciando tutto invariato.

Mi domando come fanno tutte le centraline allarme e PLC ecc a mantenere in memoria tantissimi dati?

Se hai la reale necessità di modificare spesso la EEPROM puoi prendere in considerazione l'uso di una EEPROM I2C esterna, costano poco e sono semplici da usare, garantiscono oltre 1.000.000 di scritture per ogni cella, inoltre sono facilmente sostituibili senza dover cambiare il micro. :slight_smile:

Esistono altri tipi di memoria che non soffrono di questo problema ... es. le FRAM che esistono con bus I2C o SPI e sono utilizzabili con Arduino (... sapendo usare i suddetti bus, non credo si trovino librerie già fatte).

Guglielmo

P.S.: Astro mi ha preceduto con un'altra possibile soluzione. :slight_smile:

dovrei modificare il tutto, ma se voi mi consigliate questa strada, la devo percorrere,ho visto che linco il link

penso che sia il massimo di memoria possibile, risolvendo il mio problema.

Quella va benissimo. Oltretutto, come per quasi tutti i prodotti di Adafruit, c'è TUTTO :slight_smile:

Guglielmo

Sei sicuro che hai realmente la necessità di fare tutte quelle scritture sulla EEPROM ?
Se descrivi quello che devi fare possiamo trovare, se possibile, una soluzione che non richiede hardware aggiuntivo.

il problema e di salvare i dati se va via l'alimentazione,le uscite cambiano stato in continuazione per effetto di sensori esterni collegati su pin come INPUT,ovviamente al ripristino di alimentazione deve ritornare tutto come prima con le uscite precedentemente lasciate da blackout.

Pensavo a fare un circuito che mi alimentasse la CPU(Arduino) con qualche condensatore e un pin che a livello basso LOW mi scrivesse tutti i dati cosi risparmierei un po di cicli di scrittura.
Ho cercato in giro ma non trovato niente di utile :frowning:

I plc di solito "memorizzano" ben pochi dati, in ogni caso dicci cosa devi fare esattamente, tenteremo di darti alcune soluzioni.

speedyant:
I plc di solito "memorizzano" ben pochi dati, in ogni caso dicci cosa devi fare esattamente, tenteremo di darti alcune soluzioni.

Te lo ha appena scritto ... :grin:

AuAnWeb:
il problema e di salvare i dati se va via l'alimentazione,le uscite cambiano stato in continuazione per effetto di sensori esterni collegati su pin come INPUT,ovviamente al ripristino di alimentazione deve ritornare tutto come prima con le uscite precedentemente lasciate da blackout.

Guglielmo

Beh, io ho risolto semplicemente con millis() :slight_smile: Ovvero, salvo il dato finale nella EEPROM soltanto dopo tipo 3 ore e così facendo consumi moolto di meno la EEPROM. Se è per questo anche la flash di Arduino ha un limite di scritture, non spaventarti e pensa se ne hai realmente bisogno :slight_smile: :slight_smile: Intanto se tipo Arduino è sempre attaccato, ti serve sempre che venga salvato al millesimo il dato? Se non è così puoi usare millis e buonanotte e sogni d'oro.

Il suo problema è salvare lo stato macchina in caso di mancanza alimentazione, in questo caso o salvi tutto quello che serve ogni volta che c'è un cambiamento oppure prevedi un backup della alimentazione, per il solo micro, che dura quanto basta per salvare lo stato.
Se poi serve realmente salvare l'ultimo stato oppure potrebbe bastare un init di default del sistema dipende dall'applicazione, del resto se viene a mancare l'alimentazione il sistema va in stop e non è detto che all'avvio sia una cosa corretta ripristinare l'ultima condizione, ovviamente la questione va affrontata caso per caso dato che non è possibile stabilire una regola generale assoluta.

As_Needed: Ma leggete quello che AuAnWeb scrive o sparate risposte a caso ? ? ? :o :o :o

E si che sopra ho anche quotato la sua esigenza ... ti pare che possa fare quello che gli server ... "ogni tanto" ... usando millis() ? ? ? :o :o :o

Guglielmo

gpb01:

As_Needed: Ma leggete quello che AuAnWeb scrive o sparate risposte a caso ? ? ? :o :o :o

E si che sopra ho anche quotato la sua esigenza ... ti pare che possa fare quello che gli server ... "ogni tanto" ... usando millis() ? ? ? :o :o :o

Guglielmo

Ho capito, grazie. :slight_smile: Però salvare i dati ogni tanto, non significa che l'alimentazione manchi di continuo, metti un UPS e sei apposto, non vedo il problema. Anche a me serviva di salvare SEMPRE come dice, ma sempre solo perché sai che in un indefinito momento manchi l'alimentazione. Perciò o metti un UPS e usi millis, oppure prendi come dite una EEPROM esterna e salvi a go go, giusto perché non ti fidi dei blackout :slight_smile:

Ma se nel frattempo sono cambiati i valori dei sensori? In effetti andrebbe capito se è necessario mantenere i valori del momento del blackout.

Mica è detto che può mettere un UPS, magari il tutto è stazione meteo posta 3200 metri d'altezza sulle Dolomiti e l'alimentazione è tramite pannelli solari. :grin: