Vous êtes sur la page 1sur 3

Interrupciones

45

4.3 Interrupciones con prioridades baja y alta


La familia PIC18 posee 2 modelos de mecanismo de interrupcin, 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>). Adems cada fuente de interrupcin tiene un bit utilizado para indicar si la interrupcin es de alta o de baja prioridad. Este bit tiene terminacin IP (INT1IP, INT2IP, etc). Cuando se activa el modo de interrupcin con prioridades, el vector de alta prioridad es la direccin 0x08 y el vector de baja prioridad es la direccin 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 // Seccin de variables globales no inicializadas #pragma udata char contador; //Cdigo para bootloader extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm } // Seccin de cdigo #pragma code

Ing. Juan Ramon Terven Salinas

Interrupciones
// 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 interrupcin externa del pin RB1 OpenRB1INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON); INTCON3bits.INT1IP = 1; // Interrupcin de alta prioridad // Configura interrupcin externa del pin RB2 OpenRB2INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON); INTCON3bits.INT2IP = 0; // Interrupcin de baja prioridad // Habilitacin INTCONbits.GIEH // Habilitacin INTCONbits.GIEL interrupciones de alta prioridad = 1; interrupciones de baja prioridad = 1;

46

// Inicia contador de pulsos contador = 0; LATA = contador; // Ciclo principal while(1) { } } // VECTOR DE ALTA PRIORIDAD // Interrupcin 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 interrupcin }

Ing. Juan Ramon Terven Salinas

Interrupciones

47

//VECTOR DE BAJA PRIORIDAD // Interrupcin 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 interrupcin INTCON3bits.INT2IF = 0; } Programa 4-3. Interrupciones INT1 e RBI

Ing. Juan Ramon Terven Salinas

Vous aimerez peut-être aussi