Programació en C del PIC 16F690 amb PICkit 2

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

Exemple IE - Interrupció externa

La pota corresponent a l'entrada RA2 pot fer interrupcions si es configura convenientment. Cal, però, que la pota RA2 no estigui definida com a entrada analògica.

Per provar aquest exemple ens caldrà tenir un polsador convenientment connectat a l'entrada RA2. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació.

Normalment es procura que les funcions d'interrupció siguin de ràpida execució. En aquest cas, però, hi posarem un retard per evitar que el microcontrolador detecti 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
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
	OPTION_REG = 0b11000000;		// Interrupció a l'activació
						// I resistències de pull-up desactivades (valor per defecte)
	INTCON = 0b00010000; 			// Habilitem la interrupció externa
						// i deshabilitem les altres
	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 externa(void){			// funció d'interrupcions
// void __interrupt() externa(void){		// Línia alternativa
	INTCONbits.GIE = 0;			// Desactivem momentàniament les interrupcions
	if  (INTCONbits.INTF){			// Comprovem que hi ha interrupció externa
		Visualit++;			// Incrementa Compta
		if (Visualit >= 16) {		// Si ha acabat setze vegades
			Visualit = 0;		// Posa Visualit a 0
		}
		_delay(2000);
		INTCONbits.INTF = 0;          	// Tornem a posar el bit a zero
	}
	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 posem a 0 el bit marcat en taronja el comptatge es farà quan es desactivi 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.