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