Interrupciones en Mikroc: Una Ayuda Muy Valiosa: Introducción
Interrupciones en Mikroc: Una Ayuda Muy Valiosa: Introducción
Interrupciones en Mikroc: Una Ayuda Muy Valiosa: Introducción
Nuestra reputacin en
En esta pgina:
Interrupcin INT
Interrupcin RB
Interrupciones en mikroC
Ejemplo en lenguaje C
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).
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.
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.
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.
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;
}