No me funcionan las Interrupciones

Tengo este codigo que lo hice en Mplab Vr 6 hace años y ahora lo necesito lo compile nuevamente en el Mplab Vr 8 y no funciona no me entra el programa a las INTs, solo tengo activa la INT de cambio de estado en RB4-RB7, pensando que fuera el MPLAB, instale nuevamente la vieja version y tampoco funciona, la verdad ya no se que mas buscarle, me ayudan? uso solo las entradas RB4 y RB5 y tengo varias salidas, la idea es una secuencia especial dependiendo de los 4 posibles estados de RB4-RB5, y un led monitor de estado, gracias

Código:
;**********************************************************************

	list      p=16F628A           ; list directive to define processor
	#include <p16F628A.inc>       ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file


	__CONFIG _CP_ON & _DATA_CP_ON & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC   & _MCLRE_ON & _LVP_OFF

;********REG USO GENERAL********************************************

ON 			EQU	0
STAR 		EQU	1
GUN 		EQU	3
OK 			EQU	4
										

				
CHANGE				EQU		20
PDel0 				EQU		21		
PDel1 				EQU		22
w_temp				EQU		23	
status_temp			EQU		24		
TEMPO				EQU		25
TEMPO_INTEN			EQU		26
					


;**********************************************************************
RESET		ORG		0x00			; processor reset vector
			goto    MAIN              ; go to beginning of program


;********************ATENCION A LAS INTERRUPCIONES*****************************
			ORG		0x04			; interrupt vector location
			GOTO	INT
INT			movwf   w_temp            ; save off current W register contents
			movf	STATUS,w          ; move status register into W register
			movwf	status_temp       ; save off contents of STATUS register

		

			BTFSC	INTCON,0			; SE ACTIVO POR CAMBIO EN ENTRADAS?
			GOTO	CAMBIO
			GOTO	SAL_INT				;NINGUNO DE LOS DOS

CAMBIO		BSF		CHANGE,0	
			GOTO	SAL_INT

SAL_INT		movf    status_temp,w     ; retrieve copy of STATUS register
			movwf	STATUS            ; restore pre-isr STATUS register contents
			swapf   w_temp,f
			swapf   w_temp,w          ; restore pre-isr W register contents
			BCF		INTCON,0		  ;BORRO LA BANDERA

			RETFIE                   ; return from interrupt
			
;*********************************************************************************	

	
MAIN		CLRF	INTCON			;DESHABILITO TODAS LAS INTs
			BSF		STATUS,5
			BCF		STATUS,6		;BANCO 1
			MOVLW	0XFF
			MOVWF	TRISB			;PORTB   RB4-RB7 =ENTRADAS     
			CLRF	TRISA			;PORTA   SALIDAS
			CLRF	PIE1
			BSF 	OPTION_REG,7	;DESHAB PULLUP
			BCF		STATUS,5		;BANCO 0
			
			CLRF    PIR1
			MOVLW	0X07
			MOVWF	CMCON			;DESCONECTO LOS COMPARADORES DE TENSION DEL PORTA
			CLRF	PORTA			;BORRO TODAS LAS SALIDAS
			CLRF    CHANGE
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA			
			CALL	DEMORA			;ESPERO 1 SEGUNDO A NORMALIZAR TODO
			CALL	ACCIONAR
			MOVLW	0X88
			MOVWF   INTCON		;ACTIVO LAS INTs RB4-RB7

LOOP		BCF		PORTA,OK
			CALL 	DEMORA			;LED ESTADO OK PARAPADEANDO
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			BSF		PORTA,OK
			BTFSC	CHANGE,0
			GOTO	ACCIONAR	
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			BTFSC	CHANGE,0
			GOTO	ACCIONAR
			GOTO	LOOP

;*************************************************************************************************
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%SUBRUTINA ACCIONAR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ACCIONAR	BCF		CHANGE,0
			SWAPF	PORTB,0			;CARGO ENTRADAS Y COLOCO EN BITS DE MENOR PESO
			ANDLW	0X03			;BORRO LOS 6 BITS DE MAYOR PESO

			ADDWF	PCL,1
			GOTO	OFF_TOTAL	
			GOTO	ARRANCAR
			GOTO	LOOP
			GOTO	ON_REPOSO
;*****************************************	
OFF_TOTAL   CLRF	PORTA				;APAGO TODO FIN DE TODO
			GOTO	LOOP
;*****************************************
ARRANCAR	MOVLW	.5
			MOVWF	TEMPO_INTEN
LOOP_INI	BSF		PORTA,ON			;ON PLANTA
			BSF		PORTA,STAR				;INICIO ARRANQUE 2.5  SEGUNDOS
			BSF		PORTA,GUN
			MOVLW	.15
			MOVWF	TEMPO
LOOP_ST1	CALL	DEMORA				
			DECFSZ	TEMPO,1
			GOTO	LOOP_ST1
			BCF		PORTA,STAR				;APAGO ARRANQUE Y ESPERO 1SEG
			BCF		PORTA,GUN
			MOVLW	.15
			MOVWF	TEMPO
LOOP_ST2	CALL	DEMORA
			DECFSZ	TEMPO,1
			GOTO	LOOP_ST2
			DECFSZ	TEMPO_INTEN,1
			GOTO	LOOP_INI
			BCF		PORTA,ON					;TERMINARON LOS 5 INTENTOS, EXISTE FALLO DE ARRANQUE APAGO TODO Y DOY ALARMA
			GOTO	FALL_STAR

FALL_STAR	BCF		INTCON,7			;DESHABILITO TODAS LAS INTS
			BCF     PORTA,OK
			CALL 	DEMORA				;LED INDICANDO FALLO DE ARRANQUE
			BSF		PORTA,OK
			CALL	DEMORA
			GOTO	FALL_STAR			

;***************************************************************************************************************************		
ON_REPOSO	BSF		PORTA,ON
			BCF		PORTA,STAR
			BCF 	PORTA,GUN
			GOTO	LOOP					
;***************************************************************************************************************************
;***************************************************************************************************************************


;******************************RUTINA DE DEMORA DE 200mSEG************************************						
DEMORA  	movlw     	.156      	; 1 set numero de repeticion  (B)
        	movwf     	PDel0     	; 1 |
PLoop1  	movlw     	.213      	; 1 set numero de repeticion  (A)
        	movwf     	PDel1     	; 1 |
PLoop2  	clrwdt              	; 1 clear watchdog
PDelL1  	goto 		PDelL2         ; 2 ciclos delay
PDelL2  
        	decfsz    	PDel1, 1  	; 1 + (1) es el tiempo 0  ? (A)
        	goto      	PLoop2    	; 2 no, loop
        	decfsz    	PDel0,  1 	; 1 + (1) es el tiempo 0  ? (B)
        	goto      	PLoop1    	; 2 no, loop
PDelL3  	goto 		PDelL4         ; 2 ciclos delay
PDelL4  	clrwdt              	; 1 ciclo delay
        	return              	; 2+2 Fin.	
;***********************************************************************************************
			END                     ; directive 'end of program'
 
Hola, fdesergio. Encantado de poder ayudarte.

La verdad es que me ha costado percatarme. He detectado dos problemas en tu código:

1- Las interrupciones no te funcionan porque no las habilitas. Fíjate bien que, justo antes de dar el valor 0x88 a INTCON haces una llamada a ACCIONAR. Pues bien, en algún momento decidiste que ACCIONAR ya no iba a retornar con RETURN sino con GOTO, y ahí está el problema, porque ya no retorna al punto de partida, sino a LOOP, justo después de la inicialización de INTCON.

2- El otro problema ya lo has visto. Menos mal que sólo llamas una vez con CALL a ACCIONAR. De lo contrario, como ya sabes, desbordarías el STACK.

Espero haberte ayudado. Chauuuuuuuuuuu :D
 
Gracias Melghost, si de verdad que eran unos detalles muy exquisitos, anoche de verdad no pude y por eso decidi pedir ayuda, gracias por la atencion y respuestas, ya funciona esperemos a ver no salgan mas "gallitos" un abrazo, chauuuuuuuuuuu
 
Ahhhhhhhh no puede ser, ahora lo paso a un PIC16F84A y las INTs nuevamente no funcionan, ME VOY A VOLVER LOCOOOOOOOO, el codigo queda asi donde estara la falla???

Código:
;**********************************************************************


	list      p=16F84A            ; list directive to define processor
	#include <p16F84A.inc>        ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.





;********REG USO GENERAL********************************************

w_temp			EQU		0C
status_temp		EQU		0D
PDel0 			EQU		0E
PDel1 			EQU		0F
ESTADO 			EQU		10
TEMPO_INTEN		EQU		11
TEMPO			EQU		12
PCLATH_TEMP		EQU		13

ON				EQU		0
STAR			EQU		1
GUN				EQU		3
OK				EQU		4
CHG				EQU		0


reset		org			0
			goto		MAIN				;vaya al inicio
			org			4					;aqui viene la Interrupcion
			goto		INT					;vaya a atender las  INT
;********************ATENCION A LAS INTERRUPCIONES*****************************

INT			movwf   w_temp            ; save off current W register contents
			movf	STATUS,w          ; move status register into W register
			movwf	status_temp       ; save off contents of STATUS register

			BTFSC	INTCON,0
			GOTO	MARCAR				;SE ACTIVO LA INT RB4-RB7?
			GOTO	SAL_INT	
			
MARCAR		BSF		ESTADO,CHG			;MARCO CAMBIO

SAL_INT		movf    status_temp,w     ; retrieve copy of STATUS register
			movwf	STATUS            ; restore pre-isr STATUS register contents
			swapf   w_temp,f
			swapf   w_temp,w          ; restore pre-isr W register contents
			BCF		INTCON,0			;BORRO FLAG	
			retfie                    ; return from interrupt

;**********************FIN ATENCION DE LAS INTERRUPCIONES**************************************************	

MAIN		BSF		STATUS,5		;BANCO 1
			MOVLW	0X00
			MOVWF	TRISA			;ENTRADAS
			MOVLW	0XFF
			MOVWF	TRISB			;SALIDAS
			MOVLW	0X80
			MOVWF	OPTION_REG		;SIN RBPULL
			BCF		STATUS,5		;BANCO 0
			

			
			CLRF	PORTA
			BCF		ESTADO,CHG
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA			;ESPERO 600 mS PARA ESTABILIZAR VCC
			
			MOVLW	0X88
			MOVWF	INTCON			;HABILI INTs PORTB

			GOTO	ACCIONAR
			
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%SUBRUTINA ACCIONAR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ACCIONAR	SWAPF	PORTB,0			;CARGO IN Y COLOCO EN BITS DE MENOR PESO
			ANDLW	0X03			;BORRO LOS 6 BITS DE MAYOR PESO

			ADDWF	PCL,1
			GOTO	OFF_TOTAL	
			GOTO	ARRANCAR
			GOTO	NO_OPERE
			GOTO	ON_REPOSO
;*****************************************	
OFF_TOTAL   BCF		PORTA,ON				;APAGO TODO FIN DE TODO
			BCF		PORTA,STAR
			BCF		PORTA,GUN
			BCF		ESTADO,CHG
			GOTO	LOOP
;*****************************************
ARRANCAR	MOVLW	.5
			MOVWF	TEMPO_INTEN
LOOP_INI	BSF		PORTA,ON				;ENCIENDO PLANTA
			BSF		PORTA,STAR				;INICIO ARRANQUE 2.5  SEGUNDOS
			BSF		PORTA,GUN
			MOVLW	.15
			MOVWF	TEMPO
LOOP_ST1	CALL	DEMORA				
			DECFSZ	TEMPO,1
			GOTO	LOOP_ST1
			BCF		PORTA,STAR				;APAGO ARRANQUE Y ESPERO 1SEG
			BCF		PORTA,GUN
			MOVLW	.15
			MOVWF	TEMPO
LOOP_ST2	CALL	DEMORA
			DECFSZ	TEMPO,1
			GOTO	LOOP_ST2
			DECFSZ	TEMPO_INTEN,1
			GOTO	LOOP_INI
			BCF		PORTA,ON					;TERMINARON LOS 5 INTENTOS, EXISTE FALLO DE ARRANQUE APAGO TODO Y DOY ALARMA
			BCF		ESTADO,CHG
			GOTO	FALL_STAR

FALL_STAR	CLRF	INTCON
			BCF     PORTA,OK
			CALL 	DEMORA				;LED INDICANDO FALLO DE ARRANQUE
			BSF		PORTA,OK
			CALL	DEMORA
			GOTO	FALL_STAR	 	
;***************************************************************************************************************************
NO_OPERE	BCF		PORTA,ON
			BCF		PORTA,STAR
			BCF 	PORTA,GUN
			BCF		ESTADO,CHG
			GOTO	LOOP
;***************************************************************************************************************************		
ON_REPOSO	BSF		PORTA,ON
			BCF		PORTA,STAR
			BCF 	PORTA,GUN
			BCF		ESTADO,CHG
			GOTO	LOOP
;***************************************************************************************************************************

LOOP		BCF		PORTA,OK
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA
			BSF		PORTA,OK
			BTFSC	ESTADO,CHG
			CALL	DEMORA
			CALL	DEMORA
			CALL	DEMORA	
			CALL	DEMORA
			CALL	DEMORA		
			BTFSC	ESTADO,CHG
			GOTO	LOOP			
			
;***************************************************************************************************************************

	
;-----------------------RUTINA DE DEMORA 200mSEG------------------------------------
DEMORA 		movlw     .156      ; 1 set numero de repeticion  (B)
        	movwf     PDel0     ; 1 |
PLoop1  	movlw     .213      ; 1 set numero de repeticion  (A)
        	movwf     PDel1     ; 1 |
PLoop2  	clrwdt              ; 1 clear watchdog
PDelL1  	goto PDelL2         ; 2 ciclos delay
PDelL2  
        	decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        	goto      PLoop2    ; 2 no, loop
        	decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        	goto      PLoop1    ; 2 no, loop
PDelL3  	goto PDelL4         ; 2 ciclos delay
PDelL4  	clrwdt              ; 1 ciclo delay
        	return              ; 2+2 Fin.
;-----------------------------------------------------------------------------------			
			



			END                     ; directive 'end of program'
 
Última edición:
Jaaaa, ja, ja, pobre... :)

Sí, es lo que tiene Microchip. Sus microcontroladores son muy completos, pero también son muy enrevesados. Parece que están improvisados, sin un estudio serio sobre cómo tendrían que estar estructurados. Y además, de uno a otro hay cambios y el datasheet de uno no te vale para el otro.

Bueno, pues no veo el fallo de las interrupciones. Seguiré mirándolo.

Lo que sí veo es una llamada CALL a una "subrutina" que no lo es: ACCIONAR. Está dos veces en el bucle LOOP. Probablemente ahí no te ha fallado todavía porque no te han funcionado las interrupciones ;)

Y, bueno, no tiene importancia, pero en MAIN están intercambiados los comentarios de las entradas y las salidas.

A ver si encuentro algo y te lo digo
 
Última edición:
Veo que metes 0x88 en INTCON eso es en hexadecimal, que es igual a 0x10001000. Pones el GIE y el RBIE: RB Port Change Interrupt Enable bit. No el Timer0.

Un saludo
 
Veo que metes 0x88 en INTCON eso es en hexadecimal, que es igual a 0x10001000. Pones el GIE y el RBIE: RB Port Change Interrupt Enable bit. No el Timer0.

Un saludo

Ah si ese era un comentario de un programa anterior, y se me quedo ahi, sorry (reparado) , segun estuve investigando mi problema al parecer es que la INT del PORTB RB4-RB7 es una INT un poco rara y se DEBE leer si o si el Puerto B dentro de la rutina de las INTs para evitar problemas (cosa que en este programa no hago) si no se hace, al salir de la INT se genera nuevamente la MISMA INT asi no se haya producido realmente, estoy en eso, hare cambios y cuento un poco , chauuuuuuu
 
Última edición:
Bueno definitivamente era eso, Se debe LEER el PORTB SI o SI dentro de la rutina de atencion a las Interrupciones si no se hace, al salir se activa la misma INT aunque se haya borrado el FLAG correspondiente (Intcon, 0) y se queda en un bucle, el problema hasta hoy no lo habia notado es mas no sabia que existia esa posibilidad porque siempre que use la INT por cambio de estado en RB4-RB7 su atencion la hacia en la misma rutina de interrupciones, en este programa en particular NO LO HAGO, lo hago por fuera de la rutina de interrupciones por ende en la rutina NO LEO el PORTB NUNCA y ese es el problema, SOLUCION cambiar mi codigo y leer el puerto y hacer lo que hacia afuera en la Rutina de interrupciones, chauuuuuuuuuuuuu
 
Pues está bien saberlo. Te habrás vuelto loco hasta encontrarlo. Yo, ya te digo, he revisado tu código y no he encontrado el problema.

Como decía, a cada PIC le pica una pata distinta.
 
Si yo hace tiempo programo en ASM, y hasta el dia de hoy me vengo a conocer eso, quiza por la forma en que en este programa atiendo las INTs fue que llegue a ello, fueron 3 dias trasnochando haciendo una y otra cosa pero bueno he aprendido algo nuevo, ahora ya buscando en la RED hay varias info sobre el tema o mejor dicho comentarios que dicen como hay que hacerlo, gracias por la atencion Melghost, chauuuuuuuuuuu
 
Atrás
Arriba