Muchas veces nos gustara que el procesador para realizar una
tarea, si se produce un evento especfico
Dos mtodos para comprobar si se ha producido este evento: sondeo: Verificar continuamente para el evento en varios puntos en el cdigo
Interrupciones: "Interrumpe" el programa principal y se inicia una rutina de servicio de interrupcin cuando se produce un evento
SONDEO E INTERRUPCIONES EJEMPLO DE SONDE EN C RA0 = 1; //Pone en 1 RA0 while(RB0 == 0); //se cicla mientras //RB0 sea 0 RA0 = 0; //pone en 0 RA0 RA0 = 1 RB0 = 1 ?? RA0 = 0 Yes No HABILTANDO INTERRUPCIONES El procesador debe ser informado que se usaran las interrupciones Un nmero de registros estan destinados a la habilitacin y configuracn de las interrupciones: Control de interrupcin (INTCON) Habilitar interrupcin por periferico 1 (PIE1) Habilitar interrupcin por periferico 2 (PIE2) LOGCA DE INTERRUPCIONES INTE RBIE TMR2IE ADIE PEIE GIE Interrupt Otros perifericos INTF RBIF TMR2IF ADIF TMR0IF Timer0 Int. Externa Cambio en Pines del Puerto B Interrupcin global activado TMR0IE Nucleo Bits de interrupcion ubicados en el registro INTCON GIE REGSTRO INTCON (INTERRUPCIONES DE NUCLEO) PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF Habilita interrupcin global GIE Habilita la interupcin por periferico PEIE Habilita Interrupcion por TIMER0 TMR0IE Habililta interrupcin Externa INTE Habilita interrupcin por cambio en PB RBIE Descripcin Enable Bits Flag Int. desbordamiento Timer0 TMR0IF Flag Int. Externa RB0/INT INTF Flag Int por cambio en PORTB RBIF Descripcin Flag Bits bit 0 bit 7 Debe ser puesto en 1 para usar las interrupciones Debe ser puesto en 1 para usar interrupcin por periferico Flags estaran en 1 aunque no se activen las interrupciones GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF HABILITANDO UNA INTERRUPCIN CORE EN C void main (void) { <codigo para configurar>
// initialize INTCON INTCON = 0b00000000;
//enable an external //interrupt on the INT pin INTE = 1;
//enable global interrupts GIE = 1;
while(1) ; //loop forever } void interrupt isr (void) { //limpia int ext //flag para habilitar int. //despues esta isr INTF = 0;
//<ISR code> } INTCON GIE 0 Dir de mem de prog Stack 0 0 0 0 0 0 0 1 1 INTE INTF 1 Contador de programa Dir de mem de prog Bit GIE automaticamente seteado cuando se completa ISR Interrupt detected on RB0/INT pin Bit GIE automaticamente limpiado por hardware INTERRUPCIN DE PERIFERICOS Dos registros habilitar las interrupciones de perifricos Peripheral Interrupt Enable 1 (PIE1) Peripheral Interrupt Enable 2 (PIE2)
Dos registros muestran los flags de cada interrupcin por periferico- Perifrico solicitud de interrupcin 1 (PIR1) Perifrico solicitud de interrupcin 2 (PIR2) Flags estaran en 1 si no se activan las interrupciones, REGISTROS PIE1 AND PIR1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE PIE1 Register (Peripheral Interrupt Enables) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIR1 Register (Peripheral Interrupt Requests) ADC conversion completa ADIF ADIE AUSART buffer de recepcin lleno RCIF RCIE AUSART buffer de transmisin lleno TXIF TXIE Interrupcin I 2 C SPI SSPIF SSPIE Registro Timer1 CCP1IF CCP1IE Valor de Timer2 y periodo PR2 coinciden en valor TMR2IF TMR2IE Registro de Timer1 fue desbordado TMR1IF TMR1IE Condicin Flag Enable Checa las localizaciones de bits en los diferentes PICS REGISTROSPIE2 Y PIR2 C2IE C1IE EEIE BCLIE ULPWUIE CCP2IE OSCFIE Regstro PIE2 (Habilitacin de Interrupcines) C2IF C1IF EEIF BCLIF ULPWUIF CCP2IF OSCFIF Registro PIR2 (Flags de Interrupci) Cambio salida comparador2 C2IF C2IE Cambio en salida comparador1 C1IF C1IE Operacion de escritura completacompleted EEIF EEIE Ha ocurrido colision en BUS MSSP en modo I2C BCLIF BCLIE Condicin de Wake-up ha ocurrido ULPWUIF ULPWUIE Timer1 Captura o concidencia ha occurrido CCP2IF CCP2IE Falla sistema del oscilador OSCFIF OSCFIE Condicin Flag Enable 1 1 INTCON GIE PEIE PIE1 PIR1 TMR1IE TMR1IF 1 0 1 0 while(1); direccin while(1); direccin void interrupt isr (void) { //Clear the interrupt flag TMR1IF = 0;
// <ISR code> } //ISR completes void main (void) { //clear the interrupt flag TMR1IF = 0;
//enable Timer 1 interrupt TMR1IE = 1;
//Enable peripheral and //global interrupts PEIE = 1; GIE = 1;
// <code to set up Timer1> while(1); //loop forever }
Contador de pro. Stack HBILITANDO UNA INT. POR PERIFERICO C (TIMER1) Bit GIE es automaticamete seteado cuando ISR se completa Desbordamiento Timer 1 Bit GIE es autamaticamente limppiado por hardware Programacin de Microcontroladores usando XC8. 2013 Mk-Pro Mekatronika 11 PRIORIDAD DE INTERRUPCIN Familias PIC linea media tratan todas las interrupciones con la misma prioridad
El programador debe hacer lo siguiente: Determinar la fuente de interrupcin. Determinar el orden en que se atendera la interrupcin.