// PIC18 in C - Versione 0.4 - Febbraio 2016 // Copyright (c) 2014-2016, Vincenzo Villa // Creative Commons | Attribuzione - Condividi allo stesso modo 4.0 Internazionale (CC BY-SA 4.0) // Creative Commons | Attribution-Share Alike 4.0 Unported // https://www.vincenzov.net/tutorial/PIC18/interrupt.htm // PIC18F2xK20 / MPLAB X IDE v3.25 / XC8 1.35 // External interrupt INT0 (high priority) and INT1 (low priority) #include "configurationsbits-PIC18F25K20.h" #define _XTAL_FREQ 1000000 // Main clock frequency (Default: 1 MHz) void configureRegisters(void); // Configure PIC18 registers // ***** main() code ***** void main(void) { configureRegisters(); // Enable interrupt INTCONbits.GIEH = 1; // 1 = Enables all high priority interrupts INTCONbits.GIEL = 1; // 1 = Enables all low priority interrupts while (1) { // Blink RC7, forever LATCbits.LATC7 = ~LATCbits.LATC7; __delay_ms(250); } } // ***** ISR ***** void interrupt __high_priority my_isr_high(void) { if (INTCONbits.INT0F == 1) { // INT0 external interrupt occurred ? LATCbits.LATC6 = 0; // Turn off RC6 pin INTCONbits.INT0F = 0; // Clear INT0 flag } // if (XXX.flag == 1) { // XXX interrupt occurred ? (NOT USED HERE) // ... // XXX.flag = 0; // Clear XXX flag // } return; } void interrupt __low_priority my_isr_low(void) { if (INTCON3bits.INT1IF == 1) { // INT1 external interrupt occurred ? LATCbits.LATC5 = 0; // Turn off RC5 pin INTCON3bits.INT1IF = 0; // Clear INT1 flag } // if (XXX.flag == 1) { // XXX interrupt occurred ? (NOT USED HERE) // ... // XXX.flag = 0; // Clear XXX flag // } return; } // ***** Configure ports and interrupt ***** void configureRegisters(void) { // ***** Configure Port C ***** TRISCbits.RC7 = 0; // Configure RC5 -> RC7 as output TRISCbits.RC6 = 0; TRISCbits.RC5 = 0; LATCbits.LATC5 = 1; // Turn on LEDs on RC5 -> RC7 LATCbits.LATC6 = 1; LATCbits.LATC7 = 1; // ***** Configure Port B ***** TRISBbits.RB0 = 1; // Set RB0 as input ANSELHbits.ANS12 = 0; // Digital input buffer of RB0 is enabled (pin 21 = RB0 = AN12 = INT0) WPUBbits.WPUB0 = 1; // RB0 pull-up individually enabled TRISBbits.RB1 = 1; // Set RB1 as input ANSELHbits.ANS10 = 0; // Digital input buffer of RB1 is enabled (pin 22 = RB1 = AN10 = INT1) WPUBbits.WPUB1 = 1; // RB1 pull-up individually enabled INTCON2bits.nRBPU = 0; // PORTB pull-up global enabled // ***** Configure Interrupts ***** RCONbits.IPEN = 1; // Enable priority levels on interrupts // Configure INT0 interrupt INTCONbits.INT0IE = 1; // 1 = Enables the INT0 external interrupt INTCON2bits.INTEDG0 = 1; // 1 = Interrupt on rising edge INTCONbits.INT0F = 0; // Clear INT0 flag // Configure INT1 interrupt INTCON3bits.INT1E = 1; // 1 = Enables the INT1 external interrupt INTCON3bits.INT1IP = 0; // 0 = Low priority INTCON2bits.INTEDG1 = 1; // 1 = Interrupt on rising edge INTCON3bits.INT1IF = 0; // Clear INT1 flag }