Watchdog
Watchdog
Watchdog
9
#include <p18f4620.h>
#pragma config OSC=HS,PWRT=ON,MCLRE=OFF,LVP=OFF,WDT=ON,WDTPS=256
#include <stdio.h>
Bucle donde espera que se oprima el pulsador y el pin RA0 sea cero.
m:
if(PORTAbits.RA0){
ClrWdt();
}
goto m;
}
1
Imaginemos la siguiente situación.
Tenemos un sistema que en una parte de su proceso debe esperar la
señal proveniente del sensor “X”,ahora bien, el sensor puede
dañarse y la señal nunca llegará quedando nuestro micro en una
espera infinita, a los efectos prácticos, a los ojos de nuestro
cliente, el dispositivo se “colgó”.
Como hemos desarrollado el sistema y desde luego conocemos el
proceso sabemos que ahí hay un punto de posible fallo, entonces
cuando nuestro programa llega a ese punto colocamos una marca,una
bandera que puede por ejemplo ser un número guardado en
determinada posición de la memoria EEPROM ese número puede ser
usado como indicativo del error.
Cuando nuestro micro arranca luego del reset por el WDT lo que
hago es mirar bajo que condiciones estoy arrancando, y si la
bandera del WDT está puesta entonces voy a mirar en la posición de
memoria establecida para ver el número de error, este número puedo
mostrarlo en un LCD o transmitirlo por algún medio o protocolo
establecido, el cliente vería algo como “ERROR 41”(No es lo mismo
que nuestro dispositivo haga algo a que se cuelgue sin mas datos).
Cuando el cliente nos llama indicando el tipo de error ya
tendremos una idea muy clara de donde está el problema pudiendo
incluso colocar en el propio LCD un aviso del tipo “Error sensor X
dañado”.
Esta claro que no podemos poner en el mercado un producto que no
tenga implementado el WDT, esto no evita que nuestro dispositivo
se cuelgue pero si permite recuperar el control de un programa que
se ha salido de curso.
El WDT se puede configurar en rangos que van desde los 4 miliseg.
a 2,18 minutos.
Veamos algunos detalles finos de esta historia.
El microcontrolador tiene un registro llamado RCON, los cinco bits
más bajos del registro indican que ha ocurrido un reset.
2
o cuando el micro pasa a Sleep(),normalmente debemos borrar el
contador del WDT antes que este se desborde y provoque el reset,
para borrar el contador usamos la función ClrWdt().
C18 tiene varias funciones preestablecidas para verificar las
condiciones de inicio del microcontrolador, nuestro programa no
hace uso de estas funciones y simplemente se ha escrito un simple
código que verifica el estado del bit TO.
WDT=ON Indica que el WDT esta activo y WDTPS nos dice cuanto
tiempo espera el WDT antes de provocar el reset, los posibles
valores son:
WDTPS = 1 WDTPS = 512
WDTPS = 2 WDTPS = 1024
WDTPS = 4 WDTPS = 2048
WDTPS = 8 WDTPS = 4096
WDTPS = 16 WDTPS = 8192
WDTPS = 32 WDTPS = 16384
WDTPS = 64 WDTPS = 32768
3
WDTPS = 128
WDTPS = 256
Cuando se oprime el pulsador, la línea if(PORTAbits.RA0) es la
encargada ver este cambio ya que evalúa si el pin 2 es “1” para
ejecutar ClrWdt() y solo es “1” si el pulsador no esta apretado (de
acuerdo a la electrónica de nuestro proyecto).
Si se pulsa el botón rápidamente y no se da tiempo el WDT a
disparar no sucede nada sin embargo si se mantiene el botón
pulsado por mas de un segundo el WDT provoca el reset del PIC.
Como comentario al margen puede ver aquí las funciones que se
mencionaron en el trabajo anterior para el manejo del LCD.
lcd_putrs(" WDT Normal");
lcd_gotoxy(4,2);
stdout= _H_USER;
printf("-%08b-",RCON);