Programació en pic-as del PIC 16F690

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

Exemple IE - Interrupció externa

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.

 

 

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