Autor Tema: Problemilla con el Watch Dog Timer  (Leído 2709 veces)

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

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Problemilla con el Watch Dog Timer
« en: 16 de Junio de 2008, 09:33:27 »
Hola,

Trato de añadirle a un proyecto con un 18LF2550 un perro guardian.

Necesitaria que el perro saltase cada 2 segundos aproximadamente.

He mirado la configuracion, y por mucho que mas la miro no encuentro donde me equivoco, el caso es que como configuracion hago lo siguiente:

añado el: #FUSES   WDT128

y luego en mi programa principal, al iniciar el main:

setup_wdt(WDT_ON);
restart_WDT();

Tengo una interrupcion por el Timer0 cada 1024ms que funciona correctamente, la he testeado, y en ella hago un restart_WDT();

Utilizo un reloj a 48MHz, y segun he visto en la configuracion, al poner el WDT128 el watchdog deberia de saltar cada 2304ms, pero el pic se me resetea continuamente, es como si no llegara ni siquiera a 1 segundo.

¿alguna idea?
__El conocimiento humano pertenece al mundo__

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problemilla con el Watch Dog Timer
« Respuesta #1 en: 16 de Junio de 2008, 09:58:28 »
Sería muy interesante que pusieras el código.

Yo no te recomendaría que refrescaras el WDT en la interrupción.

Puedes leer cosas muy interesantes aquí:

http://www.todopic.com.ar/foros/index.php?topic=18647.msg130137#msg130137

Seguro que no le da tiempo a refrescarse por primera vez y por eso se te resetea continuamente.


Un saludo desde Alicante.

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Re: Problemilla con el Watch Dog Timer
« Respuesta #2 en: 16 de Junio de 2008, 11:01:24 »

Por ejemplo este trozo de codigo, en teoria el WDT al estar a 128 deberia desbordar cada 2304 ms, y la interrupcion del Timer0 cada 1400 ms. Luego la ejecucion que espero, es recibir por el rs232 la cadena "int" cada 1,4 segundos.

Pues bien, no se porque pero el PIC se resetea y recibo continuamente la cadena "Hola" y en algunas ocasiones tras la cadena "Hola" recibo la cadena "int", pero solo una vez.

Es como si el watchdog desbordara antes de tiempo.


Código: [Seleccionar]

#include <18F2550.h>

#FUSES   WDT
#FUSES   WDT128

#fuses   HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use     delay(clock=48000000,RESTART_WDT)

#include <stdio.h>
#include <string.h>

//________________________________________________________________________________________________

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, stream = Canal_WC,TIMEOUT=1000)
#use rs232(baud=38400,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8, ERRORS, stream = Canal_PC,TIMEOUT=1000)   

#define  Enciende          Output_High
#define  Apaga             Output_Low
#define  Conmuta           Output_Toggle

#define  ledSistEnchufado  PIN_A0
#define  ledWC             PIN_A1
#define  ledNaranja        PIN_C0
#define  ledRojo           PIN_C1
#define  resetWC           PIN_B5

#define  MAX_BUFFER         120
#define _TIMEOUT        60000


void inicializarPIC(void);



//================ Interrupción del temporizador Timer 0 =========================================================================================
/*
Puesto que el reloj es 48MHz, el preescaler es 256 y el timer1 es de 16 bits (16bits = 65536 cuentas)
El timer desbordará cada:

     1
 --------- · 4 · 256 · 65536 = 1,4 segundos (aprox) en realidad es cada: 1,398101333... segundos
  48·10^6

con el post a 16 desbordaria cada 0,0873 seg = 87,38 ms
*/

#int_TIMER0
void  TIMER0_isr(void) {

      restart_wdt();
      fprintf(Canal_PC,"interrupcion");

}


void inicializarPIC(void){

   Apaga(resetWC);
   Apaga(ledWC);
   Apaga(ledSistEnchufado);
   Apaga(ledNaranja);
   Apaga(ledRojo);

   ext_int_edge(0, H_TO_L);      //Configuro las interrupciones externas para que se disparen cuando se produzca un cambio de alto a bajo
   ext_int_edge(2, H_TO_L);      //para utilizarlas como lineas rs232

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);


   enable_interrupts(INT_TIMER0);   //Interrupcion por Timer
   enable_interrupts(int_ext);      //Interrupcion del PC
     
}



void main(){

   restart_wdt();
   inicializarPIC();

   restart_wdt();
   fprintf(Canal_PC,"\r\n Hola\n");

   enable_interrupts(global);   

   restart_wdt();
   while(TRUE){
   }
}

__El conocimiento humano pertenece al mundo__

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemilla con el Watch Dog Timer
« Respuesta #3 en: 17 de Junio de 2008, 22:35:09 »
Hola jnavarro.

Si colocas #FUSE WDT128 estas definiendo un postescalador para el perro de 128 veces el periodo nominal del mismo, el cual es 4 ms. Entonces, 4 ms x 128 = 512 ms. No son 2304 ms obviamente y dado el periodo del perro y los postescaladores a tu disposición, no puedes obtener 2304 ms de periodo del wdt con un 18F2550. El valor más cercano a este es el periodo 2048 ms si utilizas un postescalador de 512, o sea colocando #FUSE WDT512.

Espero haberte sido de utilidad.

0x01 Saludo.
"Siempre piensa si el jugo vale la exprimida..."

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