Autor Tema: Uso de función "restart_cause()". Dudas. (RESUELTO)  (Leído 2521 veces)

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

Desconectado yopicuo

  • PIC10
  • *
  • Mensajes: 8
Uso de función "restart_cause()". Dudas. (RESUELTO)
« en: 05 de Abril de 2010, 09:13:42 »
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...

Código: [Seleccionar]
#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.
« Última modificación: 06 de Abril de 2010, 05:28:49 por yopicuo »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Uso de función "restart_cause()". Dudas.
« Respuesta #1 en: 05 de Abril de 2010, 09:20:59 »
Una causa puede ser el simulador, pruebalo con hardware real para salir de dudas :?



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado yopicuo

  • PIC10
  • *
  • Mensajes: 8
Re: Uso de función "restart_cause()". Dudas.
« Respuesta #2 en: 05 de Abril de 2010, 11:06:33 »
Una causa puede ser el simulador, pruebalo con hardware real para salir de dudas :?

Saludos!


El asunto es que aun no me han llegado los micros ni la entrenadora :( .. y mientras, estoy aprendiendo a trabajar con el proteus.

Respecto al código quería saber si me falta alguna línea específica o algún parámetro de configuración del micro.



Un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Uso de función "restart_cause()". Dudas.
« Respuesta #3 en: 05 de Abril de 2010, 11:53:31 »
Entes que nada configura los pines como I/O digitales, puede ser ese detalle.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado yopicuo

  • PIC10
  • *
  • Mensajes: 8
Re: Uso de función "restart_cause()". Dudas. (RESUELTO)
« Respuesta #4 en: 06 de Abril de 2010, 05:37:58 »
bueno.. he dado con la posible causa del problema y he aprendido algo nuevo sobre el sleep()... Yo pensaba que el sleep era una "parada" directa del sistema, y siempre que despierta lo hace como si fuese un reset del micro. PERO NO!! Realmente es como una función de espera (o por lo menos eso creo yo), como si fuese un delay_ms() pero de tiempo indefinido (hasta que ocurra una iterrupción o un reset, etc). Como función simplemente una vez despierta salta a la siguiente línea de programa -- No reinicia --, entonces al tenerlo dentro del bucle While, cuando el micro "despierta" vuelve a ejecutar las lineas dentro del bucle y por ello no se modifica el restart_cause().

SOLUCIÓN: Quitar el While y va como la seda..

Suky, gracias por la ayuda.

Un saludo y hasta la proxima.. que no voy a tardar mucho..  :mrgreen:


 

anything