Estimados amigos de todopic. Es primera vez que ingreso, he leido bastante en este foro y por lo cuál agradezco el que compartan con los que somos iniciantes en este maravilloso mundo de los PIC. Muchas Gracias.
Permítanme preguntar algo básico, por favor.
Estoy estudiando recien las interrupciones del 16f84, y he creado un rutina pequeña para probar dos de las 4 interrupciones de este PIC. Hay un fenómeno que no he podido dilucidar. Estoy probando la Interrupción RBIE (por activación de RB7:RB4) y cuando se debe, el programa no borra el flag INTCON,0 por programa (bcf intcon,0) cuando lo simulo no hace nada. Luego al pasar por RETFIE, tampoco pone a 1 GIE (intcon,7). He usado MPLAB v7.2 y 7.4 y pasa lo mismo.
He usado la misma rutina para probar la Interr. INTE y funciona ok. ¿¿¿???
Adjunto mi humilde código, a ver si alguien me da una mano. Muchas Gracias
;Prueba dos tipos de interrupciones: cambio en RB7:RB4 ; int.externa RB0/INT
;Se ha puesto un led en A0 para verificar la interr. por in en RB7:RB4 y
;se ha puesto un led en A1 para verificar la interr. por in en RB0/INT
list p=16f84a
#INCLUDE P16F84A.INC
radix hex
radix dec
;line8
porta equ 0x05
portb equ 0x06
trisa equ 0x85
trisb equ 0x86
status equ 0x03
optio equ 0x81
intcon equ 0x0b
tmr0 equ 0x01
saveW equ 0x0c
saveSTATUS equ 0x0d
#DEFINE banco0 bcf status,5
#DEFINE banco1 bsf status,5
;---------------------------------------------------------------------
org 0x000
goto ini
org 0x04 ; Vector de interrupcion
goto inter
; Inicio de programa
; -------------------- Definiciones --------------------------------
ini
banco1 ; banco1
movlw b'11111111' ; Puerta b entradas
movwf trisb
movlw b'00000000' ; Puerta a salidas
movwf trisa
movlw b'01000000'
movwf optio
movlw b'10001000' ; intcon: GIE=1, y RBIE=1 solo interr. gral y la interr. por puertas RB7:RB4
movwf intcon
banco0 ; banco0
; clrf porta
;Programa Principal
;----------------------------------------------------------------------
dormir
nop
nop
goto dormir
;Rutina Servicio Interrupciones
;----------------------------------------------------------------------
inter
movwf saveW ;Guarda W y STATUS, como se recomienda
swapf status,0 ;Guarda W y STATUS, como se recomienda
movwf saveSTATUS ;Guarda W y STATUS, como se recomienda
btfsc intcon,0 ;salta si el flag RBIF de INTCON es 0, si es 1 sigue
goto led0 ;(Se ha provocado un Stimulus sobre RB7. Es un high pulse de 2 cycles)
; btfsc intcon,1 ;salta si el flag INTF (RB0/INT) es 0, si es 1 sigue
; goto led1
; btfsc intcon,2 ;salta si el flag TOIF (TMR0) es 0, si es 1 sigue.
; call led2
bsf porta,0
swapf saveSTATUS,0
movwf status
swapf saveW,1
swapf saveW,0
bcf intcon,0
retfie
;Subrutinas de Interrupción
;----------------------------------------------------------------------
led0
btfsc porta,0 ;se verifica si led en puerta A0 está encendido
goto led0_off ;se apaga si está encendido
bsf porta,0
swapf saveSTATUS,0 ;Se recuperan los registros W y STATUS
movwf status ;Se recuperan los registros W y STATUS
swapf saveW,1 ;Se recuperan los registros W y STATUS
swapf saveW,0 ;Se recuperan los registros W y STATUS
bcf intcon,0 ;SE PIDE BORRAR EL FLAG DE LA INTERR., PERO NO FUNCA EN LA SIMULACIÓN MPLAB V.7.2, V7.4
retfie ;SE SALE DE LA INTERR, Y GIE DE INTCON NO VUELVE A 1, SE QUEDA EN 0.
led0_off
bcf porta,0
swapf saveSTATUS,0
movwf status
swapf saveW,1
swapf saveW,0
; movlw b'10001000'
; movwf intcon
bcf intcon,0
retfie
led1
; btfsc porta,1
; goto led1_off
; bsf porta,1
; bcf intcon,1
; retfie
led1_off
; bcf porta,1
; bcf intcon,1
; retfie
end