Problema con interrupción en PIC16F84A
2 participantes
Página 1 de 1.
Problema con interrupción en PIC16F84A
Hola amigos del foro..
Quiero interrumpir un programa mediante un cambio de estado en RB7, para lo cual configuro esta línea del micro como entrada.
Pero cuando hago un cambio de estado en RB7, el programa entra en la interrupción y se queda ahí en un bucle infinito. Es decir, llega a RETFIE, y en vez de volver al programa, regresa a ORG 4.
Reduje el programa todo lo posible para no causar dolores de cabeza y alguien pueda detectar la falla que tanto busco.
Tal vez a alguien ya le pasó. Saludos
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
goto Inicio
ORG 4
goto Decrementar
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
movlw b'00010000' ; 1 en el bit 5 de W
movwf TRISA ; RA4: ENTRADA
clrf TRISB ; RB0-RB6: SALIDAS
bsf TRISB,7 ; RB7: ENTRADA
movlw b'10001000' ;
movwf INTCON
movlw b'11101000' ; Configuracion del modulo TMR0
movwf OPTION_REG
bcf STATUS,RP0 ; Acceso al Banco 0.
goto Inicio
;***INTERRUPCION***
Decrementar
nop
nop
retfie
END ; Fin del programa
Quiero interrumpir un programa mediante un cambio de estado en RB7, para lo cual configuro esta línea del micro como entrada.
Pero cuando hago un cambio de estado en RB7, el programa entra en la interrupción y se queda ahí en un bucle infinito. Es decir, llega a RETFIE, y en vez de volver al programa, regresa a ORG 4.
Reduje el programa todo lo posible para no causar dolores de cabeza y alguien pueda detectar la falla que tanto busco.
Tal vez a alguien ya le pasó. Saludos
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
goto Inicio
ORG 4
goto Decrementar
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
movlw b'00010000' ; 1 en el bit 5 de W
movwf TRISA ; RA4: ENTRADA
clrf TRISB ; RB0-RB6: SALIDAS
bsf TRISB,7 ; RB7: ENTRADA
movlw b'10001000' ;
movwf INTCON
movlw b'11101000' ; Configuracion del modulo TMR0
movwf OPTION_REG
bcf STATUS,RP0 ; Acceso al Banco 0.
goto Inicio
;***INTERRUPCION***
Decrementar
nop
nop
retfie
END ; Fin del programa
pingui56- Nuevo Usuario
- Mensajes : 1
Fecha de inscripción : 11/02/2013
Re: Problema con interrupción en PIC16F84A
Hola.
El error es de los usuales. Para generar una entrada a la rutina de interrupcion, deberás tener permiso de interrupciones (GIE y RBIE) y el flag de la interrupcion permitida deberá estar puesto a 1.
Cuando se produce la interrupcion tienes las tres condiciones. Cuando entras en la interrupcion desaparece la condicion GIE. Cuando ejecutas retfie se reposiciona GIE.
Una de las caracteristicas de las interrupciones en el 16F84 al menos, es que los flags no se posicionan a 0 por sí mismos. Por lo tanto, cuando sales de tu interrupcion y repones GIE vuelves a tener las tres condiciones y vuelves a entrar en la rutina de interrupcion en un bucle sin fin. Como no tienes activado el watchdog seguirá así por los siglos de los siglos, o mientras aguante la alimentacion.
Lo que tienes que hacer es borrar el flag RBIF de la interrupcion de RB4/RB7 antes de ejecutar retfie. Esto lo puedes hacer con "bcf INTCON , RBIF" y todo arreglado.
Te aconsejo, si lees en Francés, que te leas el curso parte 1 del señor Bigonof (descargable en su web), es muy didactico. Si no lees en Francés, tendrás que esperar algunos dias haste que acabe la traducción que estoy haciendo al español y que pondré a disposicion de esa web.
Un saludo.
El error es de los usuales. Para generar una entrada a la rutina de interrupcion, deberás tener permiso de interrupciones (GIE y RBIE) y el flag de la interrupcion permitida deberá estar puesto a 1.
Cuando se produce la interrupcion tienes las tres condiciones. Cuando entras en la interrupcion desaparece la condicion GIE. Cuando ejecutas retfie se reposiciona GIE.
Una de las caracteristicas de las interrupciones en el 16F84 al menos, es que los flags no se posicionan a 0 por sí mismos. Por lo tanto, cuando sales de tu interrupcion y repones GIE vuelves a tener las tres condiciones y vuelves a entrar en la rutina de interrupcion en un bucle sin fin. Como no tienes activado el watchdog seguirá así por los siglos de los siglos, o mientras aguante la alimentacion.
Lo que tienes que hacer es borrar el flag RBIF de la interrupcion de RB4/RB7 antes de ejecutar retfie. Esto lo puedes hacer con "bcf INTCON , RBIF" y todo arreglado.
Te aconsejo, si lees en Francés, que te leas el curso parte 1 del señor Bigonof (descargable en su web), es muy didactico. Si no lees en Francés, tendrás que esperar algunos dias haste que acabe la traducción que estoy haciendo al español y que pondré a disposicion de esa web.
Un saludo.
fruano- Nuevo Usuario
- Mensajes : 1
Fecha de inscripción : 18/05/2013
Temas similares
» Libreria LCD 4Bit , para Pic16f
» Interrupcion de Timer1 SDCC con PIC18F2550
» SDCC PIC16F84A
» Programar pic16f84a
» ktechlab y simulación de una interrupción en 16f84
» Interrupcion de Timer1 SDCC con PIC18F2550
» SDCC PIC16F84A
» Programar pic16f84a
» ktechlab y simulación de una interrupción en 16f84
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.