Interrupciones 45 4.3 Interrupciones con prioridades baja y alta La familia PIC18 posee 2 modelos de mecanismo de interrupción, los ejemplos anteriores usaron el modelo de compatibilidad de los PIC16. Ahora veremos como programar interrupciones con distintas prioridades. Este modelo de interrupciones se habilita activando el bit IPEN (RCON<7>). Además cada fuente de interrupción tiene un bit utilizado para indicar si la interrupción es de alta o de baja prioridad. Este bit tiene terminación IP (INT1IP, INT2IP, etc). Cuando se activa el modo de interrupción con prioridades, el vector de alta prioridad es la dirección 0x08 y el vector de baja prioridad es la dirección 0x18. El siguiente ejemplo ilustra el uso de las interrupciones INT1 e INT2 con distintas prioridades. Ejemplo 4-3. Uso de interrupciones con prioridades /* * * * * */ Interrupciones RBI e INT1 Rutina de desplazamiento en PORTA Cuando recibe un flanco descendente en INT1 aumenta contador con un flanco descendente en INT2 disminuye contador #include <p18cxxx.h> #include <portb.h> // Prototipos de funciones void low_isr(void); //Prototipo de RSI de baja prioridad void high_isr(void); //Prototipo de RSI de alta prioridad // Sección de variables globales no inicializadas #pragma udata char contador; //Código para bootloader extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm } // Sección de código #pragma code Ing. Juan Ramon Terven Salinas Interrupciones 46 // FUNCION PRINCIPAL void main() { // PORTA como salida TRISA = 0; // Configura todo PORTB como entrada TRISB = 0xFF; // Configura pines como digitales ADCON1 |= 0x0f; //Habilita prioridad en interrupciones RCONbits.IPEN = 1; // Configura interrupción externa del pin RB1 OpenRB1INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON); INTCON3bits.INT1IP = 1; // Interrupción de alta prioridad // Configura interrupción externa del pin RB2 OpenRB2INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON); INTCON3bits.INT2IP = 0; // Interrupción de baja prioridad // Habilitación INTCONbits.GIEH // Habilitación INTCONbits.GIEL interrupciones de alta prioridad = 1; interrupciones de baja prioridad = 1; // Inicia contador de pulsos contador = 0; LATA = contador; // Ciclo principal while(1) { } } // VECTOR DE ALTA PRIORIDAD // Interrupción externa INT1 #pragma code high_vector=0x1008 void high_interrupt (void) { _asm GOTO high_isr _endasm } #pragma code #pragma interrupt high_isr void high_isr(void) { contador++; LATA = contador; INTCON3bits.INT1IF = 0; // Limpia la bandera de interrupción } Ing. Juan Ramon Terven Salinas Interrupciones 47 //VECTOR DE BAJA PRIORIDAD // Interrupción externa INT2 #pragma code low_vector=0x1018 void low_interrupt (void) { _asm GOTO low_isr _endasm } #pragma code #pragma interrupt low_isr void low_isr(void) { contador--; LATA = contador; // Limpia la bandera de interrupción INTCON3bits.INT2IF = 0; } Programa 4-3. Interrupciones INT1 e RBI Ing. Juan Ramon Terven Salinas