Sie sind auf Seite 1von 6

Sguenos en

Nuestra reputacin en

En esta pgina:

Qu son las interrupciones?

Interrupcin INT

Interrupcin del Timer 0

Interrupcin RB

Interrupciones en mikroC

Ejemplo en lenguaje C

Interrupciones en mikroC: una ayuda


muy valiosa
Extracto del Captulo VII del libro
Cmo programar en lenguaje C los microcontroladores PIC16F88, 16F628A y
16F877A. 2da edicin.

Introduccin
Una interrupcin, como el nombre lo sugiere, es un evento que hace que el
microcontrolador deje de realizar lo que est haciendo y pase a ejecutar otra tarea. Al
finalizar retorna a su actividad inicial.
El PIC16F88 tiene hasta 12 fuentes de interrupciones PIC, el PIC16F628A tiene 10 y el
PIC16F877A tiene 15. El registro INTCON (figuras 7.1.1 y 7.1.2) contiene las banderas
de interrupciones generadas por diferentes eventos. Tambin contiene los bits de
habilitacin global y particular de las distintas fuentes de interrupcin (observar las
diferencias en algunos bits de este registro a lo largo de los siguientes temas).
Figura 7.1.1 Bits del registro INTCON (16F88)

Las banderas de interrupciones PIC se activan independientemente del estado de sus bits
de habilitacin o del bit de habilitacin global GIE.
El bit GIE del registro INTCON permite habilitar o deshabilitar la generacin de
interrupciones. Cuando estn habilitadas (GIE=1) y el bit de habilitacin particular y la
bandera correspondiente se activan, se produce un salto al vector de interrupcin
(direccin 0x0004). Las interrupciones individuales pueden habilitarse/deshabilitarse a
travs de sus bits de habilitacin en diferentes registros. El bit GIE se borra al
producirse un reset, por lo tanto la generacin de interrupciones est deshabilitada
normalmente.
La instruccin RETFIE se emplea para salir de la rutina de servicio a la interrupcin
(ISR), as como rehabilitar la generacin de interrupciones.
Las banderas de las interrupciones INT, RB y del Timer0 se encuentran en el registro
INTCON. Las banderas de interrupcin de los perifricos estn contenidas en los
registros PIR1 y PIR2 (16F877A), mientras que los bits de habilitacin
correspondientes se encuentran en los registros PIE1 y PIE2 (16F877A). El bit de
habilitacin de interrupciones de perifricos (PEIE) est en el registro INTCON.

Cuando se brinda atencin a una interrupcin, el bit GIE es borrado para deshabilitar
cualquier interrupcin adicional, la direccin 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 interrupcin se puede determinar analizando las banderas de
interrupcin. 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
mnimo, que va desde los tres a cuatro ciclos de instruccin, esto depende del instante
en que se genera la interrupcin. Las banderas de interrupcin se activan
independientemente del bit de habilitacin particular, del bit PEIE o del bit GIE.

Interrupcin INT
La interrupcin externa en el pin RB0/INT se activa por flanco ascendente o
descendente, dependiendo del bit INTEDG del registro OPTION_REG. Cuando aparece
una transicin vlida en el pin RB0/INT, la bandera INT0IF del registro INTCON toma
un valor de 1. Esta interrupcin 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 interrupcin. La interrupcin 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 interrupcin despus 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).

Interrupcin del Timer 0


El desbordamiento del registro TMR0 (desde 0xFF a 0x00) genera una interrupcin, lo
cual hace que el bit TMR0IF del registro INTCON sea igual a 1. La generacin de esta
interrupcin 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
interrupcin. Esta interrupcin no puede despertar al 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 interrupcin y
hace que la bandera RBIF del registro INTCON tome un valor de 1. Esta interrupcin
puede habilitarse/deshabilitarse con el bit RBIE del registro INTCON. nicamente los
pines configurados como entradas pueden producir esta interrupcin. Los pines de
entrada RB<7:4> se comparan con el estado anterior que tenan en la ltima lectura del
puerto B. Si no hay coincidencia en todos los pines, se genera la interrupcin.
Esta interrupcin puede despertar al PIC. El usuario, dentro de la ISR, puede borrar la
bandera de interrupcin con cualquiera de los mtodos siguientes:
Lectura o escritura del registro PORTB. Esto concluye la condicin de falta de
coincidencia.

Borrar la bandera RBIF.

Esta interrupcin 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 las interrupciones RB4 RB7.
La lectura continua (Polling) del puerto B no se recomienda mientras se usa la funcin
de interrupcin RB.

Manejo de interrupciones en mikroC


Las interrupciones PIC pueden manipularse fcilmente por medio de la palabra
reservada interrupt. En mikroC se ha declarado de manera implcita la funcin interrupt,
la cual no puede ser redeclarada. Su prototipo es:

void interrupt(void);

Lo nico que el usuario tiene que hacer es escribir la definicin de esta funcin (rutina
de servicio a la interrupcin ISR) para manejar interrupciones en la aplicacin que est
desarrollando. mikroC 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 funcin interrupt. El compilador toma


en cuenta los registros que se estn empleando tanto en la funcin interrupt como en la
funcin main, y salva nicamente los registros que se emplean en ambas funciones.
En caso de que haya mltiples interrupciones habilitadas, se debe detectar la fuente de
la interrupcin por medio de las banderas de interrupcin (flags) y proceder a la
ejecucin del cdigo apropiado.

Ejemplos de programacin de las interrupciones PIC


Estos ejemplos corresponden al PIC16F88. El cdigo fuente para los PICs 16F628A y
16F877A se encuentra en las carpetas correspondientes que acompaan a este libro.
El siguiente ejemplo fue resuelto en el Captulo III (LCD1.c) empleando la tcnica de
lectura continua (Polling) de la entrada RA4; ahora se resolver con la interrupcin INT.
Ntese el uso del pin RB0/INT para cumplir dos funciones: como salida de datos hacia
el LCD y como entrada para la interrupcin 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 lnea 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 lnea se muestra la palabra Conteo:
Figura 7.2.1 Circuito del problema INT1.c (PIC16F88 y 16F628A)
//INT1.c
//Declaracin de las 12 variables necesarias para la conexin
//del mdulo 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 declaracin de variables de conexin.

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; //Interrupcin 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 contina.
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;
}

Das könnte Ihnen auch gefallen