;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;	ALARMA PARA TABLERO DE BOMBAS MULTIPLES
;								   
;   alarma de 15 entradas, reseteable
;   en el arranque o despues de un reset el programa verifica las entradas
;	las que no estan altas en ese momento las desecha y no las toma en cuenta 
;	para la alarma sonora.
;	si la entrada se reestablece, no pasa nada, solo si se pulsa nuevamente reset
;  	vuelve a entrar en la rutina.
;     
;_________________________________________________________________ 
;	Recordar que con: 0 se designa al registro W  y con	   
;                         1 se designa al archivo f		   
;								   

;__________________________________________________________________

     
      

      
      PROCESSOR             16F873A          

	LIST P=PIC16F873A
	RADIX 	HEX
   	#INCLUDE <P16F873A.INC>


;**************** Oscilador (Reloj) utilizado ****************
;
;  cristal 2Mhz  con 2 useg por instrucción,  _XT_OSC
;
;	
;	Definicion de igualdades

CONSULTA	equ		20h						;registros donde se guarda la info de puerto despues de reset
CONSULTB	equ		21h						;MEMORIA empieza en 0CH
CONSULTC	equ		22h
porta		equ		05h
portb		equ		06h
portc		equ		07h											
STATUS		equ		03h
R_ContA		equ		24h
R_ContB		equ		25h
R_ContC		equ		26h
led_aviso	equ		27h
TMR_OPT		equ		01h
INTCON  	equ 	0Bh  					; Direccion del registro INTCON
conta   	equ 	28h 					 ; Direccion de registro de proposito general
	
											;DEFINIMOS LOS BANCOS
#define	bank1	bsf STATUS,5				;Macro para abreviar el BANCO 1
#define	bank0	bcf STATUS,5				;Macro para abreviar el BANCO 0

	Org		0x00							;Posicion 0 de la Memoria de Programa (apuntador)
	goto	INICIO							;Va a la etiqueta INICIO
	Org		0x04
	goto	interrup						;Viene cuando hay una interrupcion.
							

;-----------------------------------------------------------------------------------------------

INICIO		
		bank1						;Ir a pagina 1 para ajustar los puertos
		movlw 	0x06 
		movwf 	ADCON1 				; Configura el puerto A como E/S digitales. 					
		MOVLW 	0x3c				;Cargar '00111100' en W             
        MOVWF 	05h					;define como entrada ra5, ra4, ra3, ra2.  ra0 y ra1 son salidas.
        MOVLW	0xff				;Cargar '11111111' en W       
        MOVWF 	06h					;define como entrada el puerto B, 
		MOVLW	0xff				;Cargar '11111111' en W       
        MOVWF 	07h					;define como entrada el puerto c, 
        bank0						; Ir a pagina0 para seguir programa
		
		goto	reset



reset	
		bcf		porta,1
		bcf		porta,0				;limpia el buzzer
		call	Retardo_100ms
		movf	porta,0 			;despues del reset se leen las entradas(el cero es para guardar en W)
		movwf	CONSULTA			;y se registran las que esten bajas 
		movf	portb,0				; en CONSULTA Y CONSULTB y CONSULTC
		movwf	CONSULTB
		movf	portc,0
		movwf	CONSULTC
	

		movlw 	b'00000000' 
        movwf 	INTCON  
		clrf    TMR_OPT          	; deshabilitar interrupciones   
		bcf		porta,1

		bcf		STATUS,2
		movlw	0x3c
		subwf	CONSULTA,0         	;si alguna de las entradas del portA esta baja empieza la rutina del led_on
		btfss	STATUS,2
		goto	led_on
		bcf		STATUS,2

		movlw	0xff
		subwf	CONSULTB,0         	;si alguna de las entradas del portA esta baja empieza la rutina del led aviso
		btfss	STATUS,2
		goto	led_on
		bcf		STATUS,2

		movlw	0xff
		subwf	CONSULTC,0         	;si alguna de las entradas del portA esta baja empieza la rutina del led aviso
		btfss	STATUS,2
		goto	led_on
		bcf		STATUS,2
		goto	test
	

test	bcf		STATUS,2				
		btfss	porta,2					;lee el pin 2 del puerto A, si esta bajo llama a una rutina de verificación
		call	inundacion				;si esta alto verifica los demas pines
		btfss	porta,3
		call	faseT
		btfss	porta,4
		call	faseS
		btfss	porta,5
		call	faseR

		btfss	portb,0
		call	trafo24
		btfss	portb,1
		call	termicag
		btfss	portb,2
		call	termica6
		btfss	portb,3
		call	termica5
		btfss	portb,4
		call	termica4
		btfss	portb,5
		call	termica3
		btfss	portb,6
		call	termica2
		btfss	portb,7
		call	termica1

		btfss	portc,0
		call	elevado
		btfss	portc,1
		call	sisterna
		btfss	portc,2
		call	rele1
		btfss	portc,3
		call	rele2
		btfss	portc,4
		call	rele3
		btfss	portc,5
		call	rele4
		btfss	portc,6
		call	rele5
		btfss	portc,7
		call	rele6

		goto	test

rele1		btfsc	CONSULTC,2				;el programa llega aqui despues de detectar la entrada baja, ahora lo contrasta con 
			call	rele1v					;el registro CONSULTC que lleva guardada la condicion inicial de entradas,
			return							;si es que antes la entrada estaba alta, entonces sigue con un retardo de 3 seg,
rele1v		call 	Retardo_5s				; despues vuelve a verificar el puerto y si esta bajo llama a la rutina de alarma.
			btfss	portc,2
			goto	alarma
			return

rele2		btfsc	CONSULTC,3
			call	rele2v
			return
rele2v		call 	Retardo_5s
			btfss	portc,3
			goto	alarma
			return

rele3		btfsc	CONSULTC,4
			call	rele3v
			return
rele3v		call 	Retardo_5s
			btfss	portc,4
			goto	alarma
			return

rele4		btfsc	CONSULTC,5
			call	rele4v
			return
rele4v		call 	Retardo_5s
			btfss	portc,5
			goto	alarma
			return
		
rele5		btfsc	CONSULTC,6
			call	rele5v
			return
rele5v		call 	Retardo_5s
			btfss	portc,6
			goto	alarma
			return
		
rele6		btfsc	CONSULTC,7
			call	rele6v
			return
rele6v		call 	Retardo_5s
			btfss	portc,7
			goto	alarma
			return
		
termica1	btfsc	CONSULTB,7
			call	termica1v
			return
termica1v	call 	Retardo_5s
			btfss	portb,7
			goto	alarma
			return

termica2	btfsc	CONSULTB,6
			call	termica2v
			return
termica2v	call 	Retardo_5s
			btfss	portb,6
			goto	alarma
			return
		
termica3	btfsc	CONSULTB,5
			call	termica3v
			return
termica3v	call 	Retardo_5s
			btfss	portb,5
			goto	alarma
			return
	
termica4	btfsc	CONSULTB,4
			call	termica4v
			return
termica4v	call 	Retardo_5s
			btfss	portb,4
			goto	alarma
			return

termica5	btfsc	CONSULTB,3
			call	termica5v
			return
termica5v	call 	Retardo_5s
			btfss	portb,3
			goto	alarma
			return
			
termica6	btfsc	CONSULTB,2
			call	termica6v
			return
termica6v	call 	Retardo_5s
			btfss	portb,2
			goto	alarma
			return
			
termicag	btfsc	CONSULTB,1
			call	termicagv
			return
termicagv	call 	Retardo_5s
			btfss	portb,1
			goto	alarma
			return

inundacion	btfsc	CONSULTA,2
			call	inundacionv
			return
inundacionv	call 	Retardo_5s
			btfss	porta,2
			goto	alarma
			return
			
elevado		btfsc	CONSULTC,0
			call	elevadov
			return
elevadov	call 	Retardo_5s
			btfss	portc,0
			goto	alarma
			return

sisterna	btfsc	CONSULTC,1
			call	sisternav
			return
sisternav	call 	Retardo_5s
			btfss	portc,1
			goto	alarma
			return
			
faseR		btfsc	CONSULTA,5
			call	faseRv
			return
faseRv		call 	Retardo_5s
			btfss	porta,5
			goto	alarma
			return

faseS		btfsc	CONSULTA,4
			call	faseSv
			return
faseSv		call 	Retardo_5s
			btfss	porta,4
			goto	alarma
			return

faseT		btfsc	CONSULTA,3
			call	faseTv
			return
faseTv		call 	Retardo_5s
			btfss	porta,3
			goto	alarma
			return	

trafo24		btfsc	CONSULTB,0
			call	trafo24v
			return
trafo24v	call 	Retardo_5s
			btfss	portb,0
			goto	alarma
			return
			

			
alarma		bsf		porta,0
			call    Retardo_100ms		;equivale a 200ms
		
			bcf		porta,0
			call	Retardo_400ms		;equivale a 800ms
			
			goto   	alarma					
			

Retardo_100ms							; La llamada "call" aporta 2 ciclos máquina.
			movlw	d'100'				; Aporta 1 ciclo máquina. Este es el valor de "M".
			goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardos_ms
			movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
			movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
			movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
			decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
			goto	R1ms_BucleInterno		; Aporta (K-1)xMx2 ciclos máquina.
			decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
			goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
			return						; El salto del retorno aporta 2 ciclos máquina.


Retardo_400ms								; La llamada "call" aporta 2 ciclos máquina.
		movlw	d'4'							; Aporta 1 ciclo máquina. Este es el valor de "N".
		movwf	R_ContC							; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
		movlw	d'100'							; Aporta Nx1 ciclos máquina. Este es el valor de "M".
		movwf	R_ContB							; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
		movlw	d'249'							; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
		movwf	R_ContA							; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
		nop										; Aporta KxMxNx1 ciclos máquina.
		decfsz	R_ContA,F						; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
		goto	R1Decima_BucleInterno			; Aporta (K-1)xMxNx2 ciclos máquina.
		decfsz	R_ContB,F						; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
		goto	R1Decima_BucleExterno			; Aporta (M-1)xNx2 ciclos máquina.
		decfsz	R_ContC,F							; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
		goto	R1Decima_BucleExterno2				; Aporta (N-1)x2 ciclos máquina.
		return			




Retardo_5s										;rutina robada (equivale a 3 segundos aprox)
	movlw	d'15'								
	goto	Retardo_1Decima5					
Retardo_1Decima5
	movwf	R_ContC											; Aporta 1 ciclo máquina.
R1Decima_BucleExterno25
	movlw	d'100'											; Aporta Nx1 ciclos máquina. Este es el valor de "M".
	movwf	R_ContB											; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno5
	movlw	d'249'											; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA											; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno5          
	nop														; Aporta KxMxNx1 ciclos máquina.
	decfsz	R_ContA,F										; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
	goto	R1Decima_BucleInterno5							; Aporta (K-1)xMxNx2 ciclos máquina.
	decfsz	R_ContB,F										; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
	goto	R1Decima_BucleExterno5							; Aporta (M-1)xNx2 ciclos máquina.
	decfsz	R_ContC,F										; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1Decima_BucleExterno25							; Aporta (N-1)x2 ciclos máquina.
	return													; El salto del retorno aporta 2 ciclos máquina.




led_on		bank1
			movlw 	b'00000110'   	; Cargo el acumulador con el valor binario 00000111
       		movwf 	TMR_OPT       	; Configuro el Predivisor de TMR0 a 128:1
       		bank0     				; Regreso al banco 0
       		movlw   b'10100000'		; Cargo el acumulador con el valor binario 10100000
       		movwf   INTCON      	; Habilito interrupciones globales y por desbordamiento del TMR0
       		movlw  	0x03         
       		movwf 	conta         	; Cargo conta con el valor necesario para el retardo
			goto	test

interrup	
			decfsz 	conta,1    	; Decrementa conta 
        	goto  	seguir      ; Salta si al decrementar conta llega a 0
			movlw	0x03
			movwf	conta
        	btfsc 	porta,1   	; salta si el bit 7 del puerto B esta a cero
        	goto  	rb_1        ; Si RB.7 es cero salto a rb_1
        	bsf     porta,1	 	; Si es RB.7 es cero lo pongo a 1
        	goto  	seguir      ; Salto a seguir
rb_1    	bcf  	porta,1    	; Pongo a cero RB.7
seguir      bcf		INTCON,2
			clrf 	TMR_OPT     ; Inicio TMR0 con 0
        	retfie            	; Regreso de la Interrupcion

			


			end	
