El microcontrolador té la possibilitat que alguns esdeveniments facin una interrupció al programa. Quan hi ha una interrupció, el microcontrolador deixa el que estava fent i executa el programa o funció d'interrupció; quan acaba la funció d'interrupció, torna on estava i segueix el que estava fent.
Poden haver-hi dos nivells d'interrupció. Les interrupcions de nivell baix poden interrompre el programa principal però no les subfuncions d'interrupció. Les interrupcions de nivell alt poden interrompre el programa principal i la funció d'interrupció de nivell baix. Podem definir una funció (només una) que s'executi quan hi ha una interrupció de nivell baix i una altra que s'executi quan n'hi ha una de nivell alt. Si en la nostra aplicació hi ha dues o més interrupcions possibles del mateix nivell, caldrà que totes estiguin definides a la mateixa funció. Dins de la funció podrem mirar quina és la interrupció que hi ha hagut i fer una acció diferent segons el cas. També és possible definir que totes les interrupcions siguin del mateix nivell; això permet la compatibilitat amb programes fets per a altres microcontroladors més senzills. El bit IPEN del registre RCON controla això, quan està a 1 hi ha dos nivells i si està a 0 només n'hi ha un.
Podem activar o desactivar individualment les interrupcions provinents de cada un dels elements que en poden generar. Addicionalment, podem habilitar o deshabilitar les interrupcions de cada nivell de forma global. La inhabilitació global és important per evitar que arribi una interrupció en el moment en el que encara estem executant el programa d'interrupció per una interrupció prèvia. Els bit GIEL i GIEH del registre INTCON controlen globalment les interrupcions, el primer les de nivell baix i el segon les de nivell alt. També caldrà activar la interrupció concreta als registres INTCON, INTCON2, INTCON3, PIE1 i PIE2.
El PIC 18F45K20 té molts tipus d'interrupcions possibles. A l' exemple IT en veiem un parell.
A continuació tenim la forma com es defineixen les subfuncions d'interrupció. Els podem donar el nom que vulguem, aquí els hi hem dit alt_nivell i baix_nivell. Si s'hagués definit que només hi ha un nivell d'interrupció, la segona no existiria. A cada funció comprovem cada un dels bits de les interrupcions d'aquell nivell que tenim en cada cas (ara n'hem suposat dues de cada) i fem el que correspongui a cada una.
void interrupt alt_nivell(void) // funció d'interrupcions d'alt nivell
{
if (INTCONbits.INT0IF) // Comprovem que hi ha interrupció per INT0
{
INTCONbits.INT0IF = 0; // Desactivem el bit que indica la interrupció
...
}
if (PIR1bits.TMR2IF) // Comprovem que hi ha interrupció per Timer 2
{
PIR1bits.TMR2IF = 0; // Desactivem el bit que indica la interrupció
...
}
}
void interrupt low_priority baix_nivell(void) // funció d'interrupcions de baix nivell
{
if (INTCONbits.TMR0IF) // Comprovem que hi ha interrupció per Timer 0
{
INTCONbits.TMR0IF = 0; // Tornem a posar el bit a zero
...
}
if (INTCON3bits.INT1IF) // Comprovem que hi ha interrupció per INT1
{
INTCON3bits.INT1IF = 0; // Desactivem el bit que indica la interrupció
...
}
}
La informació completa de les interrupcions la podeu trobar a l'apartat 9 del document de característiques del PIC 18F45K20.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.