Programació en C del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Interrupcions

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 d'interrupció; quan acaba la funció d'interrupció, torna on estava i segueix el que estava fent.

La funció d'interrupció és una funció especial que no es crida enlloc del programa sinó que hi accedeix directament el microcontrolador. Hi ha dues possibles sintaxis:

void interrupt temporit(void){			// funció d'interrupcions
...
}

void __interrupt() temporit(void){		// funció d'interrupcions
...
}

El nom de la funció d'interrupció no té gaire importància ja que no la cridem des del programa. Sembla que algunes versions del compilador XC8 només admeten una de les dues. Si una d'elles falla podem provar amb l'altra.

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 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. El bit GIE del registre INTCON controla globalment les interrupcions. També caldrà activar la interrupció concreta al registre corresponent. La següent taula conté els registres que controlen les interrupcions més destacades. Els bits de control són els que permeten activar (quan estan a 1) o desactivar la interrupció. Les banderes són les que ens permeten saber quina interrupció és lque s'ha activat (i cal desactivar-les manualment).

Important: La interrupció del microcontrolador es produeix quan està activada la bandera corresponent a una interrupció activada i està activat el bit GIE. Això vol dir que si quan activem el bit GIE hi ha alguna bandera activada la interrupció es produirà immediatament. El microcontrolador no gestiona la desactivació de les banderes sinó que les hem de desactivar en el nostre programa un cop les hem consultat.

Registre Núm. bit Adreça bit Funció
INTCON 7 INTCONbits.GIE Activació global de les interrupcions
6 INTCONbits.PEIE Activació de les interrupcions per perifèrics
(Controlats pels registres PIE1 i PIE2)
5 INTCONbits.T0IE Activació de la interrupció per Timer 0
4 INTCONbits.INTE Activació de la interrupció externa (RA2)
3 INTCONbits.RABIE Activació de la interrupció per canvis als ports A i B
(Controlats pels registres IOCA i IOCB)
2 INTCONbits.T0IF Bandera de la interrupció per Timer 0
1 INTCONbits.INTF Bandera de la interrupció externa (RA2)
0 INTCONbits.RABIF Bandera de la interrupció per canvis als ports A i B⦿
PIE1 0 a 6 Activació de les interrupcions per conversor A/D, comunicacions i timers 1 i 2
PIE2 4 a 7 Activació de les interrupcions per comparadors, oscil·lador i EEPROM
PIR1 0 a 6 Banderes de les interrupcions per conversor A/D, comunicacions i timers 1 i 2
PIR2 4 a 7 Banderes de les interrupcions per comparadors, oscil·lador i EEPROM
OPTION_REG 6 OPTION_REGbits.INTEDG Si està activat la interrupció externa és a l'activació
Si està desactivat és a la desactivació.
IOCA 0 a 5 IOCAbits.IOCA0   a
IOCAbits.IOCA5
Si està activat el bit, la pota corresponent farà interrupcions
(a l'activar-se i al desactivar-se)
IOCB 4 a 7 IOCBbits.IOCB4   a
IOCBbits.IOCB7
Si està activat el bit, la pota corresponent farà interrupcions
(a l'activar-se i al desactivar-se)

Cal que l'entrada implicada no estigui configurada com a analògica.

⦿ Cal tenir present que la bandera RABIF s'activa quan la darrera lectura del port no es correspon amb el valor actual. Si desactivem la bandera sense haver llegit encara el port ens trobarem que es torna a activar immediatament. Cal, doncs, llegir el port abans de desactivar la bandera.

Quan es volen desactivar les interrupcions des de fora de la funció d'interrupció, cal tenir present que existeix la remota possibilitat que aparegui una interrupció en el mateix instant en el que es vol desactivar el bit GIE. Si això passés, les interrupcions no es desactivarien. Per evitar aquest problema, es pot comprovar la desactivació de GIE i repetir la desactivació si no s'ha fet:

Quan el microcontrolador té activades dues o més interrupcions, pot succeir que se n'activin dues de simultànies o amb poca diferència de temps. Per això és recomanable que la funció d'interrupció comprovi tots els bits ja que si només fa el que correspon a la primera interrupció que troba, alguna altra pot quedar sense servir.

En programes que fan servir diverses interrupcions pot donar-se el cas que no ens interessi desactivar completament les interrupcions perquè hi pot haver una interrupció més prioritària. Llavors el normal és establir dos nivells de prioritat (a vegades tres). Quan hi ha una interrupció del nivell més baix es desactiven les interrupcions del mateix nivell i es mantenen activades les de nivell superior.

A l'Exemple IT es fa servir una interrupció corresponent al Timer 0.

A l'Exemple IE es fa servir una interrupció externa.

A l'Exemple IR es fa servir una interrupció per canvi al port A.

La informació completa de les interrupcions la podeu trobar a l'apartat 14.3 del document de característiques del PIC 16F690.

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.