Académique Documents
Professionnel Documents
Culture Documents
45
#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
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 }
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