Autor Tema: Como detecto que se reinició por causa del WDT ?  (Leído 2978 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Automata78

  • PIC12
  • **
  • Mensajes: 61
Como detecto que se reinició por causa del WDT ?
« en: 13 de Mayo de 2008, 00:00:54 »
   Hola a todos !... antes que nada estuve leyendo todo lo que pude sobre el tema del wdt.  Lo unico que no me termina de cerrar es como puedo determinar la causa por la que se produjo un reseteo, ya sea por falta de energía o por desbordamiento del WDT en modo normal de funcionamiento ( despierto ).
   Estoy utilizado el WDT y Sleep, pero por algun momento se produce un reset que debe ser debido al desbordamiento del wdt.
   Me gustaría saber cuales son los estados concretos de los bit de los registros STATUS y/o PCON ?

   Espero alguna zoga !.... muchas gracias x ayudarme bye bye

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Como detecto que se reinició por causa del WDT ?
« Respuesta #1 en: 13 de Mayo de 2008, 03:19:13 »
Podrías utilizatr algo así para saber cual es la causa del reset  :mrgreen::

Código: [Seleccionar]
switch(restart_cause())
{

case WDT_FROM_SLEEP:

case WDT_TIMEOUT:

case MCLR_FROM_SLEEP:

case MCLR_FROM_RUN:

case NORMAL_POWER_UP:

case BROWNOUT_RESTART:

}

Un saludo desde Alicante.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Como detecto que se reinició por causa del WDT ?
« Respuesta #2 en: 13 de Mayo de 2008, 06:34:55 »
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.

Código: [Seleccionar]
//____________________________________________________________________________________________________________________________________________
// 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.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Como detecto que se reinició por causa del WDT ?
« Respuesta #3 en: 13 de Mayo de 2008, 10:59:13 »
hace tiempo que vengo detectando problemas con la función restart_cause(), a veces indica causas que no son correctas

Interesante dato... interesante...

Habrá que tenerlo en cuenta de ahora en adelante  :mrgreen:


Un saludo desde Alicante.

Desconectado Automata78

  • PIC12
  • **
  • Mensajes: 61
Re: Como detecto que se reinició por causa del WDT ?
« Respuesta #4 en: 16 de Mayo de 2008, 15:08:26 »
Muchas gracias !!!! .... no habria poderlo ver nunca de esa mandera, por descarte se encuentra que el reinicio lo produjo el WDT !!!
   Muchas gracias Gonzalo y Azicuetano por responderme tan rapidamente !!
   Saludos !!!!!!  :lol:


 

anything