Programació en C del PIC 16F690

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

Exemple IR - Interrupció per canvi al port A

El PIC16F690 pot tenir interrupcions per canvis d'estat en les entrades dels ports A i B. En aquest exemple farem servir l'entrada RA5.

Els polsadors no són bons per treballar amb interrupcions perquè quan es prem un polsador el seu contacte rebota i el microcontrolador detecta diverses activacions de l'entrada. Per evitar aquest problema, en aquest exemple hem fet servir dues plaques de microcontrolador. En la primera placa mirarem el polsador i quan es detecti que s'ha activat activarem la sortida RA5 durant un temps i després la desactivarem. Connectant la sortida RA5 d'una placa amb l'entrada RA5 de l'altra tindrem una activació única. Això no caldria si la interrupció la volguéssim fer, per exemple, amb un sensor, sempre que no tingui sortida per relé.

Aquest primer programa correspon a la primera placa:

#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
void main (void) {
						// Configuració d'entrades i sortides
	TRISA = 0b11011111; 			// Posa RA5 com a sortida, la resta entrades
	TRISC = 0;				// Posa el port C com a sortides
	ANSEL = 0;				// Desactiva totes les entrades analògiques
	PORTC = 0;				// Desactiva totes les soortides del port C
	while (1){				// Inici del bucle de programa
		if  (RA3 == 0){	// S'ha activat el polsador
			RC0 = 1;	// Activa un LED
			RA5 = 1;	// Activa RA5
			_delay(300000);		// Retard
			RA5 = 0;	// Desactiva RA5
			_delay(300000);		// Retard
			RC0 = 0;	// Desactiva el LED
		}
	}
}

Un cop enviat aquest programa al microcontrolador ja podem desconnectar-lo i connectar l'altra placa. Per a les proves caldrà connectar les dues plaques de manera que totes dues estigui alimentades. Així unirem els borns VDD, VSS i RA5 d'un microcontrolador amb els del mateix nom de l'altre.

El programa del segon microcontrolador é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 de 8 bits sense signe (0 a 255)
void main (void) {
						// Inicialització de variables
	Visualit = 0;				// Posa Visualit a 0
						// Configuració d'entrades i sortides
	TRISA = 0b11111111; 			// Posa el port A com a entrada
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	INTCON = 0b00001000; 			// Activem RABIE
	IOCA = 0b00100000;			// Activa interrupció a RA5
	IOCB = 0;				// Desactiva interrupcions del port B
	ANSEL = 0;				// Desactiva totes les entrades analògiques
	ANSELH = 0;	
	INTCONbits.GIE = 1;			// Habilitem les interrupcions a nivell general
	while (1){				// Inici del bucle de programa
		PORTC = Visualit;		// Copiem el valor al port (als LED)
	}
}
void __interrupt() ports(void){		// funció d'interrupcions
// void interrupt ports(void){			// Línia alternativa
	if  (INTCONbits.RABIF){			// Comprovem que hi ha interrupció externa
		if (RA5 == 1){	// Mira si la interrupció ha estat per activació
						// Ja hem llegit el port A,
						// ja es podrà desactivar RABIF
			Visualit++;		// Incrementa Compta
			if (Visualit >= 16) {	// Si ha acabat setze vegades
				Visualit = 0;	// Posa Visualit a 0
			}
		}				// Sinó, no fem res
		INTCONbits.RABIF = 0;          	// Tornem a posar el bit a zero 
						// (després d'haver llegit el port A)
	}
}

Quan provem el programa veurem que inicialment els LED estan apagats i van comptant cada cop que s'activa el polsador. Si no tinguéssim en compte si l'entrada està activada o desactivada tindríem que es comptaria tant en prémer el polsador com en deixar-lo anar. En aquest cas, però, hauríem de consultar igualment l'estat del port A abans de desactivar RABIF ja que en cas contrari no es desactivaria.

 

 

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