Hola automata, la respuesta de Azicuetano es correcta, sin embargo hace tiempo que vengo detectando problemas con la función restart_cause(), a veces indica causas que no son correctas, no ocurre siempre, se necesita una sucesion de factores y reinicios determinados para que la funcion indique mal la causa del reinicio. Nunca he tenido tiempo de ponerme a depurar un poquito la cuestión a ver como opera en asm esta función. Como no tenia tiempo de investigar cuando note el inconveniente, diseñe una función sencillita que te permite detectar la causa del reinicio, pero como en mi diseño el PIC nunca dormia, solo detecta las combinaciones de reinicio para el PIC despierto. Aqui te la dejo, ahi puedes ver inclusive los bits que necesitas para detectar el estado.
//____________________________________________________________________________________________________________________________________________
// FUNCION QUE DEVUELVE LA CAUSA DEL ULTIMO REINICIO DEL PIC.
int Causa_reinicio()
{
// Los bits que permiten conocer la causa del reinicio son:
// TO, Time-out (bit 4, registro STATUS).
// BOR, Brownout reset(bit 0, registro PCON).
// POR, Power-on reset (bit 1, registro PCON).
//
// La función devuelve los siguientes valores:
// 0 = Encendido normal (TO=1, POR=0, BOR=0)o bien (TO=1, POR=0, BOR=1).
// 1 = Reinicio ocasionado por el Watchdog (TO=0, POR=x, BOR=x).
// 2 = Reinicio producido mediante el MCLR (TO=1, POR=1, BOR=1).
// 3 = Reinicio ocasionado por el Brownout (TO=1, POR=1, BOR=0).
int Resultado;
if (ChkPnt_General==0){ // La función solo se ejecuta si el Checkpoint tiene el valor correcto.
if (bit_test(Reg_STATUS,4)){
if ((!bit_test(Reg_PCON,0))&&(!bit_test(Reg_PCON,1))){Resultado = 0;}
if (bit_test(Reg_PCON,0)&&(!bit_test(Reg_PCON,1))){Resultado = 0;}
if ((!bit_test(Reg_PCON,0))&&bit_test(Reg_PCON,1)){Resultado = 3;}
if (bit_test(Reg_PCON,0)&&bit_test(Reg_PCON,1)){Resultado = 2;}
}
else {Resultado = 1;}
bit_set(Reg_PCON,0); // Vuelve a colocar los bits del registro PCON en 1, _
bit_set(Reg_PCON,1); //_para poder detectar las causas del siguiente reinicio.
return(Resultado);
}
}
Obviamente el código esta en CCS, pero puede hacerse en assembler u otro lenguaje tranquilamente porque no es mas que una serie de lectura de bits. Luego nos cuentas.
Nos escribimos.