07 – Interrupciones externas del PIC18F4550

Las computadoras y equipos electrónicos modernos son gobernados por microprocesadores y microcontroladores, estos equipos poseen una gran cantidad de dispositivos periféricos que por lo general requieren ser atendidos por el microcontrolador alterando el orden natural del programa. Para atender las peticiones de los dispositivos periféricos, se utilizan las interrupciones. Continuando el tema de las interrupciones, en esta ocasión veremos cómo utilizar las interrupciones externas INTx del PIC18F4550.

Interrupciones externas

Se configuran por medio de los registros INTCON, INTCON2 e INTCON3, los cuales poseen bits de habilitación, prioridad y banderas de estado. El registro INTCON es el más importante para la configuración e implementación de interrupciones externas, la estructura del registro se muestra en la siguiente figura:

Registro INTCON

En el contexto de INT0, los siguientes bits de INTCON son los mas importantes:

  • GIE, se utiliza para habilitar las interrupciones en general, debe ser = 1.
  • INT0IE, se utiliza para habilitar la interrupción INT0, debe ser = 1.
  • INT0IF, es la bandera de interrupción de INT0, se colocará en 1, cada vez que se produzca una interrupción INT0, posteriormente debe ser inicializada “manualmente” con 0.

Adicionalmente, en el registro INTCON2, el bit INTEDG0 se utiliza para definir si la interrupción se activará con un flanco de subida (Rising edge) o flanco de bajada (Falling edge) de la señal. Por defecto INTEDG0 posee un valor de 1, lo que equivale a una activación en flanco de subida.

NOTA: Las interrupciones INT1 e INT2 se configuran por medio del registro INTCON3.

Existen otras configuraciones como, la definición de prioridad de interrupciones, pero este tema no lo abordaremos aquí.

Ejemplo de implementación

A continuación, veremos una aplicación sencilla de la interrupción INT0. El circuito es el siguiente:

Circuito INT0

El microcontrolador tiene una rutina permanente que es hacer un blink en el led conectado a RA0 a intérvalos de 0.25 segundos. Cuando el botón haga una transición de 0 a 1 (Rising edge) se activará INT0, la cual activará una rutina que encenderá o apagará el led conectado a RA1 durante 1 segundo. Posteriormente, el microcontrolador continuará con la rutina del blink hasta que se produzca una nueva interrupción INT0.

El código del ejemplo es el siguiente:


#include <xc.h>

//BITS DE CONFIGURACION.....
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

void retardo(int t);

void main()
{
 //Todas las entradas ANx son digitales
 ADCON1 = 0x0F;
 
 //RA0 y RA1 son salidas
 TRISAbits.RA0 = 0;
 TRISAbits.RA1 = 0;
 
 //INT0 (RB0) es entrada
 TRISBbits.RB0 = 1;
 
 //Leds apagados
 PORTBbits.RB0 = 0;
 PORTBbits.RB1 = 0;
 
 //Configuración de INT0
 INTCONbits.GIE = 1; //Habilitando interrupciones
 INTCONbits.INT0IE = 1; //Habilitar INT0
 INTCON2bits.INTEDG0 = 1; //Interrupción se activa en flanco de subida
 
 while(1)
 {
 //Blink
 PORTAbits.RA0 = 1;
 retardo(25);
 PORTAbits.RA0 = 0;
 retardo(25); 
 } 
}

void interrupt high_isr()
{
 if(INT0IF) //Si la bandera de interrupción es 1
 {
 PORTAbits.RA1 = ~PORTAbits.RA1; //Se invierte el estado del led
 retardo(100);
 //inicializar bandera
 INT0IF = 0;
 }
}

void retardo(int t)
{
 for(int i = 0; i <= t; i++)
 {
 __delay_ms(10);
 }
}

En el siguiente video se muestra la simulación del ejemplo:

Como se puede apreciar, la implementación de interrupciones externas es muy simple pero de gran utilidad para nuestros proyectos. En futuras publicaciones abordaremos el tema de las interrupciones periféricas de los módulos internos del PIC, iniciaremos con los temporizadores. ¡¡¡Un saludo a tod@s!!!

Acerca de jjguevara09

Me gusta la electrónica
Esta entrada fue publicada en Microcontroladores PIC y etiquetada , , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s