La pota corresponent a l'entrada RA2 pot fer interrupcions si es configura convenientment. Cal, però, que la pota RA2 no estigui definida com a entrada analògica.
Per provar aquest exemple ens caldrà tenir un polsador convenientment connectat a l'entrada RA2. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació.
Normalment es procura que les funcions d'interrupció siguin de ràpida execució. En aquest cas, però, hi posarem un retard per evitar que el microcontrolador detecti els rebots del polsador.
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
; Zona de memòria de dades habitual Visualit EQU 0x20 ; Una variable on guardem el que mostraran els LED Retard1 EQU 0x21 ; Variable per al cicle de retard ; ; Zona de memòria de dades que no depèn del banc triat W_Copia EQU 0x70 ; Guardarà el contingut de W durant la interrupció ST_Copia EQU 0x71 ; Guardarà STATUS durant la interrupció
PSECT code, class=CODE, delta=2, abs main: ; Adreça 0 h goto Inici ; Saltem al lloc on hi ha el programa principal nop ; Zona de memòria de programa que no utilitzem nop nop
Interrup:
movwf W_Copia ; Copiem l'acumulador a W_Copia
swapf STATUS,w ; Copiem STATUS a l'acumulador permutant els nibbles
clrf STATUS ; Posa a 0 i així segur que el banc és el 0
movwf ST_Copia ; Guarda STATUS permutat a ST_Copia
btfss INTF ; Mira si la interrupció és externa
; Si hi ha arribat, no fa la instrucció següent
goto FiInt ; Si la interrupció no és externa no fem res
; Només havíem activat les interrupcions externes
; Però, en general, és bo comprovar que l'origen
; de la interrupció és el que esperem
Ext: ; Programa corresponent a interrupció externa
bcf INTF ; Si ho és, desactivem el bit
incf Visualit,f ; Incrementem Visualit
btfsc Visualit,4 ; Mirem si s'ha activat el bit 4
clrf Visualit ; Posa Visualit a 0
call RetC ; Fa un retard per evitar rebots
call RetC ; Fa un retard per evitar rebots
call RetC ; Fa un retard per evitar rebots
FiInt:
swapf ST_Copia,w ; Copia permutant ST_Copia a l'acumulador
movwf STATUS ; I ho passa a STATUS recuperant el valor d'abans
; de la interrupció
swapf W_Copia,f ; Permuta els bits de W_Copia
swapf W_Copia,w ; Torna a permutar els bits de W_Copia
; i els guarda a l'acumulador sense variar STATUS
retfie ; Torna al programa principal, on s'havia quedat
Inici:
bsf RP0 ; Tria el banc 1
movlw 0xFF ; Posa l'acumulador a FFh (tot uns)
movwf TRISA ; Posa tots els bits del port A com a entrada
clrf TRISC ; Posa tots els bits del port C com a sortida
movlw 11000000B ; Interrupció a l'activació
; I resistències de pull-up desactivades (valor per defecte)
movwf OPTION_REG ; Ho guarda al registre de configuració
bcf RP0 ; Tria el banc 0
bsf RP1 ; Tria el banc 2
clrf ANSEL ; Desactiva entrades analògiques
bcf RP1 ; Tria el banc 0
clrf Visualit ; Posa Visualit a 0
movlw 10010000B ; Activem GIE i INTE
movwf INTCON ; Activa les interrupcions globals i l'externa
Bucle:
movf Visualit,w ; Copia Visualit a l'acumulador
movwf PORTC ; I ho posa als LED
goto Bucle ; Repetim-ho...
; ; Funció de retard de 0,8 ms ; RetC: decfsz Retard1,f goto RetC return END main
Quan provem el programa veurem que inicialment els LED estan apagats i van comptant cada cop que s'activa el polsador. Si posem a 0 el bit marcat en taronja el comptatge es farà quan es desactivi el polsador.

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