Programació en C del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple WD - Temporitzador de vigilància (watchdog)

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, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
unsigned char Visualit;  			// Variable on guardem el que mostraran els LED
bit 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 = (Visualit >> 1)|(Visualit << 7);		// Desplacem els bits a la dreta
		if (Visualit == 128){		// Si hem rodat massa
			Visualit = 0b00000100;	// Activa el bit 2
		}
		if (PORTAbits.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.

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.