Está en la página 1de 4

I

INTERRUPCIONES NTERRUPCIONES
1
Interrupci ones
Introduccin
En los 16F877 hay 14 fuentes posibles de interrupcin.
En ese caso, el hardware interno del PIC ejecuta varias acciones.
1. Se pone GEIE a cero para no aceptar otra interrupcin.
2. Se almacena la direccin de retorno en la pila.
3. El contador de programa se carga con la direccin 0x0004 (que es
la direccin comn para todas las interrupci ones).
Cuando se da un evento en un determinado mdulo, el flag asociado se
pone a 1 y, si las mscaras global (GIE) y particular (y en algunos casos
la de perifricos (PEIE)) estn habilitadas, se acepta la interrupcin.
El programador debe asegurarse de que el cdigo se encarga de
identificar la fuente de la interrupcin, guardar y recuperar el contexto
existente antes de producirse la interrupcin y poner a cero el flag
asociado a la misma para permitir posteriores identificaciones.
Estas tareas quedan enormemente simplificadas usando directivas
y funciones del lenguaje C del compilador de CCS.
Interrupci ones
Las directivas #INT_xxxx
Indican que la funcin que aparece a continuacin corresponde al
tratamiento de una interrupcin (no tiene ni necesita parmetros).
En el caso de los PIC 16F877 hay 14 posibles directivas.
#INT_RTCC Desbordamiento de TMR0. (T0IF)
#INT_RB Cambio en los pines RB<4:7>. (RBIF)
#INT_EXT Flanco en pin RB0. (INTF)
#INT_AD Fin de conversin A/D. (ADIF)
#INT_TBE Buffer de transmisin USART vaco. (TXIF)
#INT_RDA Dato recibido en USART. (RCIF)
#INT_TIMER1 Desbordamiento de TMR1. (TMR1IF)
#INT_TIMER2 Desbordamiento de TMR2. (TMR2IF)
#INT_CCP1 Captura / Comparacin en mdulo CCP1. (CCP1IF)
#INT_CCP2 Captura / Comparacin en mdulo CCP2. (CCP2IF)
#INT_SSP Envo / Recepcin de dato serie sncrono. (SSPIF)
#INT_PSP Dato entrante en puerto esclavo paralelo. (PSPIF)
#INT_BUSCOL Colisin de bus I2C. (BCLIF)
#INT_EEPROM Escritura completa en EEPROM de datos. (EEIF)
2
Interrupci ones
Ventajas de usar las directivas de interrupciones
El compilador genera el cdigo necesario para saltar a la funcin
que va tras esta directiva en el momento de la interrupcin.
Indica que la funcin que viene a continuacin ser llamada si se
dispara una interrupcin y ninguno de los flags est activo.
Tambin genera cdigo para salvar al principio y restituir al final el
contexto, y borrar el flag que se activ con la interrupcin.
El programador debe seguir encargndose de habilitar las
interrupciones.
La directiva #INT_DEFAULT
Indica que la funcin que va a continuacin sustituye todas las
acciones que inserta el compilador al aceptarse una interrupcin. Slo
se ejecuta lo que vaya en dicha funcin.
La directiva #INT_GLOBAL
Interrupci ones
Funciones para gestin de interrupciones
El compilador C de CCS incluye algunas funciones integradas
destinadas a manejar interrupciones.
enable_interrupts (nivel);
nivel es una constante definida en 16F877.h y genera el
cdigo necesario para activar las mscaras necesarias.
Etiquetas de nivel definidas para el 16F877:
GLOBAL INT_RTCC INT_RB
INT_EXT INT_AD INT_TBE
INT_RDA INT_TIMER1 INT_TIMER2
INT_CCP1 INT_CCP2 INT_SSP
INT_PSP INT_BUSCOL INT_EEPROM
La mscara global (la que hace GIE=1) debe activarse de
manera independiente. Las otras slo activan la mscara
particular y el PEIE si es necesario.
disable_interrupts (nivel);
Hace la accin contraria a la funcin anterior, poniendo a
0 las mscaras relacionadas con la interrupcin indicada.
3
Interrupci ones
Existe tambin una funcin adicional destinada a configurar el
flanco activo que genera la interrupcin externa (en RB0).
ext_int_edge (H_TO_L);
Selecciona flanco de bajada para activar el flag INTF.
ext_int_edge (L_TO_H);
Selecciona flanco de subida para activar el flag INTF.
#INT_EXT
ext_isr() {
......}
enable_interrupts (INT_EXT); // Activa mscara INTE
ext_int_edge (H_TO_L); // Flag INTF si flanco de bajada.
enable_interrupts (GLOBAL); // Habilita mscara global de int.
/* Si entra una interrupcin por flanco de bajada en RB0, se ir a la
funcin que aparece tras la directiva #INT_EXT */
disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.
disable_interrupts (GLOBAL); // Desactiva todas las interrupciones.

También podría gustarte