Problema con interrupción en PIC16F84A

Ir abajo

Problema con interrupción en PIC16F84A

Mensaje por pingui56 el Lun 11 Feb 2013 - 6:32

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

pingui56
Nuevo Usuario
Nuevo Usuario

Mensajes : 1
Fecha de inscripción : 11/02/2013

Volver arriba Ir abajo

Re: Problema con interrupción en PIC16F84A

Mensaje por fruano el Sáb 18 Mayo 2013 - 18:54

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.

fruano
Nuevo Usuario
Nuevo Usuario

Mensajes : 1
Fecha de inscripción : 18/05/2013

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.