Mejorar Senpir par versión 2.0

Hola:

Senpir_proyecto.jpeg


Hace tiempo hice un mini proyecto cuando estaba aprendiendo a programar asm del PIC16F84A.

Debo mejorarlo muy bien antes de fabricar uno. Por eso es bueno hacer una lista de lo que se va hacer. En mi caso es este.


- Condensador de 100 nF entre los pines de allimentación del PIC.

- Usar un IC 40106 para estabilizar las señales de entrada del PIC sobre la LDR.

- Controlar los tiempos con Timer dentro del PIC.

El problema de arriba que usa los tiempos con retardos y el PIC queda esclavo, si cambio la configuración de los tiempos no puedo hasta que el tiempo iniciado termine, la única manera es resetear el PIC.

La solución es usar el Timer 0 con interrupciones. Es lo que debo hacer. Para aquellos que tienen muy al día de manejar bien el timer a su antojo con interrupciones puedes modificar el código principal que es este.

senpir04.jpg

Código:
;
;         Programa de un interruptor con sensor movimiento y de luz solar: Si es de noche,
;        mientras el sensor de movimiento (PIR) detecta la presencia de alguien 
;        entorno a 6 metros, activa o se    pone a 1 la entrada RA3 y la lámpara
;        se enciende. En caso de que sea de día detectado por la LDR, nunca se enciende 
;        la lámpara. En la otra opción, cuando la LDR detecta la noche o falta de Sol,
;        la lámpara se enciende, cuando sea de día, la lámpara se apaga.
;        En los microinterruptores puedes activar el tiempo que tarda en apagarse la 
;        lámpara después de ser detectado por el sensor Pir y de noche de un máximo
;        una hora y treinta y cinco minutos.
;
;¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

; DATOS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬
    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    3FF1
    __idlocs    0001                ; ID, versión del programa.

    CBLOCK  0x0C
    ENDC

#DEFINE        Led_verde    PORTA,0        ; Led verde indica opción LDR seleccionada.
#DEFINE        Led_rojo    PORTA,1        ; Led rojo indica opción PIR seleccionada.
#DEFINE        Led_azul    PORTA,2        ; Led azul indica que el Relé está activado.
#DEFINE        lámpara        PORTA,3        ; lámpara.
#DEFINE        PIR            PORTB,1        ; Sensor PIR.
#DEFINE        LDR            PORTB,3        ; Sensor LDR.
#DEFINE        Int_RB4        PORTB,4        ; Interruptor RB4.
#DEFINE        Int_RB5        PORTB,5        ; Interruptor RB5.
#DEFINE        Int_RB6        PORTB,6        ; Interruptor RB6.
#DEFINE        Int_RB7        PORTB,7        ; Interruptor RB7.

; EEPROM ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

    ORG        0x2100                    ; Comienza en la direccoón 0 de la memoria EERPOM.
                                    ; Datos nombre del archivo, versión del programa
                                    ; y dirección del correo electrónico.
    DE    "Senpir.asm. v1.0. 25-03-2009. metaconta@gmail.com", 0x00
                                
; CÓDIGOS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

    ORG     0
Inicio
    bsf        STATUS,RP0                ; Accede al Banco 1.
    clrf    PORTA                    ; Puerto A como salidas.
    movlw    b'11111111'                ; Las 8 líneas del puerto B se configura como entradas.
    movwf    PORTB
    bcf        STATUS,RP0                ; Accede al Banco 0.
    clrf    PORTA                    ; Supuestamente la lámpara y Led apagadas.    

Opcion_principal
    btfss    Int_RB4                    ; ¿Bit 4 del PORTB es "1"? ¿Int_RB4 activado?
    goto    Opcion_LDR                ; No, activa modo LDR.
    goto    Opcion_PIR                ; Sí, activa modo PIR.

; INTERRUPTOR CREPUSCULAR LDR ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

Opcion_LDR
    bcf        Led_rojo                ; Se apaga el Led rojo.                            
    bsf        Led_verde                ; Enciende Led verde indicando modo LDR activado.
    btfss    LDR                        ; ¿La entrada LDR es igual a 1?, ¿LDR en oscuridad?
    goto    Apaga_la_lámpara        ; No, la LDR está iluminada por el Sol. La lámpara se apaga.
Enciende_la_lámpara
    call    Retardo_20_seg            ; Espera 20 segundos para confirmar la oscuridad.
    btfss    LDR                        ; ¿Entrada es igual a 1?, ¿LDR aún en oscuridad?
    goto    Opcion_principal        ; No, sale fuera.
    bsf        lámpara                    ; Sí, enciende la lámpara.
    bsf        Led_azul                ; Led_azul activo.
    goto    Opcion_principal
Apaga_la_lámpara
    call    Retardo_20_seg            ; Espera 20 segundos para confirmar la oscuridad.
    btfsc    LDR                        ; ¿Entrada es = 0?, ¿LDR sigue iluminada por luz del sol?
    goto    Opcion_principal        ; No, sale fuera.
    bcf        lámpara                    ; Sí, apaga lámpara.
    bcf        Led_azul                ; Led_azul indica que la lámpara está apagada.
    goto    Opcion_principal

; DETECTOR DE MOVIMIENTO ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

Opcion_PIR    
    bcf        Led_verde                ; Apaga el Led verde de aviso.
    bsf        Led_rojo                ; Enciende Led rojo avisando que está activado el modo PIR.
    btfss    LDR                        ; ¿La entrada LDR es igual a 1?, ¿LDR en oscuridad?
    goto    lámpara_OFF                ; No.
    btfss    PIR                        ; ¿La entrada PIR es igual a 1?, ¿PIR ha detectado presencia?
    goto    lámpara_OFF                ; No, no ha detectado presencia o movimiento.
lámpara_ON
    bsf        lámpara                    ; Sí, enciende la lámpara.
    bsf        Led_azul                ; Led_azul activo.
    btfss    Int_RB5                    ; ¿Bit 5 del PORTB es igual a 1?, ¿Activado el interruptor RB5?
    goto    RB6                        ; No, salta a la línea siguiente.
    call    Retardo_5_min            ; Tiempo lámpara encendida 5 minutos.
RB6
    btfss    Int_RB6                    ; ¿Bit 6 del PORTB es igual a 1?, ¿Activado el interruptor RB6?
    goto    RB7
    call    Retardo_30_min            ; Tiempo lámpara encendida 30 minutos.
RB7
    btfss    Int_RB7                    ; ¿Bit 7 del PORTB es igual a 1?, ¿Activado el interruptor RB7?
    goto    Opcion_principal
    call    Retardo_1_hora            ; Tiempo lámpara encendida 1 hora.
    goto    Opcion_principal
lámpara_OFF
    bcf        lámpara                ;     Apaga lámpara.
    bcf        Led_azul                ; Apaga Led_azul.
    goto    Opcion_principal

; SUBRUTINAS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

; Retardo de 20 segundos ................................................................
    cblock
    ret_00
    ret_01
    ret_02
    Nulo
    endc

Retardo_20_seg
            ;19999992 ciclos
    movlw    0xB5
    movwf    ret_00
    movlw    0x99
    movwf    ret_01
    movlw    0x2C
    movwf    ret_02
Retardo_20_seg_0
    decfsz    ret_00, f
    goto    $+2
    decfsz    ret_01, f
    goto    $+2
    decfsz    ret_02, f
    goto    Retardo_20_seg_0

            ;4 ciclos
    goto    $+1
    goto    $+1

            ;4 ciclos (incluyendo call)
    return

; Retardo de 5 minutos ..................................................................
    cblock
    ret_05
    ret_06
    ret_07
    ret_08
    endc

Retardo_5_min
            ;299999995 ciclos
    movlw    0x54
    movwf    ret_05
    movlw    0xA1
    movwf    ret_06
    movlw    0xFD
    movwf    ret_07
    movlw    0x02
    movwf    ret_08
Retardo_5_min_0
    decfsz    ret_05, f
    goto    $+2
    decfsz    ret_06, f
    goto    $+2
    decfsz    ret_07, f
    goto    $+2
    decfsz    ret_08, f
    goto    Retardo_5_min_0

            ;1 ciclo
    nop

            ;4 ciclos (incluyendo call)
    return

; Retardo de 30 minutos .................................................................
    cblock    
    ret_09
    ret_10
    ret_11
    ret_12
    endc

Retardo_30_min
            ;1799999989 ciclos
    movlw    0xFE
    movwf    ret_09
    movlw    0xC2
    movwf    ret_10
    movlw    0xEC
    movwf    ret_11
    movlw    0x0C
    movwf    ret_12
Retardo_30_min_0
    decfsz    ret_09, f
    goto    $+2
    decfsz    ret_10, f
    goto    $+2
    decfsz    ret_11, f
    goto    $+2
    decfsz    ret_12, f
    goto    Retardo_30_min_0

            ;7 ciclos
    goto    $+1
    goto    $+1
    goto    $+1
    nop

            ;4 ciclos (incluyendo call)
    return

; Retardo de 1 hora .....................................................................
    cblock
    ret_13
    ret_14
    ret_15
    ret_16
    endc

Retardo_1_hora
            ;3599999989 ciclos
    movlw    0xFE
    movwf    ret_13
    movlw    0x84
    movwf    ret_14
    movlw    0xD8
    movwf    ret_15
    movlw    0x18
    movwf    ret_16
Retardo_1_hora_0
    decfsz    ret_13, f
    goto    $+2
    decfsz    ret_14, f
    goto    $+2
    decfsz    ret_15, f
    goto    $+2
    decfsz    ret_16, f
    goto    Retardo_1_hora_0

            ;7 ciclos
    goto    $+1
    goto    $+1
    goto    $+1
    nop

            ;4 ciclos (incluyendo call)
    return

    END

El proyecto pueden verlo en el enlace de abajo.
http://electronica-pic.blogspot.com.es/2009/11/interruptor-crepuscular-y-de-movimiento.html

Cualquier consejo, sugerencia o algún comentario para mejorarlo es bienvenido.
 
Atrás
Arriba