;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#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
El "back up" de w y status, la linea logica sería: entro a interrupcion - almaceno w y status en auxiliares - trabajo en la interrupcion - cargo los registros originales con los aux - retfie?
Hola n-utz.no he mirado tu codigo.pero ten en cuenta que para borrar la interrupción por cambio de estado en portb.antes de su borrado hay que leer el puerto.
Por ejemplo:
MovF portb,w
bcf intcon,rbif
INTERRUPCION
bcf INTCON,GIE
movwf WWW ; Guardo el estado de los registros
swapf STATUS,W
movwf ESTADO
(AQUÍ TU RUTINA DE INTERRUPCIÓN)
swapf ESTADO,W ; Restauro el estado de los registros
movwf STATUS
swapf WWW,F
swapf WWW,W
bcf INTCON,RBIF ; Borro el flag de la interrupción
retfie