Dubbio scrittura EEPROM.

Tu leggi l'intera struct da EPROM in RAM all'inizio del programma, e poi ce l'hai sempre disponibile, non serve leggerla ogni volta.

vediamo se ho capito

struct store{
int time_lamp[16];
byte rele_1[3][5];
byte rele_2[2][7];
float temperatura;
float delta;
byte count;
byte timer1;
byte timer2[6];
byte timer3[4];}

struct store EEPROM;



void setup(){

EEPROM.get(0x00,EEPROM);}

void loop(){
...........
EEPROM.put(0x00,EEPROM);}

Così leggo e memorizzo tutte le variabili insieme...
Mentre se voglio memorizzarne una sola alla volta

EEPROM.put(0x14,EEPROM.lamp[10]);

Così memorizza la singola cella, mentre se voglio memorizzare la singola variabile intera???

//*****singolarmente
EEPROM.put(0x00,EEPROM.lamp);

Funziona???

Tutto ok, eccetto che non capisco perché dovresti salvare o leggere una sola variabile. Fai che leggere o scrivere SEMPRE l'intera struttura, dimentica gli offset. A non scrivere più del necessario ci pensa la put(), non ti preoccupare.

Ah, ed eviterei di chiamare la struct EEPROM per evitare conflitti con la libreria.

La verità è che all’interno del loop c’ Un menu di selezione e diciamo che nn tutte le variabili vengono modificate, a volte una a volte due...quindi mi sembrava eccessivo scrivere anche quando nn c’è bisogno...ecco il perché scrivevo singolarmente...perdonami, Cosa intendi con”a nn scrivere più del necessario ci pensa la put()”???cioe scrive solo i dati cambiati??
Cambierò il nome della struct, così evito conflitti...

manolomao:
Cosa intendi con”a nn scrivere più del necessario ci pensa la put()”???cioe scrive solo i dati cambiati??

Note, unlike the single byte version EEPROM.write(),
the put method will use update semantics. As in a byte
will only be written to the EEPROM if the data is actually
different.

(https://www.arduino.cc/en/Tutorial/EEPROMPut)

PS: In un caso come il tuo, io faccio che salvare solo quando ESCO dal menù.

:o Caspita Sukkopera, è proprio quello che cercavo...
Grazie.
Ma esiste la possibilità di fare la stessa cosa con una EEPROM esterna, tipo una 24LC512??
Perchè leggevo un po' di cose in giro, e mi è sembrato che per scrivere sulla memoria esterna, utilizzando la wire.h, si deve fare un byte alla volta...Quindi come faccio a memorizzare l'intera struct, che contiene tra l'altro formati diversi??
E poi, posso usare anche qui il metodo put() che scrive solo se diverso?
Non mi è chiaro...
Grazie

Non vedo perché non dovrebbe essere possibile. Come detto al post #11, qualunque libreria o metodo di interfacciamento con una (E)EPROM tu scelga, avrai sempre almeno la possibilità di scrivere singoli byte. Ora, qualunque dato tu abbia in memoria è sempre scomponibile in singoli byte, indi per cui...

Poi ovviamente a seconda della libreria la cosa può essere più agevole. Alcune ti offriranno direttamente funzioni tipo put() e get(), oppure puoi implementartele da solo. Idem per la logica di update().

Se vuoi informazioni più dettagliate devi dirci quale libreria usi o comunque passarci il codice che usi per scrivere.

Posso chiederti perché vuoi usare una EEPROM esterna però?

Allora, parto dalla fine...
Il discorso di usare una EEPROM esterna era quello di poter utilizzare una memoria un giorno sostituibile, senza dover cambiare tutto il micro.
Per quanto riguarda la libreria, beh io fino ad ora ho usato la EEPROM.h, che se non sbaglio è fatta per utilizzare la memoria interna del micro, e poi uso la wire.h per utilizzare il display I2c.
Per quanto riguarda il codice, beh quello del post precedente funziona

struct store{
int time_lamp[16];
byte rele_1[3][5];
byte rele_2[2][7];
float temperatura;
float delta;
byte count;
byte timer1;
byte timer2[6];
byte timer3[4];}

struct store memorizza_EE;



void setup(){

EEPROM.get(0x00,memorizza_EE);}

void loop(){
...........
EEPROM.put(0x00,memorizza_EE);}

Devo ancora provarlo, ma sembra funzionare a logica...

OK, intendevo il codice/libreria che usi per scrivere sulla eventuale EEPROM esterna, ma ora mi pare di capire che non esista ancora.

Di sostituire il microcontrollore non mi preoccuperei... Tutti avete questa paura, ma nessuno ha ancora distrutto la EEPROM, forse perché non vi rendete conto di quante sono 100000 scritture. Se scrivi solo all'uscita del menù, hai voglia a entrarci ed uscirci 100000 volte... E poi con qualche trucchetto che trovi sul PDF che pubblica sempre gpb, puoi fare un uso ancora più furbo dell'intera EEPROM e aumentarne ulteriormente la durata.

SukkoPera:
E poi con qualche trucchetto che trovi sul PDF che pubblica sempre gpb, puoi fare un uso ancora più furbo dell'intera EEPROM e aumentarne ulteriormente la durata.

In allegato :smiley: :smiley: :smiley:

Guglielmo

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

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

:o
Ho aperto gli allegati di Guglielmo....
:confused:
Sono ad un livello molto più BASIC...Non ho capito molto....cosa fa quello sketch??
Sukkopera, no non ho idea di che libreria usare...
Vista la mia necessità, quale suggerisci?

manolomao:
Sono ad un livello molto più BASIC...Non ho capito molto....cosa fa quello sketch??

... quello che è descritto nel .pdf (... e NON chiamarlo sketch, NON è un .ino è un programma in 'C' :smiling_imp: )

Ovvio, non è esattamnete banale e richiede un certo studio ... ::slight_smile:

Guglielmo

Suggerisco di non farti problemi e usare la EEPROM interna, fine.

SukkoPera:
Suggerisco di non farti problemi e usare la EEPROM interna, fine.

Pienamente d'accordo ... oltretutto le 100'000 scritture sono il minimo garantito ... :wink:

Guglielmo

Ok mi avete convinto...
Credo che per ora utilizzerò la EEPROM interna, poi in tempi migliori proverò a studiare il caso...
Purtroppo ho bassissima conoscenza di C, però la mia curiosità è tanta...
Diciamo che l'avevo presa come 'sfida' quella di utilizzare l'EEPROM esterna, anche per capire meglio i meccanismi...mi affascinava l'idea di poter trattare l'EEPROM esterna come se fosse quella interna, ma ho visto che non è così semplice come credevo....
Peccato.
Se qualcuno vuole spendere del tempo per insegnarmi, lo accetto volentieri.... :grinning: :grinning:
Grazie.

manolomao:
Se qualcuno vuole spendere del tempo per insegnarmi, lo accetto volentieri.... :grinning: :grinning:

Non è che sia complicato, è che devi vederla come un'altra cosa collegata con un bus che, a seconda dei casi, può essere SPI o I2C e quindi richiede sia la conoscenza della gestione di detti bus (e/o l'uso delle relative librerie Arduino per accederci), che la conoscenza del chip (quindi studio del datasheet) per sapere con quali registri ed indirizzi colloquiare per leggere/scrivere.

Magari, per alcuni chip, si trova anche qualche libreria Arduino già pronta :wink:

Guglielmo

gpb01:
Magari, per alcuni chip, si trova anche qualche libreria Arduino già pronta :wink:

Mi autoquoto ... :smiley:

Ecco, mi è bastato cercare con Google "arduino external eeprom library" e trovare subito una libreria già bella che pronta per certe EEPROM esterne ... QUI, ma se cerchi anche tu, ci sono tanti altri link :wink:

Guglielmo

Ma infatti l'OP sta sopravvalutando la cosa. Non lo trovo necessario ma non è nemmeno particolarmente complicato; però soprattutto può benissimo farlo con una modifica minima al suo progetto, DOPO che l'ha fatto funzionare con la EEPROM interna.

Guglielmo, ho trovato anche questa libreria
https://koraykaraman.com/blog/3622/External-EEPROM-Read-Write-with-Arduino
Ma il mio dubbio è il seguente: hanno il metodoto put()??
A me sembra che entrambe utilizzano il write() senza vedere se il valore è variato, ma scrivono a prescindere...ho capito bene, o mi sbaglio??
Tra l'altro nella korayEEPROM.h nell'esempio scrive l'intera struct, proprio come vorrei io...
Grazie per il vostro aiuto...
Sukkopera, appena trovo del tempo faccio la modifica con la struct e EEPROM interna, poi vi dico...