tecmikro logo
Programación de microcontroladores PIC en mikroC PRO
Email: tecmikro@gmail.com   Cel. 098 743 8877   Telf. 243 0352 Quito-Ecuador


Interrupciones del microcontrolador PIC en mikroC PRO

 

Las interrupciones, como el nombre lo sugiere, son eventos que hacen que el microcontrolador PIC deje de realizar lo que está haciendo y pase a ejecutar otra tarea. Al finalizar retorna a su actividad anterior.

El microcontrolador PIC16F88 tiene hasta 12 fuentes de interrupciones, el microcontrolador PIC16F628A tiene 10 y el microcontrolador PIC16F877A tiene 15.

El registro INTCON (figuras 7.1.1 y 7.1.2) contiene las banderas de interrupciones generadas por diferentes eventos. También contiene los bits de habilitación global y particular de las distintas fuentes de interrupciones (observar las diferencias en algunos bits de este registro a lo largo de los siguientes temas).

 

Control de interrupciones del microcontrolador pic

Figura 7.1.1 Bits del registro INTCON (microcontrolador PIC16F88)


Las banderas de interrupciones se activan independientemente del estado de sus bits de habilitación o del bit de habilitación global GIE.
El bit GIE del registro INTCON permite habilitar o deshabilitar la generación de interrupciones. Cuando están habilitadas (GIE=1) y el bit de habilitación particular y la bandera correspondiente se activan, se produce un salto al vector de interrupción (dirección 0x0004). Las interrupciones individuales pueden habilitarse/deshabilitarse a través de sus bits de habilitación en diferentes registros. El bit GIE se borra al producirse un reset, por lo tanto la generación de interrupciones está deshabilitada normalmente.
La instrucción RETFIE se emplea para salir de la rutina de servicio a la interrupción (ISR), así como rehabilitar la generación de interrupciones.
Las banderas de las interrupciones INT, RB y del Timer0 se encuentran en el registro INTCON. Las banderas de interrupción de los periféricos están contenidas en los registros PIR1 y PIR2 (microcontrolador PIC16F877A), mientras que los bits de habilitación correspondientes se encuentran en los registros PIE1 y PIE2 (16F877A). El bit de habilitación de interrupciones de periféricos (PEIE) está en el registro INTCON.

Cuando se brinda atención a una interrupción, el bit GIE es borrado para deshabilitar cualquier interrupción adicional, la dirección de retorno es guardada (pushed) en la pila (stack) y el contador de programa (PC) es cargado con el valor 0x0004. Una vez dentro de la ISR, la fuente de la interrupción se puede determinar analizando las banderas de interrupción. Las banderas tienen que ser borradas por software antes de rehabilitar las interrupciones, para evitar interrupciones repetitivas.
Las interrupciones externas INT o RB4 RB7 pueden generarse cada cierto tiempo como mínimo, que va desde los tres a cuatro ciclos de instrucción, esto depende del instante en que se genera la interrupción. Las banderas de interrupción se activan independientemente del bit de habilitación particular, del bit PEIE o del bit GIE.

Interrupciones INT del microcontrolador PIC

La interrupción externa en el pin RB0/INT se activa por flanco ascendente o descendente, dependiendo del bit INTEDG del registro OPTION_REG. Cuando aparece una transición válida en el pin RB0/INT, la bandera INT0IF del registro INTCON toma un valor de 1. Esta interrupción puede ser habilitada/deshabilitada con el bit INT0IE del registro INTCON. La bandera INT0IF tiene que ser borrada por software dentro de la ISR antes de rehabilitar esta interrupción. La interrupción INT puede despertar al PIC, si el bit INT0IE se programó en 1 antes de ingresar al modo Sleep. El estado del bit GIE determina si se produce o no el salto al vector de interrupción después del despertar (los detalles aparecen en las secciones 6.11 MODO DE BAJO CONSUMO (Sleep) PIC16F88 o 6.19 MODO DE BAJO CONSUMO (Sleep) PIC16F628A y PIC16F877A del libro).

Interrupciones del Timer 0

El desbordamiento del registro TMR0 (desde 0xFF a 0x00) genera una interrupción, lo cual hace que el bit TMR0IF del registro INTCON sea igual a 1. La generación de esta interrupción se puede habilitar/deshabilitar con el bit TMR0IE del registro INTCON. El bit TMR0IF tiene que ser borrado por software dentro de la ISR antes de rehabilitar esta interrupción. Esta interrupción no puede despertar al microcontrolador PIC, ya que el temporizador está apagado durante el modo Sleep.

Interrupciones RB4 RB7

Un cambio de estado en cualquiera de los pines RB<7:4> genera una interrupción y hace que la bandera RBIF del registro INTCON tome un valor de 1. Esta interrupción puede habilitarse/deshabilitarse con el bit RBIE del registro INTCON. Únicamente los pines configurados como entradas pueden producir esta interrupción. Los pines de entrada RB<7:4> se comparan con el estado anterior que tenían en la última lectura del puerto B. Si no hay coincidencia en todos los pines, se genera la interrupción.
Esta interrupción puede despertar al microcontrolador PIC. El usuario, dentro de la ISR, puede borrar la bandera de interrupción con cualquiera de los métodos siguientes:
  • Lectura o escritura del registro PORTB. Esto concluye la condición de falta de coincidencia.
  • Borrar la bandera RBIF.
Esta interrupción se recomienda para despertar al PIC en caso de presionar una tecla o en el caso de que el puerto B se emplee únicamente para la interrupción RB4 RB7. La lectura continua (Polling) del puerto B no se recomienda mientras se usa la función de interrupción RB.

Manejo de interrupciones en mikroC PRO

Se pueden manipularse fácilmente por medio de la palabra reservada interrupt. En mikroC PRO se ha declarado de manera implícita la función interrupt, la cual no puede ser redeclarada. Su prototipo es:

void interrupt(void);

Lo único que el usuario tiene que hacer es escribir la definición de esta función (rutina de servicio a la interrupción ISR) para manejar interrupciones en la aplicación que esté desarrollando. mikroC PRO se encarga de salvar y recuperar de la pila (stack) los registros W, STATUS, FSR y PCLATH.

Se pueden realizar llamadas a funciones desde la función interrupt. El compilador mikroC PRO toma en cuenta los registros que se están empleando tanto en la función interrupt como en la función main, y salva únicamente los registros que se emplean en ambas funciones.
En caso de que haya múltiples interrupciones habilitadas, se debe detectar la fuente de la interrupción por medio de las banderas de interrupción (flags) y proceder a la ejecución del código apropiado.

Ejemplo en mikroC PRO con el PIC16F88

Estos ejemplos corresponden al PIC16F88. El código fuente para los PICs 16F628A y 16F877A se encuentra en las carpetas correspondientes que acompañan a este libro.
El siguiente ejemplo fue resuelto en el Capítulo III (LCD1.c) empleando la técnica de lectura continua (Polling) de la entrada RA4; ahora se resolverá con la interrupción INT. Nótese el uso del pin RB0/INT para cumplir dos funciones: como salida de datos hacia el LCD y como entrada para la interrupción INT. El programa se encarga de mantener el valor original del registro TRISB.

Ejemplo-INT1.c: Cada vez que presiona el pulsador conectado en RB0 se incrementa un contador que se visualiza en el centro de la segunda línea de la pantalla (figuras 7.2.1 y 7.2.2). Si la cuenta supera 100, el conteo se reinicia desde 0. En el centro de la primera línea se muestra la palabra “Conteo:”

Circuito para interrupciones del microcontrolador pic

Figura 7.2.1 Circuito del problema INT1.c (PIC16F88 y 16F628A)
//INT1.c
//Declaración de las 12 variables necesarias para la conexión
//del módulo LCD.
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit; 
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin de declaración de variables de conexión.

char contador=0,texto[4], respaldo; 

void main(){ 
OSCCON=0x40;                //Oscilador interno a 1MHz.
while (OSCCON.IOFS==0);//Esperar mientras el oscilador está inestable.
ANSEL=0x00;                 //Bits AN6:AN0 como E/S digital.
GIE_bit=1;                  //Interrupciones habilitadas.
NOT_RBPU_bit=0;             //Pull ups habilitados.
INTEDG_bit=0;               //INT por flanco descendente.

Lcd_Init();                 //Inicializa el LCD. 
Lcd_Cmd(_LCD_CLEAR);        //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF);   //Apaga el cursor.
Lcd_Out(1,6,"Conteo:");
ByteToStr(contador,texto);
Lcd_Out(2,6,texto);

respaldo=TRISB;             //Guardar el estado de TRISB. 
TRISB0_bit=1;               //RB0 como entrada.
INTE_bit=1;                 //Interrupción INT habilitada.
while (1)
{
 asm SLEEP                  //Entra en modo SLEEP.
 asm NOP                    //Se despierta por INT, ejecuta NOP y
                            //salta a "interrupt".
 ByteToStr(contador,texto); //Retorna de "interrupt" y continúa.
 TRISB=respaldo;            //Restaurar TRISB.
 Lcd_Out(2,6,texto);
 respaldo=TRISB;            //Guardar el estado de TRISB.
 TRISB0_bit=1;              //RB0 como entrada.
}
}

void interrupt(void) 
{
 Delay_ms(20);
 if (RB0_bit==0) contador++;  //Pulsador presionado.
 while (RB0_bit==0);          //Esperar mientras siga presionado.
 if (contador >100) contador=0;
 INTF_bit=0;
}
Temas relacionados que también encontrarás en este libro:
  • Más ejemplos de programación de la interrupción INT
  • Ejemplos de programación de la interrupción RB4 RB7
  • Ejemplos de programación de la interrupción del Timer 0

 


eBook en formato PDF "Cómo programar microcontroladores PIC"

Guía básica para programar microcontroladores PIC en mikroC PRO. Disponible en formato PDF. A la venta por tan sólo US$12.00

¡Cómpralo ya!