Hola, estoy empezando a hacer mis primeros montajes con los pic y ahora mismo me he puesto a "cacharrear" con el watchdog. He hecho una rutina muy simple de encidido de leds, y básicamente lo que pretendo es que en función del motivo que haya llevado al pic a resetearse, ejecute una acción u otra. Estoy probando principalmente la interrupción por desborde del watchdog y el problema es que cuando resetea, no se modifica el valor del restart_cause() y salta a ejecutar las líneas principales del programa principal.. os pego el código y así lo explico mejor...
#include <18F2550.h>
#fuses hspll,mclr,noprotect,nolvp,nodebug,pll5,cpudiv1,novregen,nopbaden
#fuses WDT // Inicialmente activamos el WathcDog
#fuses WDT4096 // Fijamos el tiempo de desbordamiento.
#use delay(clock=48000000) // clock de trabajo del pic a 48Mhz
//Definición de LEDS
#define LED1_ON (OUTPUT_HIGH(PIN_B1)) //Definición de encendido LEDn
#define LED1_OFF (OUTPUT_LOW(PIN_B1)) //Definición de apagado LEDn
#define LED2_ON (OUTPUT_HIGH(PIN_B2))
#define LED2_OFF (OUTPUT_LOW(PIN_B2))
#define LED3_ON (OUTPUT_HIGH(PIN_B3))
#define LED3_OFF (OUTPUT_LOW(PIN_B3))
#define LED4_ON (OUTPUT_HIGH(PIN_B4))
#define LED4_OFF (OUTPUT_LOW(PIN_B4))
// Cuerpo de programa principal.
void main(){
int8 i;
int1 a;
// ACCIONES A REALIZAR TRÁS RESET.
switch ( restart_cause() )
{
case WDT_TIMEOUT:
{
restart_wdt();
for (i=1;i<=10;i++){
LED1_ON; delay_ms(250);
LED1_OFF; delay_ms(250);
}
LED2_OFF;
break;
}
case MCLR_FROM_SLEEP:
restart_wdt();
LED1_OFF; LED2_OFF;LED3_OFF;LED4_OFF;
for (i=1;i<=10;i++){
LED1_ON; delay_ms(200);
LED2_ON; delay_ms(200);
LED3_ON; delay_ms(200);
LED4_ON; delay_ms(200);
LED1_OFF; delay_ms(200);
LED2_OFF; delay_ms(200);
LED3_OFF; delay_ms(200);
LED4_OFF; delay_ms(200);
}
LED2_OFF;
break;
case WDT_FROM_SLEEP:
{
restart_wdt();
for (i=1;i<=10;i++){
LED4_ON; delay_ms(250);
LED4_OFF; delay_ms(250);
LED3_ON; delay_ms(250);
LED3_OFF; delay_ms(250);
}
LED2_OFF;
break;
}
case NORMAL_POWER_UP:
{
restart_wdt();
LED1_ON; LED2_OFF;
break;
}
}
// Líneas: APLICACIÓN PRINCIPAL.
set_tris_a(255); // configurando portA y portB como entradas.
set_tris_b(255);
setup_wdt(WDT_ON);
while(true)
{
LED1_on;
restart_wdt();
a=0;
for (i=1;i<=10;i++){
if (a==0){
LED4_ON;
a=1;
delay_ms(500);
}
else{
LED4_OFF;
a=0;
delay_ms(500);
}
}
LED2_ON; LED1_OFF; LED4_OFF;
SLEEP();
}
}
Al ejecutar el programa, este realiza inicialmente el parpadeo del LED4, y a continuación situa al pic en modo sleep. En el momento que se desborda el timer del WDT el micro se resetea y debería actualizar el restart_cause(), de modo que en función de el motivo del reseteo realice una acción u otras.. Pero en la simulación (con proteus) se salta el case... Alguna idea de por qué puede estar fallando??
Recibid un cordial saludo y gracias por la ayuda prestada.