; PERSIANA: Al pulsar(marcha inicial RA1), si(paro RA0)
esta cerrado se
; pone en funcionamiento la ETAPA 0
;
;
LIST P=16F84
RADIX HEX
INCLUDE
"P16F84.INC"
; ----------------------------------------------------------------------
CONTA EQU 0x0C ;Contador.
;
----------------------------------------------------------------------
ORG 0 ; Inicio del programa en dir.0.
goto Inicio ; Salta a dir.5 indicada por ORG5.
ORG 5 ; Sobrepasa el vertor de
interrupcion.
; ----------------------------------------------------------------------
;Delay_2 es una rutina que realiza una temporizaci˘n de
20ms con objeto de
;eliminar el "efecto rebote" que poseen los
elementos electromecanicos.
;
;Si el PIC trabaja a una frecuencia de 4MHz, el TMR0
evoluciona cada microseg.
;Si se desea temporizar 20.000 us con un preescaler de
256, el Tmr0 deber
;contar 78 eventos (78*256=19.968). El valor equivale a
(0x4e) y, como el TMR0
;es ascendente, habra que cargar su complemento (0xB2).
Delay_2 bcf INTCON,T0IF ; Desconecta el flag (rebosa TMR0).
clrf TMR0 ; Borrado del TMR0.
movlw 0x4e ; Carga el valor
complementario(d78).
movwf TMR0 ; Carga el TMR0.
Delay_2a clrwdt ; Refresco del
WDT(perro guardian).
btfss INTCON,T0IF ; Rebosamiento del TMR0 ??.
goto Delay_2a ; Todavia no.
return ;
Ahora si.
Paro_pt
clrwdt ; Refresco de WDT (perro guardian).
clrf PORTB ; Salidas a 0.
bsf PORTB,0 ; Activar la salida 0, alarma.
btfss PORTA,0 ; Paro cerrado?,brinca.
goto Paro_pt ; Volver a paro hasta que se cierre.
clrf PORTB ; Salidas a cero.
return ;
Retorno.
Inicio bcf INTCON,T0IF ; Rebosa EL tmr0.
bsf STATUS,RP0 ; Banco 1.
movlw b'11010111' ; Valor a cargar OPTION.
movwf TMR0 ; TMR0 :256.
movlw 0x00 ; =0 SALIDAS.
movwf PORTB ; La Puerta B configurada como
SALIDA.
movlw 0xFF ; =1 ENTRADAS
movwf PORTA ; La Puerta A configurada como
ENTRADA.
bcf STATUS,RP0 ; Banco 0.
clrf PORTB ; Salidas a 0.
Etapa_0
clrwdt ;
Refrescar el WDT (perro guardian).
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,1 ; Mi=1?,brinca.
goto Etapa_0 ; Marcha sin pulsar?,ir a Etapa_0.
call Delay_2 ; Temporizaci˘n anti-rebote.
bsf PORTB,0
; Activar la salida 0 (alarma de paro).
Baja clrwdt ; Refrescar el wdt (perro guardian).
btfss PORTA,3
; A=1?, brinca
goto Etapa_1
; A sin pulsar?,ir a Etapa_1.
bsf PORTB,2
; Activar la salida 2 (Motor baja).
goto Baja ; Ir a Baja.
Etapa_1
clrwdt ;
Refrescar el WDT (perro guardian).
clrf PORTB ; Salidas a 0.
btfss
PORTA,0 ; Paro
cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2 ; Marcha pulsada?,brinca.
goto Etapa_1 ; Marcha sin pulsar?,ir a Etapa_1.
call Delay_2 ; Temporizaci˘n anti-rebote.
movlw d'8' ; Mueve 8 al acumulador.
movwf CONTA ; Carga el contador con 8.
Espera bcf INTCON,T0IF ; Borra el flag.
clrf TMR0 ; Poner a 0 temporizador e
incrementar.
Explora
clrwdt ;
Refrescar el WDT (perro guardian).
btfss INTCON,T0IF ; TMR0 pasa de 255 a 0?,brinca.
goto Explora ; Si no paso a 0,va a Explora.
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2
; Marcha pulsada?,brinca.
goto Etapa_2
; Marcha sin pulsar?,ir a Etapa_2.
movf CONTA,W ; Mueve el contador al acumulador.
decf CONTA,F ; Decrementa 1 el contador,actualiza.
btfss STATUS,Z ; Z=1(contador=0),brinca.
goto Espera ; Si el contador no=0,va a Espera.
goto Etapa_3
; Ir a Etapa_3.
Etapa_2
clrwdt ;
Refrescar el WDT (perro guardian).
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
bsf PORTB,3 ; Activar la salida 3 (Motor sube).
btfsc PORTA,4 ; B sin pulsar?,brinca.
goto Etapa_2 ; B pulsado?,ir a la Etapa_2.
call Delay_2 ; Temporizaci˘n anti-rebote.
clrf PORTB ; Salidas a 0.
goto Etapa_5 ; Ir a Etapa_5
Etapa_3
clrwdt ;
Refrescar el WDT (perro guardian).
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
bsf PORTB,3 ; Activar la salida 3 (Motor sube).
btfss PORTA,4 ; B pulsado?,brinca.
goto Etapa_5 ; B sin pulsar?,ir a Etapa_5.
call Delay_2 ; Temporizaci˘n anti-rebote.
btfsc PORTA,2 ; Marcha sin pulsar?,brinca.
goto Etapa_3 ; Sensor sin activar?,ir a Etapa_3.
Etapa_4
clrwdt ; Refrescar el WDT (perro
guardian).
clrf PORTB ; Salidas a 0.
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2 ; Marcha pulsada?,brinca.
goto Etapa_4 ; Marcha sin pulsar?,ir a Etapa_4.
goto Etapa_3 ; Ir a Etapa_3.
Etapa_5
clrwdt ;
Refrescar el WDT (perro guardian).
clrf PORTB ; Salidas a 0.
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2 ; Marcha pulsada?,brinca.
goto Etapa_5 ; Marcha sin pulsar?,ir a Etapa_5.
Etapa_6
clrwdt ;
Refrescar el WDT (perro guardian).
clrf PORTB ; Salidas a 0.
btfss
PORTA,0 ; Paro
cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2 ; Marcha pulsada?,brinca.
goto Etapa_1 ; Marcha sin pulsar?,ir a Etapa_1.
call Delay_2 ; Temporizaci˘n anti-rebote.
movlw d'8' ; Mueve 8 al acumulador.
movwf CONTA ; Carga el contador con 8.
Espera1 bcf INTCON,T0IF ; Borra el flag.
clrf TMR0 ; Poner a 0 temporizador e
incrementar.
Explora1 clrwdt ; Refrescar el WDT
(perro guardian).
btfss INTCON,T0IF ; TMR0 pasa de 255 a 0?,brinca.
goto Explora1 ; Si no paso a 0,va a Explora.
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2
; Marcha pulsada?,brinca.
goto Etapa_7
; Marcha sin pulsar?,ir a Etapa_7.
movf CONTA,W ; Mueve el contador al acumulador.
decf CONTA,F ; Decrementa 1 el contador,actualiza.
btfss STATUS,Z ; Z=1(contador=0),brinca.
goto Espera1 ; Si el contador no=0,va a Espera.
goto Etapa_8
; Ir a Etapa_8.
Etapa_7
clrwdt ;
Refrescar el WDT (perro guardian).
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
bsf PORTB,2 ; Activar la salida 2 (Motor baja).
btfsc PORTA,3 ; A sin pulsar?,brinca.
goto Etapa_7 ; A pulsado?,ir a la Etapa_7.
call Delay_2 ; Temporizaci˘n anti-rebote.
clrf PORTB ; Salidas a 0.
goto Etapa_0 ; Ir a Etapa_0.
Etapa_8
clrwdt ;
Refrescar el WDT (perro guardian).
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
bsf PORTB,2 ; Activar la salida 2 (Motor baja).
btfss PORTA,3 ; A pulsado?,brinca.
goto Etapa_0 ; A sin pulsar?,ir a Etapa_0.
call Delay_2 ; Temporizaci˘n anti-rebote.
btfsc PORTA,2 ; Marcha sin pulsar?,brinca.
goto Etapa_8 ; Sensor sin activar?,ir a Etapa_8.
Etapa_9
clrwdt ;
Refrescar el WDT (perro guardian).
clrf PORTB ; Salidas a 0.
btfss PORTA,0 ; Paro cerrado?,brinca.
call Paro_pt ; Llamada a la subrutina de paro.
btfss PORTA,2 ; Marcha pulsada?,brinca.
goto Etapa_9 ; Marcha sin pulsar?,ir a Etapa_9.
goto Etapa_8 ; Ir a Etapa_8.
END ; Fin del
programa.