; -----------------------------------------------------------------------
; Plantilla generada por Piklab
    #include <p16f88.inc>

; -----------------------------------------------------------------------
; Bits de configuración: adapte los parámetros a su necesidad... sisi, apague TODO menos el timer de encendido que no se para que sirve... 
    __CONFIG _CONFIG1, _WDT_OFF & _PWRTE_ON & _INTRC_IO & _MCLR_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF
    __CONFIG _CONFIG2, _FCMEN_OFF & _IESO_OFF

; Variables
RP0	equ	0x005
;--- Salidas ---
si	equ	0x0	;Sirena interna (a relay via transistor)
se	equ	0x1	;Sirena externa (idem)
led	equ	0x2	;Led activada/desactivada (directo a masa onboard)
;--- Entradas ---
T	equ	0x3	;Tamper, instantanea
Z1	equ	0x4	;Zona 1, temporiza 30 seg (en realidad un poco mas por rutinas de testeo de otras zonas)
Z2	equ	0x5	;Zona 2, instantanea
Z3	equ	0x6	;Atencion, hace sonar beeps en la sirena interna cuando se rompe la seguridad perimetral (barreras laser)(desactivada por ahora)
L	equ	0x7	;Señal del teclado: 0 activa, 1 desactiva
d1	equ	0x020	;<<<< Variables para retardados
d2	equ	0x021
d3	equ	0x022
d4	equ	0x023
d5	equ	0x024
d6	equ	0x025
d7	equ	0x026	;>>>>

STARTUP CODE 0x000

	bsf	STATUS,RP0		
	MOVLW 	b'01110110'		;Oscilador de 4 MHz
	MOVWF 	OSCCON		
X	BTFSS	OSCCON,2	;Preguntando si ya se estabilizó
	GOTO	X		;el cristal interno a 4 MHz

  	bcf	STATUS,RP0 
	CLRF 	 PORTA 
	CLRF	PORTB
	bsf	STATUS,RP0	;Desactivando Comparadores
	MOVLW      07h 		;
	MOVWF      CMCON	;
	CLRF 	 0x09B 	
	movlw	b'11111000'	;5 salidas, 3 entradas
	movwf	TRISB		; al portb
	movlw	00h
	movwf	TRISA		;porta no se usa, seteado todo a salidas
	bcf	STATUS,RP0	;Aquí regresamos al banco 0

PROG CODE
desactivada
	bcf	PORTB,si	;Apaga las sirenas
	bcf	PORTB,se	;^^^^^ ^^^ ^^^^^^^
	bcf	PORTB,led	; y el led
	btfsc	PORTB,L		;Se queda forever
	goto	$-1		;esperando ser activada
				;cuando se activa sigue asi...
activada
	bsf	PORTB,led	;Enciende el led
	call	estado		;Pregunta si se desactivo...
	call	tZ1		;Testea si se abrio la zona 1 y actua en consecuencia 
	call	tZ2		;Testea si se abrio la zona 2 y actua en consecuencia
;	call	tZ3		;Testea si se abrio la zona 3 y actua en consecuencia (desactivada hasta tener barreras laser :D )
	call	tT		;Testea si se abrio algun sensor tamper y actua en consecuencia
	goto	activada	;y queda haciendo esto por siempre (fatal error: luego de un minuto salta a suena)

estado
	btfsc	PORTB,L		;Si L=1
	goto	desactivada	;desactiva
	return
tZ1
	btfss	PORTB,Z1	;Si Z1=0
	goto	entrando	;entro alguien por la puerta
	return
tZ2
	btfss	PORTB,Z2	;Si Z2=0
	goto	suena		;entraron por la ventana (al estilo juez) sona la sirena
	return
tZ3
	btfss	PORTB,Z3	;Si Z3=0
	goto	alerta		;Alguien anda en el patio... despertate nenee
	return
tT
	btfss	PORTB,T		;Si T=0
	goto	suena		;Me estan desarmando los sensoress... sonaa
	return
	
entrando			;si salta Zona1, loopea 30seg para ingresar codigo de desactivacion... sino suena
	movlw	0x11		;setea el delay
	movwf	d1
	movlw	0x66
	movwf	d2
	movlw	0x42
	movwf	d3		;a 30 seg
entrando_del			;hace el delay de un poco mas de 30seg por chekeo de otras zonas instantaneas
	call	estado		;se fija si ya la desactivaste
	call	tZ2		;o si alguien entro a lo politico
	call	tT		;o si se la dan de locos desarmando sensores... 
;	call	beeps		;hace unos beeps en la sirena interna para alertar (desactivado, falta depurar)
	decfsz	d1, f		;<<<< al fin el retardo
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	entrando_del
	goto	suena		;>>>> si despues de 30ytantos segundos no la desactivaste... suena

beeps				;no lo comento mucho porque falta retocar un poco para hacerlo andar
	movlw	0x03	;<<<<
	movwf	d4
	movlw	0x25	;500 ms
	movwf	d5
	movlw	0x02
	movwf	d6	;>>>>
	bsf	PORTB,si
	decfsz	d4, f
	goto	$+2
	decfsz	d5, f
	goto	$+2
	decfsz	d6, f
	goto	$-5
	bcf	PORTB,si
	return
suena
	movlw	0x54	;<<<<<< Este es facil, setea un retardo de 5min
	movwf	d1
	movlw	0xA1
	movwf	d2
	movlw	0xFD
	movwf	d3
	movlw	0x02
	movwf	d4	;>>>>>>> 300 seg

	bsf	PORTB,si	;prende las dos
	bsf	PORTB,se	;sirenas
sonando				;y dale que va...
	call	estado		;pero se fija si la desactivas mientras suena
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	$+2
	decfsz	d4, f
	goto	sonando		;al final son 5 min y chirola por el call a estado
	
	bcf	PORTB,si	;se aburre de sonar
	bcf	PORTB,se	;y apaga las sirenas :(
	goto	activada	;pero sigue activada la guacha


alerta			;Esta es la rutina de Alerta que se debe ejecutar al romperse la Zona3, pero como esta desconectada, no hay que darle bola.. jamas se debería ejecutar
	movlw	0x03	;<<<< repite 5
	movwf	d7	;>>>>   veces
alerta_del
	movlw	0x03	;<<<<
	movwf	d1
	movlw	0x35	;500 ms
	movwf	d2
	movlw	0x02
	movwf	d3	;>>>>
	movlw	0x11	;<<<<
	movwf	d4
	movlw	0x45	;2s
	movwf	d5
	movlw	0x05
	movwf	d6	;>>>>

	bsf	PORTB,si
d500ms	
	call	estado
	call	tZ1
	call	tZ2
	call	tT
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	d500ms
	bcf	PORTB,si
d2s
	call	estado
	call	tZ1
	call	tZ2
	call	tT
	decfsz	d4, f
	goto	$+2
	decfsz	d5, f
	goto	$+2
	decfsz	d6, f
	goto	d2s
	
	decfsz	d7, f
	goto	alerta_del
	goto	activada
	

END		;Se fini... tan simple y no anda ...
