INTERRUPCIÓN POR CAMBIO DE ESTADO EN EL PUERTO B
Interrupción por cambio de estado en el puerto B PIC, el microcontrolador PIC se puede programar para que produzca una interrupción si alguno de los pines RB4, RB5, RB6 y RB7 del puerto B cambia de estado, esto es si pasan de un alto a un bajo o si pasan de un bajo a un alto, no se tienen otras opciones como en el caso visto para la interrupción externa PIC INT.
Por ejemplo los pines RB4, RB5, RB6 y RB7 del PIC16F88 forman un grupo en el puerto B, la habilitación por cambio de estado del puerto B en este caso es mediante un solo bit común a este grupo de pines, si alguno de los pines de algún grupo provoca una interrupción, este pondrá a 1 el bit común al grupo, que es usado para detectar que se ha producido una interrupción externa PIC por alguno de los pines de ese grupo.
Para habilitar la interrupción por cambio de estado del puerto B, se utiliza el registro de control de interrupciones INTCON; con el que se habilitan las interrupciones globales, lo que en el XC8 se hará con la instrucción como se comentó aquí.
Del registro INTCON se pondrá su bit7 a 1 para habilitar las interrupciones, su bit3 RBIE se pondrá a 1 para habilitar el uso de la interrupción por cambio de estado alguno de los pines RB4, RB5, RB6 y RB7 del puerto B, su bit0 RBIF se pondrá a 0 para detectar que ha ocurrido una interrupción por cambio de estado en el puerto B, este bit se pondrá automáticamente a 1 cuando ocurra la interrupción y se tendrá que poner nuevamente a 0 dentro de la rutina de atención a las interrupciones, para que siga detectando la interrupción por cambio de estado en el puerto B.INTERRUPCIÓN POR CAMBIO DE ESTADO EN EL PUERTO B EJEMPLO
En el ejemplo se usarán las resistencias internas pull up del puerto B por lo que del registro OPTION_REG, su bit RBPU se pondrá 0, de esta manera se habilitan estas resistencias pull up del puerto B; las resistencias pull up se activan si el pin correspondiente se configura como entrada, si el pin se configura como salida su resistencia pull up no se activará.
En el ejemplo se ve como se programa el PIC16F88, para utilizar las interrupciones por cambio de estado de los 4 pines RB4, RB5, RB6 y RB7 del puerto B, en el puerto A se han colocado unos leds que nos permitirán visualizar en cual de los pines del puerto B se a producido la interrupción, las interrupciones se provocarán mediante unos pulsadores, además están habilitadas las resistencias pull up del puerto B, se sigue el procedimiento comentado aquí.
El circuito utilizado es el siguiente:
El programa realizado en el XC8 para el uso de la interrupción por cambio de estado del puerto B PIC es el siguiente:
//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
TRISB|=(15<<4);//RB4 a RB7 como entradas digitales
TRISA&=~(15<<0);//RA0 a RA3 como salidas digitales
PORTA&=~(15<<0);//RA0 a RA3 a 0 leds inician apagados
OPTION_REGbits.nRBPU=0;//habilita las resistencias pull up
INTCONbits.GIE=1;//habilita las interrupciones da lo mismo INTCON|=(1<<7)
INTCONbits.RBIE=1;//habilita el uso de la interrupciónes del puerto B
INTCONbits.RBIF=0;//bandera a 0 para detectar las interrupciones
//por cambio de estado del puerto B
while(1){
//lo que sigue es para evitar los rebotes de los pulsadores utilizados en los pines
//RB4 a RB7 para probocar las interrupciones
while(PORTBbits.RB4==0 || PORTBbits.RB5==0 || PORTBbits.RB6==0 || PORTBbits.RB7==0){
__delay_ms(30);
}
while(PORTBbits.RB4==0 || PORTBbits.RB5==0 || PORTBbits.RB6==0 || PORTBbits.RB7==0){
__delay_ms(30);
}
}
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.RBIF==1){//si ha ocurrido la interrupción por cambio de estado
//del puerto B se pone a 1 automaticamente
if(PORTBbits.RB4==0){//si RB4 se pone a 0
PORTA^=(1<<0);//cambia el estado de RA0
}
if(PORTBbits.RB5==0){//si RB5 se pone a 0
PORTA^=(1<<1);//cambia el estado de RA1
}
if(PORTBbits.RB6==0){//si RB6 se pone a 0
PORTA^=(1<<2);//cambia el estado de RA2
}
if(PORTBbits.RB7==0){//si RB7 se pone a 0
PORTA^=(1<<3);//cambia el estado de RA3
}
INTCONbits.RBIF=0;//al salir la bandera nuevamente a 0 para seguir detectando
//interrupciones por cambio de estado del puerto B
}
}
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