Mejorar Senpir para la versión 2.0

Iniciado por Meta, 17 Enero 2014, 20:20 PM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:



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.



;
;         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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/