Programació en C del PIC 18F45K20

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

Filtrar els rebots d'un polsador

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. Quan només volem saber l'estat del polsador o interruptor això no sol ser important però sí quan volem comptar les activacions o fer que cada activació canviï l'estat del sistema.

El que cal fer és assegurar-nos que l'estat de l'entrada és estable. El programa que es proposa mira el polsador (o interruptor), aproximadament, cada mil·lisegon. Si N vegades seguides el troba igual ho considera estable. El diagrama de flux del programa seria el següent:

Filtrat dels rebots

El programa mira el polsador de la placa (connectat a RB0). Recordem que l'entrada RB0 està habitualment activada i es desactiva quan es prem el polsador. En el programa hem considerat que N és 5.

void main (void)
{
	ANSELH = 0x00;             		// Les entrades AN8-12 són digitals (AN12 coincideix amb RB0)
	INTCON2bits.RBPU = 0;			// Habilita el control de resistències de pull-up al port B
	WPUBbits.WPUB0 = 1;			// Activa la resistència de pull-up a RB0
	TRISBbits.TRISB0 = 1; 		      	// RB0 és entrada
	...					// Altres línies d'inicialització
	while (1)				// Bucle infinit
	{
   		unsigned char Compta = 0;	// Variable local per comptar
		...				// Aquí hi va el que volem que passi quan es prem el polsador
		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(250);		// Retard de 250 cicles
		} while (Compta < 5); 		// Es repeteix fins que hem comptat 5 cops
	}
}

 

 

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