Programació en C del PIC 16F690 amb PICkit 2

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

Exemple CP - Control amb polsador

En aquest exemple partirem de l'exemple RL i farem que la rotació de LED avanci cada cop que es premi el polsador. Recordem que el polsador manté activada l'entrada RA3 i l'entrada es desactiva quan el premem. El programa per fer-ho é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
#define Polsador   PORTAbits.RA3		// Li assigna un nom a l'adreça del polsador
unsigned char Valor;  				// Variable de 8 bits sense signe (0 a 255)
void main (void)
{
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISA = 0b00001000; 			// Posa RA3 com a entrada
	Valor = 1;           			// Inicialment posem 1 (activem LED 0)
	while (1)				// Bucle infinit
	{
		PORTC = Valor;			// Copiem el valor al port (als LED)
		if (Valor == 8)			// Si ja estem al LED 3, no podem rodar més
			Valor = 1;    		// tornem al LED 0
		else				// Si no estem al LED 3
			Valor = 2*Valor; 	// Multipliquem per 2 i passem al LED següent
		while (Polsador == 1) 		// Mentre el polsador no estigui premut
			;			// No fa res
	}
}

Observem que on hi havia la funció de retard hi hem posat un bucle que es queda bloquejat fins que es prem el polsador.

Si heu provat aquest programa, haureu vist que no funciona. Mentre el polsador està premut es produeix la rotació de bits i quan el deixem anar es para.

A la versió següent, esperem a que el polsador es deixi anar:

#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
#define Polsador   PORTAbits.RA3		// Li assigna un nom a l'adreça del polsador
unsigned char Valor;  				// Variable de 8 bits sense signe (0 a 255)
void main (void)
{
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISA = 0b00001000; 			// Posa RA3 com a entrada
	Valor = 1;           			// Inicialment posem 1 (activem LED 0)
	while (1)				// Bucle infinit
	{
		PORTC = Valor;			// Copiem el valor al port (als LED)
		if (Valor == 8)			// Si ja estem al LED 3, no podem rodar més
			Valor = 1;    		// tornem al LED 0
		else				// Si no estem al LED 3
			Valor = 2*Valor; 	// Multipliquem per 2 i passem al LED següent
		while (Polsador == 1) 		// Mentre el polsador no estigui premut
			;			// No fa res
		while (Polsador == 0) 		// Mentre el polsador estigui premut
			;			// No fa res
	}
}

Ara funciona millor però no funciona bé ja que de tant en tant se salta un o dos LED. Els polsadors i els interruptors tenen el problema que quan canvien d'estat els contactes reboten i, per això, sovint el microcontrolador no veu només una activació entrada sinó unes quantes. En el nostre cas, el polsador de la placa és força bo i rebota molt poc.

El que cal fer és assegurar-nos que l'estat és estable. El programa que es proposa ara incorpora un filtre per no veure els rebots del polsador.

#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
#define Polsador   PORTAbits.RA3		// Li assigna un nom a l'adreça del polsador
unsigned char Valor;  				// Variable de 8 bits sense signe (0 a 255)
void main (void)
{
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISA = 0b00001000; 			// Posa RA3 com a entrada
	Valor = 1;           			// Inicialment posem 1 (activem LED 0)
	while (1)				// Bucle infinit
	{
   		unsigned char Compta = 0;	// Variable local per comptar
		PORTC = Valor;			// Copiem el valor al port (als LED)
		if (Valor == 8)			// Si ja estem al LED 3, no podem rodar més
			Valor = 1;    		// tornem al LED 0
		else				// Si no estem al LED 3
			Valor = 2*Valor; 	// Multipliquem per 2 i passem al LED següent
		while (Polsador == 0);		// Esperem a que el polsador es deixi anar
			;			// No fem res
		do
		{ 				// Bucle per comptar quants cops detectem el polsador premut
			if (Polsador == 0)	// Si el polsador està premut
				Compta++;	// Incrementa Compta
			else			// Si no està premut
				Compta = 0;	// Posa el comptador zero
			_delay(1000);		// Retard de 1000 cicles
		} while (Compta < 5); 		// Es repeteix fins que hem comptat 5 cops
	}
}

Si el polsador no funciona, assegureu-vos que heu marcat 3-State on 'Release from Reset' a la finestra de propietats del PICkit 2:

PICkit 2

Quan activem aquesta casella li estem dient al programador que es desconnecti del microcontrolador quan acabi de programar. Aquesta desconnexió, però, no és instantània i això pot produir funcionaments inesperats en aquells programes que comprovin l'estat del polsador poc després de que s'iniciï el programa. Per evitar aquests problemes podem posar un retard (per exemple, un segon) entre les inicialitzacions i el tros del programa on es mira el polsador.

 

 

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