En aquest exemple veurem com funciona el temporitzador de vigilància (watchdog). El programa que farem servir és el següent:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Retard1 ; Definim dues variables de comptatge Retard2 Visualit ; I una variable on guardem el que mostraran els LED Bloqueig ; Variable que farà el bloqueig del programa ; Si no val 0 es bloqueja endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada clrf TRISC ; Posa tots els bits del port C com a sortida movlw b'10000000' ; El prescalat és per al timer 0 ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG movlw b'10010111' ; Activa el watchdog a 1/65536 movwf WDTCON bcf STATUS,RP0 ; Tria el banc 0 clrwdt ; Posem el watchdog a zero clrf Bloqueig movlw b'00001000' ; Activa el bit 3 al registre W movwf Visualit ; Copia el valor de W a la variable Visualit call RetM ; Fa un retard per evitar una mala lectura del polsador Bucle clrwdt ; Posem el watchdog a zero movf Visualit,w ; Copia la variable Visualit sobre el registre W movwf PORTC ; Copia el valor de W al port C call RetM ; Fa un retard per evitar rebots bcf STATUS,C ; posa a zero el bit d'arrossegament rrf Visualit,f ; Fa rodar els bits cap a la dreta ; el bit d'arrossegament entra per l'esquerra ; i el bit de la dreta passa a l'arrossegament btfsc STATUS,C ; Comprova si s'ha activat l'arrossegament ; Si no s'ha activat, salta una instrucció bsf Visualit,2 ; Si s'ha activat, activa el bit 2 btfss PORTA,3 ; Mira si s'ha premut el polsador incf Bloqueig,f ; Si s'ha premut incrementa i, per tant, força el bloqueig movf Bloqueig,f ; Copiem sobre ella mateixa per veure si és zero btfss STATUS,Z ; És zero? goto $ ; Si no ho és, bloqueja goto Bucle ; Repetim
; ; Funció de retard de 0,2 s ; RetM decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return end
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 un punt i coma 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.