Programació en mpasm 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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20	; Zona de memòria de dades habitual
Visualit		; Una variable on guardem el que mostraran els LED
Retard1			; Variable per al cicle de retard
	endc
	cblock 0x70	; Zona de memòria de dades que no depèn del banc triat
W_Copia			; Guardarà el contingut de W durant la interrupció
ST_Copia		; Guardarà STATUS durant la interrupció
	endc
	org 0
	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	INTCON,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	INTCON,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	STATUS,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	b'11000000'	; Interrupció a l'activació
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG	; Ho guarda al registre de configuració
	bcf	STATUS,RP0	; Tria el banc 0
	bsf	STATUS,RP1	; Tria el banc 2
	clrf	ANSEL		; Desactiva entrades analògiques
	bcf	STATUS,RP1	; Tria el banc 0
	clrf	Visualit	; Posa Visualit a 0
	movlw	b'10010000'	; 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

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.