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...
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.... ...
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: