INTERRUPCIÓN EXTERNA PIC

 

Microcontrolador PIC Interrupción Externa PIC

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.

    microcontrolador pic interrupcion externa pic 2

    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.

    microcontrolador pic interrupcion externa pic 3

    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.

    interrupción externa pic


    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.

    anterior:                                                                                                siguiente:

    Publicar un comentario

    Copyright © Electricidad y Electrónica. Designed by OddThemes