En aquest exemple veurem com funciona el temporitzador de vigilància (watchdog). El programa que farem servir és el següent:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
unsigned char Visualit; // Variable on guardem el que mostraran els LED char Bloqueig; // Variable que farà el bloqueig del programa // Si no val 0 es bloqueja
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b11111111; // Posa el port A com a entrada
OPTION_REG = 0b10000000; // El prescalat és per al timer 0
// I resistències de pull-up desactivades (valor per defecte)
WDTCON = 0b10010111; // Activa el watchdog a 1/65536
CLRWDT(); // Posem el watchdog a zero
Bloqueig = 0; // Inicialment el bloqueig està desactivat
Visualit = 0b00001000; // Activa el bit 3
_delay(200000); // Fa un retard per evitar una mala lectura del polsador
while (1) { // Inici del bucle de programa
CLRWDT(); // Posem el watchdog a zero
PORTC = Visualit; // Copiem el valor al port (als LED)
_delay(200000); // Retard
Visualit = (unsigned char) ((Visualit >> 1)|(Visualit << 7)); // Desplacem els bits a la dreta
if (Visualit == 128){ // Si hem rodat massa
Visualit = 0b00000100; // Activa el bit 2
}
if (RA3 == 0){ // Si es prem el polsador
Bloqueig = 1; // Activa el bloqueig
}
while (Bloqueig == 1){ // Si hi ha bloqueig
; // Queda bloquejat
}
}
}
Abans d'entrar en detalls, comentem què fa el programa. En el moment de posar en marxa, el programa encén el LED de més a l'esquerra (RC3) i comença una rotació de LED però cada cop que es desactiva el LED de la dreta (RC0) s'activa el segon LED (RC2). Això vol dir que el LED de l'esquerra (RC3) només s'activa en el moment de posar en marxa. Si proveu el programa tal com està, veureu que és així.
El programa té, a més, activat el temporitzador de vigilància. No l'hem activat a la configuració sinó al registre WDTCON. En aquest mateix registre hem configurat el prescalat específic a 1/65536. En el registre OPTION_REG hem desactivat el bit PSA, per tant no fem servir l'altre prescalador. En aquestes condicions, el temps establert al temporitzador de vigilància és de 2,11 s.
Si proveu d'enviar el programa sense la línia marcada en groc (o posant-li // al davant) observareu que el programa fa inicialment el que s'espera però cada aproximadament dos segons es reinicia i això es veu clarament perquè el LED de l'esquerra (RC3) només s'activa a l'iniciar.
El programa que hem creat té, però una trampa. Hi ha una variable anomenada Bloqueig que s'activa quan es prem el polsador (RA3). Quan la variable Bloqueig està activa el programa entra en un bucle del que no en pot sortir, és a dir queda bloquejat. Si ara enviem el programa complet (inclosa la línia que està en groc) veurem que quan es prem el polsador s'atura la rotació de LED però passats uns dos segons el temporitzador de vigilància provoca el reinici del programa.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.