;¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬Senpir.asm¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬
;
; PROGRAMA: "Senpir". Luz por detector de movimiento y crepuscular.
; AUTOR: Ángel Acaymo M. G.
; E-MAIL; metaconta@gmail.com
; PROCESADOR: PIC16F88
; FRECUENCIA: 4 MHz
; VERSIÓN: 1.00
; DESCRIPCIÓN:
;
; 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.
;
;¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬
; _CP_OFF: Protección de código DESACTIVADO.
; _DEBUG_OFF: Debug en circuito DESACTIVADO.
; _WRT_PROTECT_OFF: Protección a escritura en memoria de programa DESACTIVADO.
; _CPD_OFF: Protección de código de datos DESACTIVADO.
; _LVP_OFF: Programación en baja tensión DESACTIVADO.
; _BODEN_OFF: Reset por Brown-out DESACTIVADO.
; _MCLRE_ON: Reset por pin externo ACTIVADO.
; _PWRTE_ON: Retraso al reset ACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _XT_OSC: Oscilador externo del tipo XT.
;---------------------------------------------------------------------------------------
; _IESO_OFF: Modo de intercambio de externo a interno DESACTIVADO.
; _FCMEN_OFF: Monitor de CLK DESACTIVADO.
; DATOS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬
LIST P=16F88
INCLUDE <P16F88.INC>
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
__idlocs 0001 ; ID, versión del programa.
CBLOCK 0x20
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 direcció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