Interrupciones
PIC16F877A
Código Ejecutandose Código Ejecutandose
Evento Externo o interno que
pausa la ejecución normal
para atender dicho evento.
Despues de atender interrupción
vuelve a la zona de memoria y
Código de Interrupción continua con la ejecución normal.
1. Peticiòn de interrupciòn
2. Se almacena la información relevante
3. Salto al vector de interrupción
4. Bloque de nuevas interrupciones
5. Identifica fuente de la interrupción
6. Ejecución de código de interrupción
7. Regreso al programa en ejecución (parte donde se quedó),
habilitación de atención a nuevas ejecuciones, restauración de
datos guardados.
* En PIC de gama Alta se asigna prioridad a la interrupción
Las interrupciones tienen un FLAG (Bit que se activa para atender
interrupción).
Enmascaramiento o habilitación de interrupciones (Si este bit esta
habilitado, va hacia el vector de interrupción cuando se activa el flag), de
lo contrario se ignorara la interrupción, aún cuando esta se habilite.
Habilitación global( GIE-ITCON 7). Si no esta a 1 no se atiende a ninguna
interrupción
Habilitación secundaria (GIE-ITCON 6) Si este bit no esta a 1, no se
atiende a las interrupciones asociadas a el.
Registro ITCON.
PIC16F877A 15 Interrupciones
Posibles Causas
Temporizadores
Flanco Externo
Cambio de nivel
Modulo CCP
Conversión A/D
SSP
USART
escritura EEPROM
Comparador
Global Secundario
Flanco Externo
CAMBIO DE NIVEL Flanco Externo
RB7:RB4 CAMBIO DE NIVEL
RB7:RB4
FLAG TIMER 0 FLAG TIMER 0
Interrupción Flanco Externo RB0
INTF -> Flag Flanco externo en RB0
INTE -> Habilitación de interrupción por flanco externo de RB0
INTEDG-> 0 Flanco de Bajada
INTEDG-> 1 Flanco de Subida
Interrupción por cambio de Nivel <RB7:RB4>
RBIF-> Flag Flanco externo en RB0
INTE -> Habilitación de interrupción por flanco externo de RB0
Interrupciones en C
Interrupciones Descripción
#INT_AD Conversión A/D finalizado
#INT_BUSCOL Colisión del bus SSP en modo maestro i2c
#INT_CCP1 Interrupción del modulo CCP
#INT_CCP2 Interrupción del modulo CCP
#INT_COMP Interrupción del comparador
#INT_EEPROM Interrupción por escritura EEPROM
#INT_EXT Interrupción por flanco externo RB0
#INT_PSP Interrupción del puerto paralelo esclavo
Interrupciones en C
#INT_RB Interrupción por cambio de nivel RB7:RB4
#INT_RDA Interrupción por buffer de recepción USART
lleno
#INT_RTCC o #INT_TIMER0 Interrupción del timer 0
#INT_SSP Interrupción por transmisión/Recepción
completa de SSP
#INT_TBE Interrupción por buffer de tansmisión USART
vacio
#INT_TIMER0 Interrupción del timer1
#INT_TIMER1 Interrupción del timer2
Enable_interrupts(nivel);
Disable_interrupts(nivel);
PIE (INT_TIMER1,INT_TIMER2, INT_CCP1, INT_SSP, INT_RDA, INT_TBE, INT_AD, INT_PSP)
PIE2 (INT_CCP2, INT_BUSCOL, INT_EEPROM, INT_COMP)
GLOBAL (GIE-1, PIE-1), PERIPH(PEIE-1), INT_TIMER0 o INT_RTCC, INT_RB, INT_EXT
Ejemplo Interrupción RB0
Ext_int_edge(H_TO_L) Flanco de Bajada
Ext_int_edge(L_TO_H) Flanco de Subida
Habilitar interrupciones
Enable_interrupts(Global);
Enable_interrupts(Int_ext);
#INT_EXT
void EXT_isr(){
}
Código
#int_ext //definimos el espacio para la interrupción
void ext_isr(){ //tipo de interrupción EXTERNA
//codigo de interrupción
}
int main(){
ext_int_edge(H_TO_L); // Definimos flanco de bajada
enable_interrupts(Global); //Habilitamos el bit GIE global para que sean atendidas las interrupciones
enable_interrupts(int_ext); //habilitamos la interrupción secundaria indicandole el tipo(externa)
while(1){
//codigo que se desea
}
}