Microcontrolador PIC Interrupción Externa PIC
La interrupción externa PIC se produce cuando en un pin preparado especialmente para este fin se produce algún evento, como que ocurra algún cambio de estado de ese pin como por ejemplo pasar de un bajo(0) a un alto(1); la interrupción externa PIC se comentará para el caso del PIC16F88 pero si se quiere utilizar algún otro microcontrolador PIC el procedimiento es muy similar, solo hay que guiarse de la hoja de datos del microcontrolador PIC utilizado.
La interrupción externa PIC es útil para el manejo de pulsadores, detectores de cruce por 0, en la comunicación SPI, en contadores, y mucho mas; en la imagen se tiene la representación de los pines del PIC16F88, el pin 6 o RB0 o INT es el pin preparado para producir una interrupción externa, otros microcontroladores PIC tienen mas de estos pines y son llamados como INT0, INT1, INT2 como en el PIC18F4550.
En el caso del PIC16F88, la interrupción externa puede ser programada para que cuando una señal digital que esté llegando al pin INT cambie de estado, se tienen 2 opciones:
La interrupción externa ocurrirá por flanco de subida de la señal, esto es cuando la señal pase de 0 a 1, o de un bajo a un alto
La interrupción externa ocurrirá por flanco de bajada de la señal, esto es cuando la señal pase de 1 a 0, o de un alto a un bajo.
Interrupción Externa PIC
Del registro OPTION_REG al poner su bit6 llamado INTEDG a 0 la interrupción ocurrirá cuando el cambio de estado del pin INT sea de 1 a 0 o por flanco de bajada, al ponerlo a 1 la interrupción ocurrirá cuando el cambio de estado del pin INT sea de 0 a 1 o por flanco de subida.
Del registro INTCON se pondrá su bit7 GIE a 1 para habilitar el uso de las interrupciones, su bit4 INTE se pondrá a 1 para habilitar el uso de la interrupción externa por el pin INT, su bit1 INTF es la bandera que detecta que se ha producido la interrupción externa y se tendrá que poner a 0 para que haga la detección, cuando ocurre la interrupción este bit se pone automáticamente a 1, y para seguir detectando mas interrupciones externas en al rutina de atención a las interrupciones se tendrá que poner nuevamente a 0.
INTERRUPCIÓN EXTERNA PIC EJEMPLO
El siguiente es un ejemplo de como utilizar la interrupción externa PIC para el pin6 del PIC16F88, el estado normal de funcionamiento del microcontrolador PIC es hacer que cambie el estado del led conectado en el pin RA0 cada 100ms, el pin INT se mantendrá normalmente a 0, como se indica en la siguiente imagen, cuando se presiona el pulsador, al pin INT se la hará llegar un 1 cambiando su estado de un bajo a un alto, esto provocará una interrupción, en ese momento el funcionamiento normal del PIC se detendrá para atender a la interrupción, el led del pin RA0 dejará de parpadear, y el led del pin RA1 cambiará de estado cada 100ms unas 20 veces, luego se saldrá de la rutina de atención a las interrupciones, volviendo el PIC16F88 a su funcionamiento normal.
El código realizado en el XC8 para este programa es el siguiente, en nuestro caso se dará preferencia a la programación mediante la manipulación de bits, es lo mejor, con el tiempo y un poco de práctica se vera que si que es lo mejor programar así
--------
//bits de configuración para el pic 16f88, se utilizará un oscilador externo de 20Mhz
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// CONFIG2
#pragma config FCMEN = ON // (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON // (Internal External Switchover mode enabled)
//fin bits de configuración
#include <xc.h>
#define _XTAL_FREQ 20000000//oscilador a 20Mhz
void main(void) {
ANSEL=0;//los pines como entradas salidas digitales
TRISA&=~(1<<0);//pin RA0 como salida digital para es lo mismo TRISAbits.TRISA0=0
//el led del programa principal que parpadea cada 100ms
TRISA&=~(1<<1);//pin RA1 como salida digital para
//el led que parpadeará durante la interrupción
PORTAbits.RA0=0;//led inicia apagado da lo mismo PORTA&=~(1<<0)
PORTAbits.RA1=0;//led inica apagado
INTCONbits.GIE=1;//habilita las interrupciones da lo mismo INTCON|=(1<<7)
INTCONbits.INTE=1;//habilita el uso de la interrupción externa
INTCONbits.INTF=0;//bandera a 0 para detectar la
//interrupcion externa
OPTION_REGbits.INTEDG=1;//la interrupción externa en el pin ocurrirá
//por flanco de subida
while(1){
PORTA^=(1<<0);//salida pin RA0 cambia estado
__delay_ms(100);//cada 100ms
}
return;
}
void __interrupt() yanet(void){//rutina de atención a las interrupciones se le tendrá
//que dar un nombre, en nuestro caso es yanet
if(INTCONbits.INTF==1){//si ha ocurrido la interrupción externa esta bandera
//se pone a 1 automaticamente
for(int i=0;i<20;i++){
PORTA^=(1<<1);//cambia el estado del pin RB4
__delay_ms(100);//cada 100ms 20 veces
}
INTCONbits.INTF=0;//al salir la bandera nuevamente a 0 para seguir detectando
//interrupciones externas
}
}
Esperamos de todo corazón ser de vuestra ayuda, no olviden suscribirse al canal de mrelberni, darle me gusta a los vídeos, compartirlos, que de esa manera nos ayudan a continuar, desde ya muchas gracias.
Publicar un comentario