Proyecto seca ropas

buenas, hace como una semana vengo tratando de revivir un viejo seca ropas que tenia, y ya que no pude conseguir un reemplazo para su temporizador (de los mecánicos esos), entonces decidí darle algún uso a unos 16f84a que tenia tirados por ahí, mi problema es el siguiente, programe en ASM simule en proteus y de mil maravillas todo funcionando como se debe, pero al pasar a probar al protoboard, posteriormente a la placa, no funca como se debe, explico como va la mano, primero verifico si la puerta esta abierta, si no espera a que se pulse el boton de inicio, y de ahi empieza a girar el motor 5 minutos en un sentido y 5 5 en otro, con la resistencia calefactora encendida, todo lo manejo con triacs, si durante el proceso se abre la puerta se produce una interrupcion (por RB0/INT, flanco de bajada), y se enciende una lampara dentro del tambor, de ahi espera a que se presione el boton de inicio para continuar donde se quedo el programa apagando antes la lampara, el problema es que a la primera interrrupcion todo bien presiono la inicio y devuelve el port b como estaba, pero a partir de la segunda interrupcion ya no me devuelve el port b a su estado de trabajo, no se si me explico, aqui les dejo el codigo, acostumbro poner muchos comentarios asi que no creo que se pierdan, toda la info que siempre uso la saco de este foro pero a este drama si que no le encuentro la vuelta...
Código:
	__CONFIG _CP_OFF & _WDT_OFF  &_PWRTE_ON & _XT_OSC
	LIST	P=16F84A
	INCLUDE<P16F84A.INC>
	CBLOCK 0X0C
	CONTADOR1	
	CONTADOR2
	CONTADOR3
	GUARDA_W
	GUARDA_STATUS
	GUARDA_PORTB
	GUARDA_CONTADOR3
	ENDC
#DEFINE	INTERRUMPO	PORTB,0
#DEFINE START		PORTB,1
#DEFINE	RESISTENCIA	PORTB,3
#DEFINE	SENTIDO1	PORTB,4
#DEFINE	SENTIDO2	PORTB,5
#DEFINE	LAMPARA		PORTB,6


	ORG		0
	goto	INICIO
	
	ORG		4
	goto	INTERRUPCION
INTERRUPCION
	movwf	GUARDA_W			;guarda w
	swapf	STATUS,W			;guarda STATUS
	movf	PORTB,W				;guarda el contenido del puerto B
	movwf	GUARDA_PORTB		
	movf	CAONTADOR3,W
	movwf	GUARDA_CONTADOR3
	bcf		STATUS,RP0			;para asegurar que se trabaja en el banco 0
	clrf	PORTB
	movlw	b\'01000001\'			;para todo el sistema Y ENCIENDE lampara
	movwf	PORTB
	btfsc	INTERRUMPO			;pregunta si realmente la interrupcion fue causada por el usuario
	goto	REESTABLECER		;no. vuelve a reestablecer el puerto B y todos los registros
	call	RETARDO_20ms		;si fue alguna señal extraña espera que se estabilice
	btfsc	INTERRUMPO			;pregunta si sigue el pedido de interrupcion
	goto	REESTABLECER		;no reestablece
	
	
INTERRUPCION0	
	btfss	INTERRUMPO			;comprueba si la puerta esta CERRADA
	goto	INTERRUPCION0
	call	RETARDO_20ms		;espera que se estabilice los niveles de tension
	btfss	INTERRUMPO			;comprueba si es un rebote
	goto	INTERRUPCION0		;era un rebote, vuuelve a leer
	btfsc	START				;espera que se pulse boton de inicio
	goto	INTERRUPCION0		;para volver al estado anterior y continuar tarea
	call	RETARDO_20ms		;Espera que se estabilice el pulsador
	btfsc	START				;comprueba si es un rebote
	goto	INTERRUPCION0		;era un rebote vuelve a leer
	
APAGA_LAMPARA
	bCf		LAMPARA	
	
REESTABLECER
	movf	GUARDA_PORTB,W		;restaura el contenido del puerto B
	movwf	PORTB
	swapf	GUARDA_STATUS,W		;restaura STATUS
	movwf	STATUS
	swapf	GUARDA_W,F			;restaura w
	swapf	GUARDA_W,W
	bcf		INTCON,INTF			;limpia el flag de reconocimiento de interrupcion	
	retfie						;retorna y rehabilita la interruupcion  
	

INICIO
	bsf		STATUS,RP0			;acceso al banco 1
	movlw	b\'00000011\'			;portb como salida excepto RB0, RB1 
	movwf	TRISB
	clrf	TRISA				;todo el puerto A como salida para evitar dramas
	bcf		OPTION_REG,NOT_RBPU	;habilita las resistencias pull-up del puerto B
	bcf		OPTION_REG,INTEDG	;Interrupcion por RB0 por flanco de bajada, cero logico en RB0 
	movlw	b\'10010000\'
	movwf	INTCON				;HABILITA LA INTERRUPCION INT Y LA GENERAL
	bcf		STATUS,RP0			;acceso al banco 0
	movlw	b\'11111111\'			;todas las ineas del puerto A en alto
	movwf	PORTA
	bsf     PORTB,2
	bsf		PORTB,7
	
PRINCIPAL
	movlw	0xD
	movwf	CONTADOR1			;asigna el valor 13 al registro CONTADOR1 Y 2 al CONTADOR2
	movlw	0x2
	movwf	CONTADOR2
	movlw	0x03
	movwf	CONTADOR3

PUERTA_ABIERTA
	btfsc	INTERRUMPO 			;verifica si la puerta esta abierta, de ser asi,se enciende la lampara, hasta que esta se cierre
	goto	PUERTA_CERRADA
	bsf		LAMPARA
	
PUERTA_CERRADA
	btfss	INTERRUMPO
	goto	PUERTA_ABIERTA
	bcf		LAMPARA
		
EMPIEZA
	btfsc	START				;espera que se pulse el boton de inico
	goto	EMPIEZA				;si no se pulsa, vuelve a leer
		
ESPERADEJEPULSAR
	btfss	START
	goto	ESPERADEJEPULSAR

GIRO_CALIENTE
	bsf		RESISTENCIA			;nivel logico alto a RB3, enciende resistencia calefactora			
	bsf		SENTIDO1			;nivel logico alto a RB4, enciende motor en un sentido por 5minutos
	call	RETARDO_5min
	bcf		SENTIDO1			;apaga motor por 3segundos
	call	RETARDO_3s

GIRO1_CALIENTE
	bsf		SENTIDO2			;nivel logico alto a RB5, enciende motor en el otro sentido por 5minutos
	call	RETARDO_5min
	bcf		SENTIDO2			;apaga motor, nivel logico bajo a RB5
	call	RETARDO_3s
	decfSZ	CONTADOR1,1
	goto	GIRO_CALIENTE
	
GIRO_FRIO
	bcf		RESISTENCIA			;nivel logico bajo a RB3, apaga resistencia calefactora			
	bsf		SENTIDO1			;nivel logico alto a RB4, enciende motor en un sentido por 5minutos
	call	RETARDO_5min
	bcf		SENTIDO1			;apaga motor por 3segundos
	call	RETARDO_3s
GIRO1_FRIO
	bsf		SENTIDO2			;nivel logico alto a RB5, enciende motor en el otro sentido por 5minutos
	call	RETARDO_5min
	bcf		SENTIDO2			;Apaga motor, cero a RB5
	call	RETARDO_3s
	decfsz	CONTADOR2,1
	goto	GIRO_FRIO
	
FIN_PROCESO
	bsf		LAMPARA
	call	RETARDO_250ms
	bcf		LAMPARA
	call	RETARDO_250ms
	decfsz	CONTADOR3
	goto	FIN_PROCESO
		
RE_INICIA
	bcf		LAMPARA
	btfsc	START
	goto	RE_INICIA
	call	RETARDO_20ms
	btfsc	START
	goto	RE_INICIA
	bsf		LAMPARA
	call	RETARDO_1s
	btfsc	START
	goto	RE_INICIA
	call	RETARDO_20ms
	btfsc	START
	goto	RE_INICIA
	bcf		LAMPARA
	call	RETARDO_250ms
	bsf		LAMPARA
	call	RETARDO_250ms
	bcf		LAMPARA

DEJA_DE_PULSAR
	btfss	START
 	goto	DEJA_DE_PULSAR
	goto	PRINCIPAL
	
	INCLUDE<RETARDOS.INC>
	
	END

dscarte que sea problema de la fuente (creo) por que probe con una fuente de pc, y nada, al micro lo trate como un ic como debe ser con su correspondiente capcacitor de desacople de 100nf, al programa le estaria haciendo falta unas subrutinas contra el rebote de los pulsadores, pero las (muchas) primeras veces que probe si las puse... bueno creo que me explique lo mejor que pude..jaja desde ya muchas gracias a los que me hechen una mano.... ...
 
Última edición:
hola! Que tal? Gracias a ambos por responder, ya hice funcionar el proyecto, el error estaba en que tenia que asegurar de trabajar en el banco 0 poniendo el bit rp0 de status a cero, ANTES, de guardar el estado del port B, ya que al producirse una interrupcion no se sabe exactamente en que banco se trabaja, bueno pues asi lo solucione, gracias a ambos, igual cuando llegue a mi casa subo los esquemas, porq a cualquiera le va servir de ejemplo para controlar motores ac... Saludos!
 
Atrás
Arriba