TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: the_nitro en 30 de Mayo de 2004, 20:52:00
-
Hola de nuevo a todos, os cuento mi nuevo problemilla.
Tengo un codigo para 16f84 que, en un principio, funciona todo bien, incluso ejecuta cdo se produce una interupcion, pero luego no hace nada.
Explico mejor: El programa es un bucle a la espera de una interrupcion externa, una vez producida esta ejecuta lo conveniente, y vuelve al bucle.
Pues bien, alimento el PIC, todo ok, produzco la interrupcion externa, se ejecuta el proceso correctamente. Vuelvo a interrumpir... y nada. No hace nada. Si hago un MCLR y vuelvo a interumpir, vuelve a funcionar.
WDT está desconectado, antes de salir de la interrpcion me aseguro de limpiar el flag que la produjo y eso. Se supone que la habilliacion global de interrupciones se vuelve a activar automaticamente cdo sale de la RTI no? De todas maneras tambien he probado a volver a habilitarla yo antes de salir.
¿A que se puede deber esto? ¿Se quedará colgado o es que no sale bien de la rutina? Al ensamblar no me produce ni warnigs ni mensaje alguno.
Gracias y un saludo a todos 
-
coloque o codigo aqui!
-
Restauras las interrupciones generales al final del handler de interrupción???
bsf INTCON , GIE

cuando entras en el handler, tendrás que desactivar las interrupciones
bcf INTCON,GIE
pero al salir, hay que ponerlas a funcionar de nuevo...
-
No es necesario Abago, ni desactivar al entrar, ni activar al salir, es muy listo y lo hace él solito.
Pega el código the_nitro.
Un saludo
-
Joder Chavales, que velocidad!!
Muchas Gracias por el apoyo mostrado, de verdad, vaya comunidad que sóis. Lo flipo! Me acosté al poner el hilo, y cdo me levanto..... 4 respuestas!! Gracias.
ORG 0
GOTO INICIO
ORG 4
BcF INTCON,GIE
BTFSC INTCON,INTF ;COMPROBACIÓN DE INTERRUPCION INT
GOTO RTI_INT
BCF INTCON,INTF ;BORRA FLAG INT
BCF INTCON,GIE
RETFIE
RTI_INT:
MOVLW B"00001000" ;BIT 1 --> CMD1
CALL CMD
RETURN
;-------------------------------------------------------------------------------------------
CMD: ;Envia el comando cargado en el Acumulador (W) [0 CMD0, 1 CMD1, 2 CMD2....]
CLRF PTR ;Inicializamos puntero despl.
MOVWF CMD_AUX ;Guardamos el Comando pasado
NX_CHR MOVF PTR,W ;Puntero despl. a W
BTFSC CMD_AUX,0
CALL CMD0
GOTO X1
X1 BTFSC CMD_AUX,1
CALL CMD1
GOTO X2
X2 BTFSC CMD_AUX,2
CALL CMD2
GOTO X3
X3 BTFSC CMD_AUX,3
CALL CMD3
GOTO X4
X4 BTFSC CMD_AUX,4
CALL CMD4
GOTO X5
X5 BTFSC CMD_AUX,5
CALL CMD5
GOTO X6
X6 BTFSC CMD_AUX,6
CALL CMD6
GOTO X7
X7 BTFSC CMD_AUX,7
CALL CMD7
ADDLW 0 ;Si W=0 --> Z=1
BTFSC STATUS,2 ;Z=0 ?
RETURN ;Si -->Ultimo chr del comando
MOVWF DATO ;De W lo pasamos a DATO
CALL TXDATO ;No -->Quedan chrs por tx en el comando
INCF PTR,F ;Incrementamos PTR despl.
GOTO NX_CHR
;
; Tablas de Comandos
;
CMD0 ................
CMD1 ................
..........
.............
;***************************************************
INICIO
;
;PUERTOS
BANK1
BCF TX
BCF 01h,6 ;[OPTIONREG][INTEDG]
BANK0
;PROGRAMACION DE LA INTERRUPCION INT(RB0)
BSF INTCON,INTE ;HABILITA INTERRUPCIÓN INT
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALMENTE
;
;ESPERA LA INTERRUPCION
GOTO $
;
END
Hay va ese código
-
Vamos con el ensamblador, a ver si me acuerdo.
El programa de atención a la interrupción (salvo algunas líneas) está en:
RTI_INT:
MOVLW B"00001000" ;BIT 1 --> CMD1
CALL CMD
RETURN
Ese último RETURN no debiera ser un RETFIE?
Luego otra cosilla desde dentro de la interrupción haces varios CALL, cuentalos para que no sean más de 8, de lo contrario se desbordará la pila.
No es necesario que deshabilites a GIE y a INTE al entrar en la interrupción, se hace automáticamente para que cuando se está ejecutando una interrupción no pueda llegar otra.
Un saludo
-
Hola..
efectivamente amigo.. para que se vuelvan a habilitar las interrupciones tienes que poner retfie.. y no un return
saludos
-
Hola de nuevo!
Gracias por detectar el fallo!!! Yo cdo he leido lo del RETFIE hubiera a postado la mano entera a que lo habia puesto, y de hecho está puesto,pero.... mmmmm entonces he visto el fallo!! que en RTI_INT hago un GOTO, no un CALL, cuando mi intencion era hacer una llamada, no un salto.
Muchas gracias por hacerme ver el fallo
, si vierais la disputa que he tenido hoy en la faucltad con el tema, jejejej y precisamente con el RETFIE, jejejej veis! yo sabia que estaba puesto, otra cosa es k estuviera bien puesto jajajaj.
Bueno eso, muchas gracias de nuevo y un gran saludo a todos !
PD-> Revisaré el nº de llamadas, vayamos a kedarnos sin pila 
PD2--> Pila revisada, maxima profundidad de pila = 4 niveles, Fuera de peligro
Asias por el consejo