memorizzazione variabile prima dello spegnimento

Sezione dedicata al sistema di sviluppo BASCOM-AVR per i micro AVR
At90s, Attiny, Atmega e Xmega

memorizzazione variabile prima dello spegnimento

Postby mario59 » 05 Jun 2014, 08:48

Salve a tutti! ;)
ho un quesito.
Un programma di collaudo, deve effettuare dei cicli di test su un relè. circa 150000.
Il test è un semplice go no-go, eccitazione bobina-verifica del contatto chiuso.
diseccitazione - verifica apertura contatto.
Niente di eccezionale.
Ora, essendo questo test molto lungo, vorrei che succedesse questo:
Se durante il test viene a mancare la corrente, il micro dovrebbe "salvare" la variabile indice I in qualche locazione di memoria non volatile.
Ovviamente il micro dovrebbe salvare la variabile nell'istante in cui viene a mancare l'alimentazione... :o
So che è una contraddizione in termini, ma dovrebbe fare proprio così...
...e non ho idea di come fare questa cosa... :( :( :(
Al ritorno dell'alimentazione, il micro dovrebbe "sapere" che "prima" stava "lavorando" e ha avuto una interruzione del ciclo e continuare il test contando da I+1.
Se si dovessero "perdere" 1-2 conteggi non fa nulla.. :?
Invece, se "prima" della interruzione di alimentazione aveva finito i cicli di test, oppure non aveva neanche cominciato, allo START, l'indice I deve cominciare da 1.
So che c'è la possibilità di dichiarare una variabile nell'area flash non volatile, però essendo il numero dei cicli oltre i 100000, non vorrei che alla fine la cella riservata alla variabile, non funzioni più vanificando tutto.
Devo aver letto da qualche parte, infatti, che la flash è garantita per 100000 cicli.
ma dopo...? :roll: :?:
Mario59
User avatar
mario59
 
Posts: 43
Joined: 27 Mar 2013, 17:33
Location: Napoli

Re: memorizzazione variabile prima dello spegnimento

Postby pier » 05 Jun 2014, 13:09

Tempo fa ho dovuto affrontare un problema simile. Ho risolto con un diodo ed un bel elettrolitico sull'alimentazione del micro mentre un pin dello stesso legge la presenza dell'alimentazione prima del diodo (con resistenza di chiusura a gnd e diodo di sicurezza per compensare la tensione superiore del pin rispetto a VCC).
Quando l'alimentazione viene a mancare il pin ne sente il calo mentre il micro resta alimentato (dall'elettrolitico) per un tempo sufficiente a scrivere in eeprom.
Avevo anche fatto in modo che a fine scrittura un transistor scaricava l'elettrolitico rapidamente per garantire un rapido ripristino in caso di assenze molto brevi di alimentazione (spike) sfruttando il reset dal brownout.
All'inizio il programma testava la variabile in eeprom e ne teneva debito conto.
Per la scrittura/lettura in eeprom vedi ERAM o READEEPROM dal manuale Bascom mentre per la durata della eeprom credo nessun problema in quanto la vita è di circa 100000 cicli write/erase e se questo avviene solo incidentalmente...
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05

Re: memorizzazione variabile prima dello spegnimento

Postby mario59 » 05 Jun 2014, 14:24

ciao Pier, grazie !!!
In verità il micro della mia applicazione ha quasi tutti gli I/O impegnati, e non ho riserve.
E questa cosa generalmente mi mette a disagio, in caso di dimenticanza/imprevisti/espansioni! :(
Però è sicuramente una buona idea.
Volevo chiederti qualcosa sulle due istruzioni che mi hai fornito, quelle cioè READEPROM e ERAM.
Se tu hai già esperienza, come le hai utilizzate?
Al reset del micro, come distinguo che vengo da un reset perchè ho premuto il tasto/accendo la macchina per la prima volta, oppure da un reset dovuto alla mancanza di corrente?
Mi sfugge un pò questo lato del problema. :roll:
Grazie
Mario
Mario59
User avatar
mario59
 
Posts: 43
Joined: 27 Mar 2013, 17:33
Location: Napoli

Re: memorizzazione variabile prima dello spegnimento

Postby pier » 05 Jun 2014, 21:22

Per la verità il lavoro lo avevo fatto con l'8051 e quindi usando i comandi Writeeeprom/Readeeprom.
dal manuale Bascom:
Readeeprom Reads the content from the DATA EEPROM and stores it into a variable.
Syntax
READEEPROM var , address
Remarks
Var
The name of the variable that must be stored; Address The address in the EEPROM where the data must be read from.
This statement is provided for backwards compatibility with BASCOM-8051.
You can also use the ERAM variable instead of READEEPROM :
Dim V as Eram Byte 'store in EEPROM
Dim B As Byte 'normal variable
B = 10
V = B 'store variable in EEPROM
B = V 'read from EEPROM
When you use the assignment version, the data types must be equal!
According to a data sheet from ATMEL, the first location in the EEPROM with address 0, can be overwritten during a reset so don't use it.

Se usi Eram devi usare AT per specificare l'indirizzo (dalla Guida all' IDE di Bascom-AVR di Giovanni De Luca) ma non ho approfondito.

Poi per risolvere il problema di capire da quale reset arrivi (posto che serva) puoi scrivere anche un bit in eeprom che te lo dica mentre per i pin non so se puoi provare a codificare qualche input ma la vedo un po' macchinosa e lo farei (se possibile) solo se veramente necessario.
Un'avvertenza utile: il brownout ti conviene gestirlo senz'altro in quanto evita la corruzione dei dati in eeprom durante le transizioni di alimentazione.
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05

Re: memorizzazione variabile prima dello spegnimento

Postby pier » 06 Jun 2014, 09:22

Tieni presente che il sistema proposto sfrutta la differenza di tempo di caduta dell'alimentazione generale rispetto a quella del micro; è quindi fondamentale assicurare una caduta più veloce di quella generale rispetto a quella del micro magari inserendo un sistema di sgancio a monte del regolatore, che immagino esista, che stacchi indicativamente quando la tensione di ingresso scende sotto i 4,5 + il dropout del regolatore e riattacchi sopra i 5,5 + lo stesso dropout.
Io dovevo sentire l'apertura dello switch di alimentazione a valle del regolatore e la cosa funzionava bene.
Un filtrino RC sul pin che sente la caduta dell'alimentazione può evitare interventi inutili della procedura in occasione di brevi disturbi di alimentazione (la R potrebbe anche sostituire il diodo di caduta necessaria) mentre un eventuale partitore potrebbe rendere più "predittivo" il sistema anticipando il riconoscimento dell'evento.
Inoltre conviene gestire l'evento con un interrupt per questioni di velocità (ma dipende da quello che fai nel loop generale).
Ovviamente per il recupero di pin è possibile valutare anche una eventuale decodifica degli output e, in aggiunta, in sostituzione del transistor (e del relativo pin di comando) di scarico dell'elettrolitico che ha la funzione di assicurare un reset per garantire la lettura del dato in eeprom (il cui valore dipende da quanta corrente assorbi con il micro e che deve mantenere l'alimentazione per circa 10-20 msec), potresti forse inserire una istruzione che rimanda all'avvio del programma con azzeramento di tutte le variabili dopo la scrittura sulla eeprom ma bisogna farci una pensata per esserne sicuri.
Buon lavoro
pier
 
Posts: 115
Joined: 11 Aug 2013, 22:05


Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 19 guests

cron