Tengo que entregar un trabajo ma;ana, simulando un ascensor. Tengo todo el codigo, pero estoy teniendo inconvenientes con una interrupcion por rb0.
Al presionar el pulsador del rb0, en la maqueta se abriran las puertas del ascensor y se detendra el movimiento del motor, hasta que se cierre y reanude todo el programa comunmente.
El programa cuenta con 3 pulsador, 1 por cada piso a utilizar, contando planta baja. Y otro pulsador que es el de la interrupcion en rb0, para la puerta como explique.
Les dejo el codigo de la interrupcion para ver si pueden ver en que esta fallando, y mas abajo el codigo completo, por si necesitan mas detalles del programa. Muchas gracias.
;ESPACIO EN MEMORIA
org 0x00
goto Inicio
org 0x04
goto Interrupciones
;CONFIGURACION DE INTERRUPCIONES
Interrupciones bcf INTCON,GIE ;DESACTIVO INTERRUPCIONES GLOBALES
bcf INTCON,INTF ;DESACTIVO INTERRUPCIONES POR RB0
bsf PORTB,1 ;DETIENE EL MOTOR
Detener btfss PORTB,0 ;VERIFICA PUERTA
goto Fin_inter ;SI NO ESTA ABIERTA FIN DE INTERRUPCION
goto Detener ;SI ESTA ABIERTA DETIENE EL MOTOR
Fin_inter bsf INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
retfie ;RETORNO
CODIGO COMPLETO
#include <P16F628A.INC>
list p=16f628a
__config 3f10
Contador1 equ 0x22 ;VARIABLES PARA RETARDO
Contador2 equ 0x23
;ESPACIO EN MEMORIA
org 0x00
goto Inicio
org 0x04
goto Interrupciones
;CONFIGURACION DE INTERRUPCIONES
Interrupciones bcf INTCON,GIE ;DESACTIVO INTERRUPCIONES GLOBALES
bcf INTCON,INTF ;DESACTIVO INTERRUPCIONES POR RB0
bsf PORTB,1 ;DETIENE EL MOTOR
Detener btfss PORTB,0 ;VERIFICA PUERTA
goto Fin_inter ;SI NO ESTA ABIERTA FIN DE INTERRUPCION
goto Detener ;SI ESTA ABIERTA DETIENE EL MOTOR
Fin_inter bsf INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
retfie ;RETORNO
;INICIO DE PROGRAMA
Inicio bcf STATUS,5 ;CAMBIO A BANCO 0
bsf INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
bsf INTCON,INTF ;ACTIVA INTERRUPCION POR RB0
movlw 0x07 ;ELIMINA COMPARADORES
movwf CMCON
bsf STATUS,5 ;CAMBIO A BANCO 1
bcf OPTION_REG,7 ;ACTIVO PULL-UPS INTERNOS
bsf OPTION_REG,6 ;SE ACTIVA DE SUBIDA
movlw B'11110001'
movwf TRISB ;RB1, RB2 Y RB3 COMO SALIDA. DEMAS COMO ENTRADA
movlw B'11111111'
movwf TRISA ;PORTA COMO ENTRADA
bcf STATUS,5 ;CAMBIO A BANCO 0
;clrf PORTA
;clrf PORTB
bcf PORTB,1 ;ACTIVO MOTOR
bsf PORTB,2 ;BAJA HASTA QUE ESTE EN PLANTA BAJA
btfss PORTA,0 ;PREGUNTA SI ESTA EN PLANTA BAJA
goto $-.1 ;LOOP HASTA QUE ESTE EN PLANTA BAJA
Verificacion clrf PORTB
bsf PORTB,1 ;PARO EL MOTOR
btfss PORTB,6 ;VERIFICA SI SE PULSA EL BOTON DEL SEGUNDO PISO
goto Verificacion2 ;SINO, SIGUIENTE VERIFICACION
call delay ;SI ESTA PULSADO, LLAMA A RETARDO
btfsc PORTB,6 ;VERIFICA NUEVAMENTE SI EL BOTON AL SEGUNDO PISO ESTA PULSADO
call ir_a_piso2 ;SI ESTA PULSADO, A SUBRUTINA PISO2
Verificacion2 btfss PORTB,5 ;VERIFICA SI ESTA PULSADO EL BOTON DEL PRIMER PISO
goto Verificacion3 ;SINO, SIGUIENTE VERIFICACION
call delay ;SI ESTA PULSADO, LLAMA A RETARDO
btfsc PORTB,5 ;VERIFICA NUEVAMENTE SI EL BOTON AL PRIMER PISO ESTA PULSADO
call ir_a_piso1 ;SI ESTA PULSADO, A SUBRUTINA PISO1
Verificacion3 btfss PORTB,4 ;VERIFICA SI SE PULSA EL BOTON DE PLANTA BAJA
goto Verificacion ;SINO, VUELVE RETORNA AL INICIO DEL BUCLE
call delay ;SI ESTA PULSADO, LLAMA A RETARDO
btfsc PORTB,4 ;VERIFICA NUEVAMENTE SI EL BOTON A PLANTA BAJA ESTA PULSADO
call ir_a_pb ;SI ESTA PULSADO, A SUBRUTINA PB
goto Verificacion ;VUELVE AL LOOP
;SUBRUTINA A PISO2
ir_a_piso2 btfsc PORTA,2 ;VERIFICA SI SE ENCUENTRA EN EL SEGUNDO PISO
goto Fin ;SI ESTA EN ESE PISO, TERMINA EL PROCESO
btfss PORTA,0 ;VERIFICA SI ESTA EN PLANTA BAJA
btfsc PORTA,1 ;VERIFICA SI ESTA EN EL PRIMER PISO
call Subir ;LLAMA A SUBRUTINA SUBIR
btfss PORTA,2 ;VERIFICA SI ESTA EN EL SEGUNDO PISO
goto ir_a_piso2 ;SI NO LLEGO AL SEGUNDO PISO SIGUE SUBIENDO
Fin return ;VUELVE CUANDO ESTE EN PLANTA BAJA
;SUBRUTINA A PISO1
ir_a_piso1 btfsc PORTA,1 ;VERIFICA SI ESTA EN EL PRIMER PISO
goto Fin2 ;SI ESTA EN ESE PISO, TERMINA EL PROCESO
btfss PORTA,0 ;VERIFICA SI ESTA EN PLANTA BAJA
goto Condi ;SI NO ESTA VA A LA OTRA CONDICION
call Subir ;SI ESTA, LLAMA A SUBRUTINA PARA SUBIR
goto Fin2
Condi btfsc PORTA,2 ;VERIFICA SI ESTA EN EL SEGUNDO PISO
call Bajar ;SI ESTA, LLAMA A SUBRUTINA PARA BAJAR
Fin2 btfss PORTA,1 ;VERIFICA SI ESTA EN EL PRIMER PISO
goto ir_a_piso1 ;SINO ESTA EN EL PRIMER PISO, LOOP
return ;SI ESTA EN PRIMER PISO, VUELVE
;SUBRUTINA A PB
ir_a_pb btfsc PORTA,0 ;VERIFICA SI ESTA EN PLANTA BAJA
goto Fin3 ;SI ESTA EN ESE PISO, TERMINA EL PROCESO
btfss PORTA,2 ;VERIFICA SI ESTA EN EL SEGUNDO PISO
btfsc PORTA,1 ;SINO, VERIFICA SI ESTA EN EL PRIMER PISO
call Bajar ;SI ESTA EN ALGUNO DE ESOS PISO, LLAMA A SUBRUTINA PARA BAJAR
btfss PORTA,0 ;VERIFICA SI ESTA EN PLANTA BAJA
goto ir_a_pb ;SI NO ESTA EN PB, LOOP
Fin3 return ;SI ESTA EN PB, RETORNA
;SUBRUTINA PARA SUBIR
Subir bcf PORTB,1 ;ENCIENDE EL MOTOR
bcf PORTB,2 ;MOTOR PARA SUBIR
return
;SUBRUTINA PARA BAJAR
Bajar bcf PORTB,1 ;ENCIENDE EL MOTOR
bsf PORTB,2 ;MOTOR PARA BAJAR
return
;SUBRUTINA DE RETARDO
delay movlw .100
movwf Contador1
loop movlw .110
movwf Contador2
loop2 nop
nop
nop
nop
nop
nop
decfsz Contador2,f
goto loop2
decfsz Contador1,f
goto loop
return
;TERMINA EL PROGRAMA
end