Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC 16F877: Riprendere un programma in caso di interruzione dell'alimentazione

Ho fatto un programmino in C per la gestione di una lavatrice, per 
funzionare funziona, ma stavo cercando il pelo nell'uovo e sto tentando di 
scrivere una funzione che, in caso di blackout, mi riprenda il programma dal 
punto che era rimasto.
Avevo pensato di salvare in eeprom i valori dei registri PCL, PCLATH, STATUS 
oltre ai vari OPTION_REG, INTCON, ADCON ecc. ecc. e variabili in uso in quel 
determinato punto del programma, così come lo stato delle porte in uscita.
Qualcosa tipo:
(sono le macro del compilatore HT-PICC)
{
EEPROM_WRITE(0x00,PCL);
EEPROM_WRITE(0x01,PCLATH);
EEPROM_WRITE(0x02,STATUS);
EEPROM_WRITE(0X04,i);
}
per memorizzare e tenere aggiornati i valori registri/variabili nella 
eeprom, man mano che il programma avanza, e, in caso di ripresa dopo un 
blackout ripristinare i registri/variabili andandoli a leggere dalla eeprom. 
Ho provato ma non funziona niente, cioè il programma riprende da dove vuole 
lui.
Il problema non è scrivere o leggere dalla eeprom ma quali registri salvare, 
e non so nemmeno se è possibile farlo.
Anche perchè i dati che memorizza dal program counter sono quelli che in 
quel momento sta usando per la funzione di memorizzazione dei dati, perciò 
quando li ripristino il povero 877 va nel pallone totale.
Potrei risolvere con una batteria tampone e un interrupt che monitorizza una 
porta e mi mette il programma in pausa, ma preferirei farlo senza andare a 
rimaneggiare l'hardware che ho messo insieme con tanta fatica...
Grazie in anticipo per un vostro aiuto e scusate per la lunghezza del post.
PS: Ho già cercato e ricercato con Google ma non mi è stato di nessun aiuto.
Ciao
Alex 

 eeprom, man mano che il programma avanza
Inoltre considera che la flash interna di un microcontrollore è
caratterizzata da un numero di cicli di scrittura molto basso (e molto
variabile da CPU a CPU, diciamo da 100 a 10000). Se devi salvare lo stato
molto spesso è decisamente meglio utilizzare una flash esterna, o in casi
estremi addirittura una FRAM.
Se proprio devi usare la flash interna, io farei i conti molto bene prima
di arrischiarmi.
-- 
emboliaschizoide.splinder.com

 secondari. In questo modo dovrai salvare lo stato solo sporadicamente.
sei anche qui ? lo facciamo embedded il nostro tool per le
altimetrie ? :-D
Riguardo alla lavatrice, la soluzione "pulita" (che io sappia) per
questo problema è il Brown Out Detector, un sistema che fa il
monitoraggio della tensione di alimentazione e quando si abbassa sotto
una certa soglia fa scattare un interrupt che salva in flash i dati
necessari *solo* quando manca l'alimentazione. Una "batteria tampone"
- anche solo un grosso condensatore dovrebbe bastare - manterrebbe il
micro alimentato per quel poco tempo necessario. Alcuni micro hanno
integrato questo sistema.
Mi pare di capire che non si vuole modificare l'hardware, in ogni caso
vedi qui:
http://www.scienceprog.com/microcontroller-brown-out-detection/
In questo articolo si usa per resettare il micro, nel caso nostro si
userebbe per l'interrupt.
La soluzione di salvare lo stato della macchina (registri e simili)
dubito che possa essere concretamente realizzabile.
bikerfab
bikerfab.altervista.org

 dubito che possa essere concretamente realizzabile.
Probabilmente ha senso per sistemi molto più complessi (vedi la funzione di
"ibernazione" di Windows, che ha alcuni omologhi anche in campo embedded),
ma in questi casi di solito si tratta sempre di operazioni che richiedono
un tempo eccessivo per poterlo fare al volo.
-- 
emboliaschizoide.splinder.com

Ok vi ringrazio per le dritte,
comunque la data eeprom del pic 16f877 dovrebbe sopportare fino a 1.000.000 
cicli di scrittura, almeno questo è quello che dice il datasheet, non 
dovrebbero esserci problemi per una ventina di aggiornamenti totali ogni 
volta che faccio partire il programma.
Saluti,
Alex 

 cicli di scrittura, almeno questo è quello che dice il datasheet
Ah, ho visto, hai ragione (anche se è meglio considerare il valore minimo
garantito, che è 100k cicli). Non sapevo che nei PIC si usasse una EEPROM
separata per i dati!
-- 
emboliaschizoide.splinder.com