mantenere lo stato di una variabile tra più sessioni

Ciao, devo utilizzare arduino in maniera discontinua:
non è necessario che arduino sia continuamente in funzione ma che sia in funzione (alimentato) solo in un certo periodo. Quindi si vengono a creare diverse sessioni di lavoro.
Vorrei poter recuperare il valore di una variabile (int) tra una sessione ed un'altra.

Per farmi capire meglio:
-accendo arduino (sessione 1): tra le varie cose assegna un valore ad una variabile (int var=5;)
-spegno arduino
-accendo arduino (sessione 2): il valore di var viene mantenuto dalla sessione precedente
-spegno arduino
e cosi via..
come è possibile avere questo comportamento?

federico

cosi a sapnne, direei di usare una eprom esterna.
cosi ti scrivi li i tuoi dati da mantenere.

nelle sezioni di spiegazine di arduino, se non erro ce scritto come fare (ce un apposita libreria).
ora non posso darti un link che son di frettissima

Mandi

Direi di usare la EEprom interna al ATmega328; ne ha 1kB e non é usata.
Vedi libreria EEprom.

Ciao Uwe

Guarda che spegnere significa togliere l'alimentazione, quindi vediamo un pò di capire la necessità principale.

Il PC lo puoi mettere in sospenzione, la mcu la metti in sleep, e qui sul forum ci sono discorsi di Menniti e Leo72 ecc, che possono tornare utili. Questa modalità operativa però richiede una sorgente di alimentazione e se questa per una causa qualsiasi viene a mancare non sarà possibile fare il resume.

Mentre se la necessità è quella di togliere totalmente l'alimentazione e al riavvio serve avere solo i valori di alcune variabili inizializzate, allora si può scrivere i valori di queste in EEPROM, ma la cosa diventa un pò più complessa.

Spiega nel dettaglio.

Ciao.

Ciao,
usa la eeprom interna, funziona benissimo, io l'ho usata per ripristinare lo stato delle porte dopo un riavvio, proprio quello che vuoi fare tu e funziona perfettamente:

Ricordati che devi salvare il valore in Eeprom PRIMA di spengere l'Arduino quindi devi prevedere una procedura.

Ricordati che la EEPROM interna è garantita per 100.000 scritture quindi non puoi dal programma scrivere continuamente i dati nella EEPROM, porteresti alla "morte biologica" le celle di memoria usata in pochi minuti. Devi perciò prevedere un modo per avvisare l'Arduino che stai per staccare l'alimentazione: questo "avviso" potrebbe essere ad esempio un pulsantino da leggere. Quando l'Arduino lo trova chiuso, salva la variabile, ferma l'esecuzione del codice (affinché il valore della stessa non continui a cambiare) dopodiché informa l'utente (tramite un qualcosa di visibile/udibile tipo un led o un cicalino) che il salvataggio è stato fatto e che può disconnettere l'alimentazione.

Grazie a tutti per le risposte ragazzi. Si si avete colto nel segno.
@leo
ma il fatto di superare le 100.000 scritture su certe locazioni della EEPROM compromette in qualche modo il corretto funzionamento dell'atmega?
voglio dire, posso continuare ad usare lo stesso atmega (senza usare sketch che scrivono nella EEPROM) oppure l'atmega non è più utillizzabile?

federico

Comprometti la EEPROM.
Ma siccome la EEPROM è una memoria tampone, NON usata dall'Arduino (lo sketch, il programma, risiede su Flash, i dati vengono invece gestiti in SRAM), l'Arduino funzionerà comunque solo che la scrittura in quelle locazione ormai "defunte" porterà a letture successive di valori errati.

Il micro funziona comunque, solo che non riesci più a scrivere nella posizione della eeprom.
Nella mia applicazione le scritture sono minime, le prese comandate dalle porte cambiano stato sei volte all'anno, quando devo forzare il riavvio dei server.
Salvare nella eeprom solo quando si sta per spegnere il micro è una buona soluzione.
Ho provato a leggere il datasheet dell'ATmega328 e da quello che ci ho capito ha solo il brown-out reset, che lo riavvia se la tensione di alimentazione scende sotto una certa soglia.
Purtroppo non ha un interrupt da abilitare quando la tensione di alimentazione scende sotto un certo valore, in questo modo si sarebbe potuta implementare una procedura di salvataggio dei dati nella flash un attimo prima dello spegnimento, un micro che ha questa funzione è il ds89c440 un 8052 compatibile.

bigjohnson:
Purtroppo non ha un interrupt da abilitare quando la tensione di alimentazione scende sotto un certo valore, in questo modo si sarebbe potuta implementare una procedura di salvataggio dei dati nella flash un attimo prima dello spegnimento,

Questo si può fare usando un partitore di tensione ed un maxi-condensatore come batteria tampone.
Leggendo sul partitore il micro può accorgersi di quando la tensione di alimentazione viene a mancare. Il maxi-condensatore su Vcc deve essere calcolato in modo da fornire tensione per alcune decine di millisecondi (una scrittura sulla EEPROM richiede 3,3 ms).

bigjohnson:
Ho provato a leggere il datasheet dell'ATmega328 e da quello che ci ho capito ha solo il brown-out reset, che lo riavvia se la tensione di alimentazione scende sotto una certa soglia.

Non lo riavvia se scende sotto una certa soglia, ma lo ferma e lo riavvia quando la condizione di tensone troppo bassa va via.
Ciao Uwe

leo72:
Ricordati che devi salvare il valore in Eeprom PRIMA di spengere l'Arduino quindi devi prevedere una procedura.

Ricordati che la EEPROM interna è garantita per 100.000 scritture quindi non puoi dal programma scrivere continuamente i dati nella EEPROM, porteresti alla "morte biologica" le celle di memoria usata in pochi minuti. Devi perciò prevedere un modo per avvisare l'Arduino che stai per staccare l'alimentazione: questo "avviso" potrebbe essere ad esempio un pulsantino da leggere.

Sul Service Manual del glorioso nokia 9110 c'era scritto che i pin del cellulare su cui faceva contatto la batteria non erano tutti lunghi uguali, ma ce n'era uno più corto: in questo modo, quando veniva staccata la batteria, quello corto si staccava prima, e nei pochi millisecondi che trascorrevano dal distacco del pin corto al distacco degli altri pin (a molla), il sistema poteva "fare delle cose" che bisognava assolutamente fare prima dello spegnimento.

"Pochi millisecondi" sembrano un tempo brevissimo per noi umani, ma una semplice Arduino a 16 MHz in 1 millisecondo fa 16000 "cose". :wink:

uwefed:
Non lo riavvia se scende sotto una certa soglia, ma lo ferma e lo riavvia quando la condizione di tensone troppo bassa va via.
Ciao Uwe

Uhm.. no, non è così purtroppo. Il brown-out manda un segnale di reset continuo al processore finché la tensione non risale sopra alla soglia di intervento del brown-out, che per i 328 è impostabile a 1V8, 2V7 e 4V3. (pag. 49).

Questo perché operare sotto una certa tensione comporta anomalie di funzionamento per alcuni componenti. Uno è proprio la memoria EEPROM, che se viene scritta sotto ad una certa tensione, possono esserci corruzioni nei dati (pag. 20).

ma lo ferma e lo riavvia

Non é il risultato del reset tenuto LOW dal circuito brown-out?
Fermo (durante il reset LOW) e riavvia (quando il reset cambia a HIGH)?
Ciao Uwe

Ah, OK!
Ho capito. Per "fermo"Intendevi il blocco del micro con uno stato di LOW sulla linea di reset mentre io avevo inteso che tu stati pensando ad uno stato di stand-by: mi aveva tratto in inganno la tua affermazione successiva, "riavvio". Sorry