; PERSIANA: Al pulsar(marcha inicial RA1), si(paro RA0) esta cerrado se

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