Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Microcontrolador PIC16F84A.
Objetivo:
Comprobar como funciona la interrupcin externa, /INT, pin n6.
Al actuar sobre el pin n6 mediante un pulsador provocaremos que el puerto A, al cual, hemos
conectados unos leds, se apagen y enciendan en un bucle repetitivo.
Cmo se configuran los registros que intervienen en una interrupcin externa ?
Pasos:
1 paso:
Como las interrupciones de este microcontrolador estn vectorizadas en una sola posicin
de memoria, hay que poner la direccin de la interrupcin (0004h), que es donde va a ir a buscar la
instruccin de salto (goto), que conducir al microcontrolador al programa de tratamiento de la
interrupcin.
2 paso:
Se configura el registro OPTION_REG y en concreto se eligir el tipo de flanco: ascendente
o descendente.
El bit 6 de este registro, llamado INTEDG, se cargar con 1 para elegir flanco ascendente y
0 para flanco descendente.
Yo he elegido flanco descendente.
3paso:
Se configura el registro relacionado con el software de la interrupcin /Int.
El registro y los bits son:
INTCON: bit 7 (GIE)= Activacin global de interrupciones = 1= permiso concedido.
bit 4 (INTE)= Activacin de la interrupcin externa = 1= activada.
Cmo sabremos si se ha producido una interrupcin externa, /Int ?
Toda interrupcin, si est activada, al producirse provocar la activacin de las llamadas
banderas o bits, que al ser examinados nos descubrirn si sea producido una interrupcin.
La bandera o bit de la interrupcin /Int, est en el registro INTCON, y es el bit 1, llamado
INTF. Un 1 en l nos indica que sea producido una interrupcin.
Esta bandera hay que bajarla, o sea, ponerla a cero por software para saber si se ha
producido una peticin de interrupcin posterior.
Esquema elctrico:
Programa:
;---------------------------------------------------------
;PROGRAMA inter.ASM
;Cmo funciona la interrupcin externa /Int.
;---------------------------------------------------------
list p=16f84A
include "p16F84A.inc"
;---------------------------------------------------
;RESET
;---------------------------------------------------
org 00h
reset
goto inicio
;------------------------------
;INTERRUPCION
;------------------------------
org 04h
goto int
;--------------------------------
;PUNTERO DE INICIO
;--------------------------------
org 10h
inicio
;-----------------------------------------------------------
;Configurar el puerto A como salida.
;-----------------------------------------------------------
;Registro TRISB=00h para salidas.
bsf STATUS,RP0; banco1
movlw 00h;
movwf TRISA; puertoA como salida
bcf STATUS,RP0; banco0
;-----------------------
;PuertoA apagado.
;-----------------------
movlw 00h
movwf PORTA
;------------------------------------------------
;Configurar el registro OPTION_REG.
;Flanco de bajada.
;------------------------------------------------
;Registro OPTION_REG
;bit6=INTEDG= 0= flanco descendente
bsf STATUS,RP0; banco1
bcf OPTION_REG,INTEDG; flanco descendente
bcf STATUS,RP0; banco0
;--------------------------------------------------------------------------------
;Configurar el registro INTCON.
;Habilitar permisos de interrupciones general y particular de /Int.
;--------------------------------------------------------------------------------
;Habilitar permiso de interrupcin global.
bsf INTCON,GIE; 1= activacin permiso general.
;Habilitar permiso int.
bsf INTCON,INTE; 1= activacin permiso /int.
;---------------------------------------------------------------------
;Esperando la interrupcin.
;Cuando pulse el botn provoco un flanco de bajada y salgo del
;bucle de espera. La bandera pasa a 1 y salto al programa de la in-
;terrupcin y luego al programa principal, haciendo infinitos bucles.
;La /Int la uso como autorizacin (pulsar el botn) para ejecutar
;el programa principal.
;---------------------------------------------------------------------
espera
btfss INTCON,INTF; salta si es uno
goto espera; salto a "espera" hasta que la
; bandera sea 1.Cuando pulse el
; el botn provoco la interrup-
; cin y salto a ejecutar la sub-
; rutina de interrupcin "int".
; Luego ejecuto el programa
; principal.
;--------------------------------------------------
;PROGRAMA PRINCIPAL
;--------------------------------------------------
programa
movlw 00h; apago puerto A.
movwf PORTA
call sg1
movlw 0ffh; enciendo puerto A.
movwf PORTA
call sg1
goto programa
;------------------------------------------------------------------------------------------
;INTERRUPCION DE /Int.
;------------------------------------------------------------------------------------------
;Deshabilitar permiso de int. global y particular de /Int.
;Con deshabilitar una de los dos bastara para no haber ms interrupciones.
int
bcf INTCON,GIE; 0 para no ms interrupciones
; de ningn tipo.
bcf INTCON,INTE; 0 para no ms interrupcin
; /Int.
;Poner a cero el flag de la /Int., necesario si hubiera ms interrupciones de /Int.
;Este programa solo va haber una "unica" llamada a la /Int. y se ejecutar el
;programa principal indefinidamente deshabilitando para siempre la /Int.
bcf INTCON,INTF; 0 por software.
retfie; retorno de subrutina de interrupcin.
;-------------------------------------------------------------------------
;Retardos.
;--------------------------------------------------------------------------
;c1h=193 goto=2 useg. decfsz=1 useg.( salta si 0 ).
;(193 x 2) + 193 = 579 useg
;(579 x 579) = 335241 useg.
;(335241 x 3) = 1005723 useg.
;0ch, 0dh y 0eh registros RAM del GPR
;----------------------------------------
sg1; 1005723 useg.
movlw 0c1h
movwf 0ch
movwf 0dh
movlw 01h
movwf 0eh
salto1
decfsz 0ch,1
goto salto1
decfsz 0dh,1
goto salto1
decfsz 0eh,1
goto salto1
return
;-------------------------
sg500; 497025 useg.
movlw 0e6h; e6h= 235
movwf 0ch
movwf 0dh
salto2 decfsz 0ch,1
goto salto2
decfsz 0dh,1
goto salto2
return
;--------------------------
sg250; 251001 useg.
movlw 0a7h; a7h= 167
movwf 0ch
movwf 0dh
salto3
decfsz 0ch,1
goto salto3
decfsz 0dh,1
goto salto3
return
;---------------------------
sg125; 125316 useg.
movlw 76h; 76h= 118
movwf 0ch
movwf 0dh
salto4
decfsz 0ch,1
goto salto4
decfsz 0dh,1
goto salto4
return
;----------------------------------
end