Escrito originalmente por bAIthrO
Muchísimas gracias a los dos por intentar ayudarme con el problema. Creo que no me explicado del todo bien.
- Sé que el vector de interrupción desactiva las interrupciones y globales y con el retfie las vuelve a activar (GIE)
- Sé que antes del retfie es necesario borrar el flag de la interrupción correspondiente para que no entre continuamente al vector de interrupción.
Si la rutina de interrupción es sencilla, la cosa funciona perfectamente. Ejemplo
org 0x0004
bsf PORTC,2
bcf PIR1,RCIF
retfie
El programa principal llega hasta al bucle final y permanece a la espera de que llegue a la interrupcion. Cuando llega la interrupción, la ejecuta y vuelve al bucle hasta que no se de otra interrupcion.
Hasta aquí, bien. Mi problema es el siguiente:
Si hago la rutina de interrupción un poco más compleja, el programa principal no llega hasta el bucle final a la espera de la interrupcion. No sé por qué razón, salta directamente a la interrupción y se queda colgada.
Sé que es dificil de entender, pero no sé que puede pasar.
Org 0x0000
goto Inicio
Inicio
;------CONFIGURACIÓN DE LOS PUERTOS-------------
bcf STATUS,RP0 ; Banco 0
clrf PORTA ; Inicializa PUERTO A borrando latches de salida
bsf STATUS,RP0 ; Pasa al Banco 1.
movlw 0x06 ; Configura todos los pines del PUERTO A como digitales
movwf ADCON1
movlw 0x00 ; Puerto A como salidas
movwf TRISA
movlw 0x00
movwf TRISB ; Puerto B como salidas
movlw 0x80 ; Configuracion del PUERTO C (RX como entradas, TX,SD0,SCK,LED como salidas)
movwf TRISC
;-------CONFIGURACIÓN DE LOS REGISTROS USART-------
; Seguimos en el Banco 1
movlw 0x19 ; Valor decimal, segun tabla para trabajar SPBGR a 9.600 con 4 Mhz
movwf SPBRG ; BRGH a 9.600 baud
bsf TXSTA,BRGH ; Bit BRGH del registro TXSTA a 1 (modo alta velocidad)
bcf TXSTA,SYNC ; Bit SYNC a 0 (Modo Asíncrono)
bsf TXSTA,TXEN ; Habilitada transmision.
bcf STATUS,RP0 ; Se accede al banco 0
bsf RCSTA,SPEN ; Habilitado Puerto serie
bsf RCSTA,CREN ; Habilitada recepción (Recepcion continua)
;------ CONFIGURACION INTERRUPCIONES------------------------
bsf STATUS,RP0; Banco 1
bsf PIE1,RCIE; Habilita interrupcion de recepcion de USART
bcf STATUS,RP0; Banco 0
BSF INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
BSF INTCON,PEIE
Acabar NOP
NOP
NOP
NOP
NOP
NOP
goto Acabar ;Bucle infinito
END
Lo tienes asi como lo escribiste?? con un org 0x04 Y LUEGO un org 0x00??? si es asi es alli dond esta el problema, lo ideal seria:
Codigo:
org 0x00
goto inicio
org 0x04
rutina_interrupcion
...
...
retfie
inicio ...
...
...
end