Hola!
Nos estás haciendo currar, eh Pocher...
Se me ocurre lo siguiente, a ver qué te parece:
Utilizas la entrada RB0/INT del micro para detectar la caída de alimentación y tratarla como una interrupción.
Por hardware, haces que esta pata del PIC explore la alimentación principal (no la de la batería), pero te las apañas para que al micro le llegue por lógica negativa; es decir, si hay alimentación, la entrada de RB0 estará a 0; si no hay alimentación, RB0 tendrá un 1.
**Declaras una variable contador para que acumule la posición por la que se encuentra la ejecución del programa.
**Declaras una variable "estado" para que te indique si hay o no alimentación.
En el bucle principal:
**CArgas en la variable estado el valor 1, por ejemplo, que indica que hay alimentación
** Declaras gestión de interrupción externa por flanco positivo.
** Reseteas los flag de las interrupciones
** Defines la máscara del registro de interrupciones, para que pille sólo la RB0.
** Habilitas las interrupciones
** Bla BLa Bla... tu programa..... lo que sea..
** no te olvides de ir incrementando el contador...
** y bla bla ....
ETIQUETA DEL SERVICIO DE INTERRUPCION!!!
** Miras la variable estado... si es 1, había alimentación y se ha cortado, debes mandarlo a dormir.... pero antes!!:
**se ha detectado una caída de tensión, por lo que entra un flanco positivo en la pata RB0.
** Limpiar los flag del registro de interrupciones
** Declarar gestión de interrupcion externa por flanco negativo
** Defines la máscara del registro de interrupciones, para que pille sólo la RB0.
** Habilitas las interrupciones, otra vez
** y Le mandamos al micro a DORMIR!
Estará dormidito hasta que llegue un cero a la pata RB0, es decir, se produzca interrupción porque se reanude la alimentación, y entonces
** Guardas en la variable estado el valor 0, por ejemplo, se ha reanudado la alimentación.
**Devuelves el control al bucle principal, y dependiendo de la variable contador te iré a un sitio o a otro...
Bueno... no se si es un jaleo enorme.. pero la idea es gestionar interrupción externa en el RB0...
Ufff..... cuéntanos anda,
Saludos!
Elena