Programació en C del PIC 16F690 amb PICkit 2

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, 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
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  (PORTAbits.RA3 == 0){	// S'ha activat el polsador
			PORTCbits.RC0 = 1;	// Activa un LED
			PORTAbits.RA5 = 1;	// Activa RA5
			_delay(300000);		// Retard
			PORTAbits.RA5 = 0;	// Desactiva RA5
			_delay(300000);		// Retard
			PORTCbits.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, 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 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
	INTCONbits.GIE = 0;			// Desactivem momentàniament les interrupcions
	if  (INTCONbits.RABIF){			// Comprovem que hi ha interrupció externa
		if (PORTAbits.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)
	}
	INTCONbits.GIE = 1;			// Tornem a activar les interrupcions
}

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.

 

 

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