;PROGRAMA DEL SEGUNDO PIC
;HECHO POR BRUNO FASCENDINI, ARGENTINA
;DUDAS O SUGERENCIAS A: badpaperboy@hotmail.com o a brunodini@yahoo.com.ar


	list	p=16f84a
	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

#include <p16F84a.inc>

; EEPROM
		ORG 0x2100
		de "0" ; valor inicial, todas las luces apagadas y la sirena apagada

;STR= Registros especiales



;Definicion de los Pines

;PORTA,0: entrada sensor1
;PORTA,1: entrada sensor2
;PORTA,2: entrada sensor3
;PORTA,3: entrada sensor4
;PORTA,4: entrada sensor5
;PORTB,2: entrada sensor6
;PORTB,0: salida a la sirena
;PORTB,1: entrada seņal desde el otro PIC ;mientras reciba 5v la alarma se activara, si recibe 0 se desactivara el escanneo
;PORTB,3: luz sensor1
;PORTB,4: luz sensor2
;PORTB,5: luz sensor3
;PORTB,6: luz sensor4
;PORTB,7: luz sensor5

;el sensor6 no posee luz indicadora, pero igualmente activa la sirena si no recibe seņal. 
;es facil darse cuenta de cuando el sensor6 ha fallado ya que se escuchara la sirena,y no habra ninguna luz indicadora encendida

;


inicio_ram	EQU	0x0c
luzenc		EQU	inicio_ram+1    ;bit0: estado sensor 1  bit1: estado sensor 2 bit2:estado sensor 3 
					;bit3: estado sensor 4 bit4: estado sensor 5 bit 5: estado sensor 6 
					;bit7: estado sirena on/off
ret1		EQU	inicio_ram+2	;variable de retardo	
ret2		EQU	inicio_ram+3	;variable de retardo
ret3		EQU	inicio_ram+4	;variable de retardo
zon1		EQU	inicio_ram+5	;variable del sensor 1
zon2		EQU	inicio_ram+6	;variable del sensor 2
zon3		EQU	inicio_ram+7	;variable del sensor 3
zon4		EQU	inicio_ram+8	;variable del sensor 4
zon5		EQU	inicio_ram+9	;variable del sensor 5
zon6		EQU	inicio_ram+10	;variable del sensor 6
estadoal	EQU	inicio_ram+11	;flag, alarma desactivada o activada
retardo0	EQU	inicio_ram+12	;variable de retardo
retardo1	EQU	inicio_ram+13	;variable de retardo
retardo2	EQU	inicio_ram+14	;variable de retardo
tmpvar1		EQU	retardo2+1	;variable de retardo
tmpvar2		EQU	retardo2+2	;variable de retardo
sonarsir	EQU	retardo2+3	;flag, sonidos de la sirena


;no mas variables RAM


		org	0        ;el programa comienza aqui
		goto	inicio
		nop
		nop
		retfie

inicio		clrf	PORTA
		clrw
		movlw	b'00011111'
		tris	PORTA  ; PORTA todas entradas

		clrf	PORTB
		movlw	0x06   ; PORTB: bit 1 y 2 entradas, las demas salidas
		tris	PORTB
		
		call	leer  ;lee el ultimo estado de los sensores y la sirena desde la EEPROM a la RAM(luzenc)
		movwf	luzenc

		btfsc	luzenc,7
		call	alarmaon  ;la sirena estaba sonando antes del corte de energia, encender las luces
				  ;de las zonas violadas y hacer sonar la sirena

		call	reintodo
		call	retini



loop		btfss	estadoal,0  ;loop principal(se ejecuta infinitamente)
		goto	espera10seg ;me da 10 segundos(un poco mas en realidad)
			            ;para salir de mi casa antes de que comience a chequear los sensores

		btfss	PORTB,1
		goto	desactivada ;desactivar el escanneo de sensores, apagar luces y sirena

		btfss	sonarsir,0  ; ya se hizo sonar la seņal de alarma activada en la sirena?
		call	acsirena 

		bsf	sonarsir,0

sens1		btfss	PORTA,0  ;reviso si el sensor 1 esta OK
		goto	sonarsensor1

		movlw	0xff
		movwf	zon1


sens2		btfss	PORTA,1  ;reviso si el sensor 2 esta OK
		goto	sonarsensor2

		movlw	0xff
		movwf	zon2


sens3		btfss	PORTA,2	;reviso si el sensor 3 esta OK
		goto	sonarsensor3

		movlw	0xff
		movwf	zon3
		
sens4		btfss	PORTA,3	;reviso si el sensor 4 esta OK
		goto	sonarsensor4

		movlw	0xff
		movwf	zon4
				
sens5		btfss	PORTA,4	;reviso si el sensor 5 esta OK
		goto	sonarsensor5

		movlw	0xff
		movwf	zon5
		
sens6		btfss	PORTB,2	;reviso si el Sensor 6 esta OK
		goto	sonarsensor6

		movlw	0xff
		movwf	zon6

volveraloop	goto	loop


desactivada	bcf	estadoal,0
		btfss	luzenc,7
		goto	loop

		clrw
		movwf	luzenc	;luzenc = 00000000
		call	escribir

		bcf	PORTB,0  ; apago la sirena		
		bcf	PORTB,3	 ;apago todas las luces del tablero
		bcf	PORTB,4
		bcf	PORTB,5
		bcf	PORTB,6
		bcf	PORTB,7	
		call	reintodo

		bcf	sonarsir,0
		call	desacsirena
	
		goto	loop

;ddss		goto	desactivada

sonarsensor1	btfsc	luzenc,0
		goto	sonar1listo
		
		decfsz	zon1, F
		goto	sonar1listo
		bsf	luzenc,0
		bsf	luzenc,7
		call	escribir

		bsf	PORTB,0 ; hago sonar la sirena
		bsf	PORTB,3 ; enciendo la luz del sensor1

		movlw	0xff
		movwf	zon1

sonar1listo	goto	sens2

sonarsensor2	btfsc	luzenc,1
		goto	sonar2listo

		decfsz	zon2, F
		goto	sonar2listo
		bsf	luzenc,1
		bsf	luzenc,7
		call 	escribir

		bsf	PORTB,0	;hago sonar la sirena
		bsf	PORTB,4	;enciendo la luz del sensor2
		movlw	0xff
		movwf	zon2

sonar2listo	goto	sens3

sonarsensor3	btfsc	luzenc,2
		goto	sonar3listo

		decfsz	zon3, F
		goto	sonar3listo		

		bsf	luzenc,2
		bsf	luzenc,7
		call	escribir

		bsf	PORTB,0	;hago sonar la sirena
		bsf	PORTB,5	;enciendo la luz del sensor3
		movlw	0xff
		movwf	zon3

sonar3listo	goto	sens4

sonarsensor4	btfsc	luzenc,3
		goto	sonar4listo

		decfsz	zon4, F
		goto	sonar4listo

		bsf	luzenc,3
		bsf	luzenc,7
		call	escribir	
				

		bsf	PORTB,0	;hago sonar la sirena
		bsf	PORTB,6	;enciendo la luz del sensor4
		movlw	0xff
		movwf	zon4

sonar4listo	goto	sens5

sonarsensor5	btfsc	luzenc,4
		goto	sonar5listo

		decfsz	zon5, F
		goto	sonar5listo

		bsf	luzenc,4
		bsf	luzenc,7
		call	escribir

		bsf	PORTB,0
		bsf	PORTB,7	;enciendo la luz del sensor5
		movlw	0xff
		movwf	zon5

sonar5listo	goto	sens6



sonarsensor6	btfsc	luzenc,5
		goto	sonar6listo

		decfsz	zon6, F
		goto	sonar6listo

		bsf	luzenc,5
		bsf	luzenc,7
		call	escribir
				     ;no hay luz para este sensor
		bsf	PORTB,7
		movlw	0xff
		movwf	zon6

sonar6listo	goto	volveraloop


espera10seg	movlw	0xff         ;cargo los valores en las variables para generar el retardo(10 seg aprox)
		movwf	retardo0
		movwf	retardo1
		movlw	0x09
		movwf	retardo2

starting	btfss	PORTB,1      ;comienza el retardo
		goto	desactivada  ; se ha desactivado la alarma desde el otro PIC, salir de espera10seg y desactivar
		decfsz	retardo0, F
		goto	starting

		decfsz	retardo1, F
		goto	again1
		
		decfsz	retardo2, F
		goto	again2
		
		bsf	estadoal,0  ;bit indicador de que se ha activado la alarma
		goto	loop	    ;han pasado los 10 segundos, comenzar el escanneo de los sensores

again1		movlw	0xff
		movwf	retardo0
		goto	starting

again2		movlw	0xff
		movwf	retardo0
		movwf	retardo1
		goto	starting

;FUNCIONES:


escribir	clrf EEADR         ;escribe datos en la EEPROM interna

eep_1		movf	luzenc,W
		movwf	EEDATA
		;bcf INTCON, GIE
		bsf STATUS, RP0
		bcf	EECON1, EEIF
		bsf	EECON1, WREN
		movlw	0x55
		movwf	EECON2
		movlw	0xaa
		movwf	EECON2
		bsf	EECON1, WR

		; esperar a que finalice la escritura de datos
eep_2		bcf	STATUS, RP0
		;bsf	INTCON, GIE
		nop
		nop
		;bcf	INTCON, GIE
		bsf	STATUS, RP0
		btfss	EECON1, EEIF
		goto	eep_2
		bcf	STATUS, RP0
		;bsf	INTCON, GIE

		return

leer		clrf	EEADR     ;lee desde la EEPROM a la RAM(luzenc)
		bsf	STATUS,RP0
		bsf	EECON1,RD
		bcf	STATUS,RP0
		movf	EEDATA,W

		return

alarmaon	btfsc	luzenc,0  ;recupera las zonas violadas, enciende las luces correspondientes y enciende la sirena
		bsf	PORTB,3

		btfsc	luzenc,1
		bsf	PORTB,4

		btfsc	luzenc,2
		bsf	PORTB,5

		btfsc	luzenc,3
		bsf	PORTB,6

		btfsc	luzenc,4
		bsf	PORTB,7

		call	acsirena
		bsf	sonarsir,0

		bsf	PORTB,0

		return

reintodo	movlw	0xff   ;reinicia todas las variables
		movwf	zon1
		movwf	zon2
		movwf	zon3
		movwf	zon4
		movwf	zon5
		movwf	zon6
		
		return


retini		movlw	0xff  ;retardo inicial, este PIC debe esperar a que el primer PIC arranque, sino
		movwf	ret1  ; no funcionara el guardado del ultimo estado de la alarma
		movwf	ret2
		movlw	0x70
		movwf	ret3
dat1		decfsz	ret1, F
		goto	dat1

		decfsz	ret2, F
		goto	fft1

		decfsz	ret3, F
		goto	fft2

		goto	hht

fft1		movwf	ret1
		goto	dat1

fft2		movwf	ret1
		movwf	ret2
		goto	dat1

hht		return

acsirena	movlw	0xff     ;genera 1 sonido en la sirena, que indica que se ha activado la alarma
		bsf	PORTB,0

		movwf	tmpvar2
otavez2		movwf	tmpvar1

etique2		decfsz	tmpvar1, F
		goto	etique2
		
		decfsz	tmpvar2, F
		goto	otavez2

		bcf	PORTB,0
		
		movwf	tmpvar2
otavez3		movwf	tmpvar1

etique3		decfsz	tmpvar1, F
		goto	etique3
		
		decfsz	tmpvar2, F
		goto	otavez3

		return

desacsirena	movlw	0xff       ;genera 2 sonidos en la sirena, que indican que se ha desactivado la alarma
		bcf	PORTB,0

		movwf	tmpvar2
otavez4		movwf	tmpvar1

etique4		decfsz	tmpvar1, F
		goto	etique4
		
		decfsz	tmpvar2, F
		goto	otavez4

		bsf	PORTB,0
		
		movwf	tmpvar2
otavez5		movwf	tmpvar1

etique5		decfsz	tmpvar1, F
		goto	etique5
		
		decfsz	tmpvar2, F
		goto	otavez5

		bcf	PORTB,0

		movwf	tmpvar2
otavez6		movwf	tmpvar1

etique6		decfsz	tmpvar1, F
		goto	etique6
		
		decfsz	tmpvar2, F
		goto	otavez6

		bsf	PORTB,0

		movwf	tmpvar2
otavez7		movwf	tmpvar1

etique7		decfsz	tmpvar1, F
		goto	etique7
		
		decfsz	tmpvar2, F
		goto	otavez7

		bcf	PORTB,0

		return

		end