codice numerico

Salve a tutti, sono nuovo su questo forum. Mi sono appena avvicinato ad arduino ed ho realizzato un progetto con arduino uno in cui viene comandato un relè in uscita in seguito alla digitazione di un codice su una keypad. Per cambiare il vecchio codice numerico con il nuovo senza ricaricare il programma nella flash ho creato una funzione che mi fa digitare il vecchio codice e se corretto mi fa digitare due volte il nuovo codice e poi lo salva. Ora il problema è che una volta tolta l'alimentazione il codice ritorna quello precedente, ovviamente. Ci sarebbe un modo per rendere permanente il cambio di codice a runtime?

Ciao,

potresti utilizzare la EEPROM del ATmega, sempre che questo codice tu non lo voglia cambiare con un alta frequenza. La vita garantita della EEPROM e' di 100 000 cicli di scrittura/cancellazione.

Buona giornata, Marco.

Basta che memorizzi il codice all'interno della EEPROM, quando parte il programma lo carichi su una variabile e se viene modificato sostituisci sulla EEPROM il vecchio codice con quello nuovo. Per l'utilizzo della EEPROM guarda qui.

Se hai la necessita' di scrivere strutture di dati puoi utilizzare

http://www.arduino.cc/playground/Code/EEPROMWriteAnything

oppure in alternativa puoi guardare questo

http://projectgus.com/2010/07/eeprom-access-with-arduino/

Ciao, Marco.

Grazie per le risposte e un 30 e lode per la velocità! Non avevo pensato proprio alla EEPROM, però a questo punto mi vengono in mente un paio di domande:

1) In questo caso mi va bene tanto il codice non cambierà spesso magari una volta o due all'anno. Ma se per caso il codice doveva cambiare spesso come potevo fare (tipo una volta ogni 10 secondi)? 2) Nel caso di rottura della EEPROM posso sostituirla con un altra equivalente oppure devo ricomperare tutto arduino? 3) Questa è una domanda che non c'entra con il problema. Mi sono sempre domandato, quando un progetto è arrivato alla fine cosa si fa? nel senso si mette arduino chiuso in una scatola con il circuito correlato? In giro c'è molto sui progetti ma niente che faccia vedere il montaggio ultimato cioè il lavoro finale che andra chiuso in una scatola. Io pensavo, siccome sembra uno spreco chiudere arduino in una box, forse qualcuno si costruisce un arduino meno potente ma che assolva alle funzioni preposte o sbaglio? 4) Dove posso trovare un applicazione di arduino nel mondo reale (nel senso qualche prodotto venduto in cui all'interno ci sia arduin)?

In realtà una volta finito il progetto Arduino non ti serve più, visto che puoi usarlo solo come piattaforma di sperimentazione. Puoi prendere il chip e assemblarlo in stand-alone assieme alla circuiteria che hai progettato; l'EEprom è implementata nel chip, quindi quando si "esaurisce" devi sostituire il chip con uno nuovo, ma 100.000 cicli non sono uno scherzo! il buon Uwe ;) un giorno si è messo a fare un conteggio su base pratica, ma vai a trovare il Topic ora...

menniti: ma 100.000 cicli non sono uno scherzo! il buon Uwe ;) un giorno si è messo a fare un conteggio su base pratica, ma vai a trovare il Topic ora...

Il conteggio si fa in fretta, anche ipotizzando di esagerare e scrivere 100 volte al giorno sulla EEPROM la durata minima, quella massima può essere nettamente maggiore, è di 1000 giorni, cioè quasi 3 anni. La EEPROM si usa solo come risorsa di memorizzazione per salvare i dati prima dello spegnimento, non ha senso usarla come se fosse una RAM. Se devo solo consultare il valore, come nel caso del codice, si può fare benissimo leggendo direttamente la EEPROM, questa operazione non ha alcuna conseguenza sulla sua durata, però è molto più lenta rispetto alla lettura di una variabile in RAM. Ovviamente nel caso del codice per far scattare un relè non cambia nulla se ci metto un microsecondo per leggerlo dalla ram o qualche decina di microsecondi per leggerlo dalla EEPROM. Se è necessario cambiare spesso un valore che deve ritrovarmi ogni volta che accendo Arduino la cosa si risolve lavorando su una normale variabile in RAM per poi memorizzarla sulla EEPROM solo prima di spegnere.

Con 1 cambio ogni 10 secondi la EEPROM "salta" dopo circa 11,5 giorni. Per salvare dati con una certa frequenza puoi usare una FRAM http://it.wikipedia.org/wiki/FeRAM Anch'esse però non sono "eterne": permettono 10^6 cicli di riscrittura, ossia 1.000.000.

Alternativamente potresti prevedere di salvare il codice solo ogni tot, così da ottimizzare le scritture. Se ad esempio salvi il codice 1 volta ogni ora, la EEPROM interna dura 11,4 anni!

astrobeed: Se è necessario cambiare spesso un valore che deve ritrovarmi ogni volta che accendo Arduino la cosa si risolve lavorando su una normale variabile in RAM per poi memorizzarla sulla EEPROM solo prima di spegnere.

Sono curioso; come fa Arduino a saper che fra poco sará spento? Il codice modoficato si memorizza nel momento che l' inserimento del nuovo codice é completato e che é stato confermato che i 2 codici inseriti sono uguali.

leo72: Con 1 cambio ogni 10 secondi la EEPROM "salta" dopo circa 11,5 giorni. Per salvare dati con una certa frequenza puoi usare una FRAM http://it.wikipedia.org/wiki/FeRAM Anch'esse però non sono "eterne": permettono 10^6 cicli di riscrittura, ossia 1.000.000.

La Tua fonte wikipedia dice fino a 10^16. Il FRAM della Ramtron ( con interfaccia seriale I2C FM24C256-G, FM24C04A-G o interfaccia SPI FM25C160-G ) viene garantito per 10^10, 10^12 o 10^14 cicli a secondo il modello.

Per l'applicazione di antonio_cov basta anche una RAM con batteria. Ogni RTC ha qualche byte di RAM che puó essere usato per questo. Si ha anche un orologio.

Ciao Uwe

uwefed:
Sono curioso; come fa Arduino a saper che fra poco sará spento?
Il codice modoficato si memorizza nel momento che l’ inserimento del nuovo codice é completato e che é stato confermato che i 2 codici inseriti sono uguali.

La mia era una precisazione su come risolvere la questione nel caso in cui il valore da memorizzare varia troppo frequentemente per poterlo scrivere direttamente sulla EEPROM ogni volta che varia, nel caso in oggetto il problema non esiste.
Però se abbiamo la reale necessità di memorizzare in modo permanente un valore che cambia spesso la soluzione è quella che ho indicato, cioè il valore si trova in RAM, magari si memorizza per sicurezza sulla EEPROM in modo periodico, p.e. una volta ogni ora (durata EEPROM > 10 anni) e ogni volta che si spegne Arduino.
Come fare per automatizzare la memorizzazione allo spegnimento ?
Ci sono varie possibilità, dipende molto dall’hardware che stiamo usando, se è Arduino standard non ci sono molte “scappatoie”, il modo più semplice è prevedere un pulsante che avvia una funzione per lo shut down che provvede a memorizzare i valore/i sulla EEPROM e mette in pausa il software, al successivo reset/accensione il programma ricarica l’ultimo valore/i memorizzati e riparte con quelli.
Se stiamo lavorando con una scheda Arduino stand alone diventa facile gestire in modo totalmente automatico il tutto, basta disaccoppiare l’alimentazione del micro dal resto del circuito, basta un diodo, mettere un condensatore da 200-300 uF (valore da verificare) in parallelo al pin Vdd del micro e monitorare con l’ADC, tramite un partitore resistivo se necessario, la tensione di alimentazione in ingresso.
Quando manca l’alimentazione, abbiamo spento l’interruttore, la tensione sull’ADC crolla a 0 però il micro è ancora alimentato dal condensatore che abbiamo dimensionato in modo da garantire qualche decimo di secondo di autonomia, al verificarsi di questo evento si invoca una funzione che salva i dati in EEPROM e termina il programma.
Volendo si può usare un normale pin digitale per monitorare la presenza tensione in ingresso, tensione presente = 1 logico, tensione assente = 0 logico, meglio ancora se è uno di interrupt esterno così si gestisce il tutto in una manciata di microsecondi.

@Uwe: già, la Wiki diceva solo 10^6. Aggiornerò quella scheda, probabilmente si riferisce a dati un po' vecchi e le ultime FRAM sono state ottimizzate anche in questo senso.

@Astrobeed: chiedo a te, che sei del ramo, se tale condensatore può bastare. La scrittura sulla EEPROM richiede mi pare sui 3 ms e necessita, oltrettutto (da datasheet) di una tensione minima, altrimenti l'operazione può non andare a buon fine. Riesce un tale condensatore a fornire la sufficiente tensione per il tempo richiesto?

EDIT: @Uew: la scheda sulla Wiki riporta 10^16... allora sono veramente rinco... mi pareva proprio di aver letto 10^6 :*

Grazie a tutti per le risposte, questo forum è molto interessante!

In realtà una volta finito il progetto Arduino non ti serve più, visto che puoi usarlo solo come piattaforma di sperimentazione. Puoi prendere il chip e assemblarlo in stand-alone assieme alla circuiteria che hai progettato; l'EEprom è implementata nel chip, quindi quando si "esaurisce" devi sostituire il chip con uno nuovo, ma 100.000 cicli non sono uno scherzo!

Scusami, basta solo l'ATMEGA328? E come lo collego con gli ingressi/uscite digitali/analogici? Grazie ancora...

leo72: @Astrobeed: chiedo a te, che sei del ramo, se tale condensatore può bastare. La scrittura sulla EEPROM richiede mi pare sui 3 ms e necessita, oltrettutto (da datasheet) di una tensione minima, altrimenti l'operazione può non andare a buon fine. Riesce un tale condensatore a fornire la sufficiente tensione per il tempo richiesto?

Beh in questo caso la costante di tempo di scarica del condensatore deve essere di almeno 10 ms per avere l'effetto desiderato. Poi però c'è da tenere in conto anche della frequenza. Infatti se il condensatore funzionerà da passa basso sarà un corto alle basse frequenze e un aperto alle alte e se invece sarà un passa alto il contrario.

antonio_cov: Grazie a tutti per le risposte, questo forum è molto interessante!

In realtà una volta finito il progetto Arduino non ti serve più, visto che puoi usarlo solo come piattaforma di sperimentazione. Puoi prendere il chip e assemblarlo in stand-alone assieme alla circuiteria che hai progettato; l'EEprom è implementata nel chip, quindi quando si "esaurisce" devi sostituire il chip con uno nuovo, ma 100.000 cicli non sono uno scherzo!

Scusami, basta solo l'ATMEGA328? E come lo collego con gli ingressi/uscite digitali/analogici? Grazie ancora...

Beh, se devi realizzare un circuito tuo non devi fare altro che prevedere anche il chip ATmega; se guardi lo schema elettrico di Arduino puoi notare che praticamente tutti i pin dei connettori sono collegati direttamente ai pin del micro, quindi…. Se vuoi lavorare a 16MHz devi mettere solo il quarzo e due C da 22pF verso massa, più una R da 10K tra il reset e +5V; se ti accontenti di frequenze inferiori (max 8MHz) usci l’oscillatore interno del chip ed eviti anche questi componenti (escluso la R che togli perché la tolgono anche i progettisti, ma non c’entra nulla con l’oscillatore

leo72: @Astrobeed: chiedo a te, che sei del ramo, se tale condensatore può bastare. La scrittura sulla EEPROM richiede mi pare sui 3 ms e necessita, oltrettutto (da datasheet) di una tensione minima, altrimenti l'operazione può non andare a buon fine. Riesce un tale condensatore a fornire la sufficiente tensione per il tempo richiesto?

Certo che basta, è un sistema normalmente usato in tutte le applicazioni dove è necessario salvare su memoria non volatile dei dati prima dello spegnimento, oppure come backup d'emergenza in caso di caduta della tensione di rete. Ovviamente tocca dimensionare il circuito di alimentazione d'emergenza in modo opportuno e prendere i dovuti provvedimenti software, disattivare tutte le uscite, ridurre il consumo etc, quando si verifica l'evento. Con i 300-400uF che ho indicato si ottengono circa 20-25 ms di autonomia prima che la tensione da 5V cali sotto i 4.5V, limite sotto il quale si fa intervenire il BOD, se attivato da fuse, per bloccare in reset il micro e prevenire riavvi non voluti. In alcuni casi, p.e. micro con consumi elevati, si usano i supercondesatori, hanno valori altissimi, tipo 1F, con dimensioni simili a quelle di una batteria al litio, che possono garantire anche qualche secondo di autonomia in modo da poter fare il backup dei dati su una SD, o una EEPROM esterna ad alta capacità, se sono tanti, ma non è il caso di Arduino.

Il BOD di default sull'Atmega dell'Arduino è impostato a 2,7V, così mi dice il datasheet pagina 318 con i valori dei bit estrapolati mediante Fuse Calc usando quelli del file boards.txt.

Cmq il BOD può essere impostato anche a tensioni differenti ma mi pare che la EEPROM, sotto ad una data tensione (non mi ricordo quale, ma visto che il BOD è impostato a 2,7V penso che possa essere poco sotto a quel valore) "smadonni". Quindi con il condensatore da te suggerito si può fare.

Interessante, molto interessante. Così basta solo leggere la caduta di tensione, ed avviare la procedura di emergenza salvando sulla EEPROM e poi attendere la morte cerebrale del micro :stuck_out_tongue_closed_eyes:

Ciao,

vi sono anche le EEPROM esterne, tipo 24LC256, che hanno 1 000 000 di cicli di scrittura/cancellazione.

Le FRAM in effetti sono molto interessanti, anche se piu' care. Hanno una velocita' d'accesso e di scrittura molto maggiore rispetto alle EEPROM ed un minor consumo d'energia. Le ho utilizzate in un progetto in cui dovevo memorizzare dei dati con frequenza (un piccolo datalogger). Assicurano fra 10^10 e 10^16 cicli a seconda dei modelli.

Fra la'altro Texas Instruments ha lanciato un microcontrollore della serie MSP430 con la memoria FRAM interna (MSP430FR57xx FRAM)... peccato che non via un corrispondente ATmega.

Ciao Marco Come velocitá di lettura dovrebbero essere gli EEprom e i Fram uguali. Nella scrittura ci sono galassie in mezzo. Il vantaggio dei Fram é anche che esitono modelli con interfaccia seriali sia I2C che SPI. Memoria SRAm non esitono seriali. Sí, sarebbe bello avere gli ATmega con memoria Fram, ma penso che sia un problema di brevetto e di costi. Ciao Uwe

uwefed: Memoria SRAm non esitono seriali.

Esistono, p.e. la 23A256 di Microchip, SRAM da 256 kbits (32 K Bytes) con bus spi fino a 16 MHz, perfette per memorizzare molti dati con accesso rapido e senza limitazioni sul numero di scritture. Un esempio d'uso è un datalogger che deve accumulare molti più dati di quanti permesso dalla ram della MCU per poi elaborarli e trasferire il risultato su una SD o direttamente ad un computer. Rammento che è possibile mettere più dispositivi SPI in parallelo attivandoli uno per volta tramite il relativo CS.

Avevo cercato dei SRAM seriali ma non ne avevo trovati. Grazie astrobeed. Resta comunque il vantaggio dei FRAM rispetto ai SRAM che mantengono il contenuto. Ciao Uwe