;=======================================================
;PROGRAMA PARA EL CONTROL DE TRAFICO

;=======================================================

	LIST P=16F877A 				;DEFINICION DEL PIC A UTILIZAR

#include "P16F877A.INC"



PDel0	EQU	0X20				;REGISTROS PARA RETARDOS
PDel1	EQU	0X21
PDel2	EQU	0X22

	ORG	0X00
	GOTO 	INICIO
	ORG 0X05			
;=======================================================
;DEFINICION DE REGISTROS 
;=======================================================
INICIO
	BANKSEL	TMR0				;SELECCIONA EL BANCO DONDE ESTA EL TIMER0
	CLRF	TMR0				;CLAREO EL TIMER 0

	BANKSEL	ADCON1
	MOVLW	0X06
	MOVWF	ADCON1	

	BANKSEL	TRISA				;SELECCIONA EL BANCO DONDE ESTA TRISA
	MOVLW	0X00				;CONFIGURA EL PUERTO
	MOVWF	TRISA				;COMO SALIDA

	BANKSEL	TRISB				;SELECCIONA EL BANCO DONDE ESTA TRISB
	MOVLW	0XFF				;CONFIGURA LOS BITS 0 Y 2 AL 7 COMO ENTRADAS PARA
	MOVWF	TRISB				;EL RECEPTOR, LOS SENSORES Y DEEP SW Y EL BIT 1 
								;COMO SALIDA
	BANKSEL	TRISD				;SELECCIONA EL BANCO DONDE ESTA TRISB
	MOVLW	0X00				;CONFIGURA LOS BITS 0 Y 2 AL 7 COMO ENTRADAS PARA
	MOVWF	TRISD				;EL RECEPTOR, LOS SENSORES Y DEEP SW Y EL BIT 1 
								;COMO SALIDA
	BANKSEL	TRISE				;SELECCIONA EL BANCO DONDE ESTA TRISB
	MOVLW	0X0F				;CONFIGURA LOS BITS 0 Y 2 AL 7 COMO ENTRADAS PARA
	MOVWF	TRISE				;EL RECEPTOR, LOS SENSORES Y DEEP SW Y EL BIT 1 
								;COMO SALIDA
								
	BANKSEL	OPTION_REG
	CLRF	OPTION_REG
	BSF		OPTION_REG,7	
	
	BANKSEL	PCON
	MOVLW	0X03
	MOVWF	PCON

	BANKSEL	PORTB
	CLRF	PORTB
	CLRF	PORTD
	CLRF	PORTA
	
;======================================================
;INICIA POR CHEQUEAR EN QUE CRUCE SE ENCUENTRA
; PARA CONTROLAR
;====================================================== 
INICIO1
	CLRWDT					;CLAREA EL WDT 
	BTFSC	PORTE,0
	GOTO	SENSORSS21				;CRUCE No. 2 EN LA POSICION  1 0
	GOTO	SENSORSS1				;CRUCES No. 1 Y No. 3 EN LA POSICION 0 0

;======================================================
;******************************************************
;SUBRUTINAS
;******************************************************
;======================================================
;***********************************************************************************************************
;=======================================================
;SUBRUTINA PARA IR AL CRUCE No. 1
;=======================================================
;***********************************************************************************************************

;======================================================
;REVISA SI HAY SEŅAL DEL RECEPTOR
;======================================================
RX1
	MOVLW	0X00
	MOVWF	PORTA		
	MOVLW	0X00
	MOVWF	PORTD
	
	BTFSS	PORTB,0
	GOTO	RX1
;======================================================
;REVISA SI HAY SEŅAL DE LOS SENSORES 
;CON LA BANDERA DE CAMBIO DEL PUERTO B
;======================================================
CAMBIO1
	BTFSC	PORTB,0			;TESTEA SI NO HAY CAMBIOS EN EL PURTO B (RB <7:4>)
	GOTO	SENSORSS1		;HAY CAMBIO Y COMIENZA A REVISAR EL ORIGEN DE LA SEŅAL 
	GOTO	RX1				;LLAMA A LA ETIQUETA RX (DONDE LEE LA SEŅAL DEL RECEPTOR)
;======================================================
;REVISA EL SENSOR SS1, ESPERA 5 SEGUNDOS
;Y ACTIVA EL SEMAFORO SECUNDARIO 1
;======================================================
SENSORSS1
	BTFSS	PORTB,0			;TESTEA SI HAY SEŅAL EN EL RECEPTOR
	GOTO	RX1
	BTFSC	PORTB,1			;TESTEA SI HAY SEŅAL EN EL SENSOR DEL SEMAFORO PG1
	GOTO	RX1				;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	CALL	ANTIREBO		;LLAMA A LA SUBRUTINA DE ANTIRREBOTE POR CAUSA DEL CONTACTO
	BTFSC	PORTB,1			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	RX1				;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR
	CALL	TIM5Seg			;HAY SEŅAL Y LLAMA EL RETARDO PARA CAMBIAR DE ESTADOS DE LOS SEMAFOROS 
	BTFSC	PORTB,1			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	RX1				;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR

	MOVLW	B'00000011'
	MOVWF	PORTD			;AMARILLO PPAL - ROJO SECUNDS.
	MOVLW	0X00
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	B'00000111'		;ROJO PPAL - VERDE SS1 - ROJO SS2	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM20Seg		;LLAMA RETARDO DE DURACION DE LOS SEMAFOROS EN SU NUEVO ESTADO

	MOVLW	B'00000100'
	MOVWF	PORTD			;ROJO PPAL - AMARILLO SS1 - ROJO SS2
	MOVLW	B'00000011'
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	0X00 		;VERDE PPAL - ROJO SECUND	
	MOVWF	PORTD
	MOVLW	0X00			
	MOVWF	PORTA
	CALL	TIM5Seg
	CALL	TIM5Seg

	BTFSC	PORTB,0			;TESTEA SI HAY SEŅAL EN EL RECEPTOR
	GOTO	RX1				;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	GOTO	INICIO1		

;***********************************************************************************************************
;=======================================================
;SUBRUTINA PARA IR AL CRUCE No. 2
;=======================================================
;***********************************************************************************************************
;======================================================
;REVISA SI HAY SEŅAL DEL RECEPTOR
;======================================================
RX2
	MOVLW	0X00
	MOVWF	PORTA		
	MOVLW	0X00
	MOVWF	PORTD

	BTFSS	PORTB,0
	GOTO	RX2
;======================================================
;REVISA SI HAY SEŅAL DE LOS SENSORES 
;CON LA BANDERA DE CAMBIO DEL PUERTO B
;======================================================
CAMBIO2
	BTFSC	PORTB,0			;TESTEA SI NO HAY CAMBIOS EN EL PURTO B (RB <7:4>)
	GOTO	SENSORSS21		;HAY CAMBIO Y COMIENZA A REVISAR EL ORIGEN DE LA SEŅAL 
	GOTO	RX2				;LLAMA A LA ETIQUETA RX (DONDE LEE LA SEŅAL DEL RECEPTOR)
;======================================================
;REVISA EL SENSOR SS1, ESPERA 5 SEGUNDOS
;Y ACTIVA EL SEMAFORO SECUNDARIO 1
;======================================================
SENSORSS21
	BTFSS	PORTB,0			;TESTEA SI HAY SEŅAL EN EL RECEPTOR
	GOTO	RX2
	BTFSC	PORTB,1			;TESTEA SI HAY SEŅAL EN EL SENSOR DEL SEMAFORO PG1
	GOTO	SENSORSS22		;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	CALL	ANTIREBO		;LLAMA A LA SUBRUTINA DE ANTIRREBOTE POR CAUSA DEL CONTACTO
	BTFSC	PORTB,1			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	SENSORSS22		;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR
	CALL	TIM5Seg			;HAY SEŅAL Y LLAMA EL RETARDO PARA CAMBIAR DE ESTADOS DE LOS SEMAFOROS 
	BTFSC	PORTB,1			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	SENSORSS22		;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR

	MOVLW	B'00000011'
	MOVWF	PORTD			;AMARILLO PPAL - ROJO SECUNDS.
	MOVLW	0X00
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	B'00000111'		;ROJO PPAL - VERDE SS1 - ROJO SS2	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM20Seg		;LLAMA RETARDO DE DURACION DE LOS SEMAFOROS EN SU NUEVO ESTADO
	MOVLW	B'00000100'
	MOVWF	PORTD			;ROJO PPAL - AMARILLO SS1 - ROJO SS2
	MOVLW	B'00000011'
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	0X00 		;VERDE PPAL - ROJO SECUND	
	MOVWF	PORTD
	MOVLW	0X00			
	MOVWF	PORTA
	CALL	TIM5Seg
	CALL	TIM5Seg

	BTFSC	PORTB,0			;TESTEA SI HAY SEŅAL EN EL RECEPTOR
	GOTO	SENSORSS22		;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	GOTO	RX2		
	

;======================================================
;REVISA EL SENSOR SS2, ESPERA 5 SEGUNDOS
;Y ACTIVA EL SEMAFORO SECUNDARIO 2
;======================================================
SENSORSS22
	BTFSS	PORTB,0			;TESTEA SI HAY SEŅAL EN EL RECEPTOR
	GOTO	RX2
	BTFSC	PORTB,2			;TESTEA SI HAY SEŅAL EN EL SENSOR DEL SEMAFORO PG1
	GOTO	SENSORSS21		;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	CALL	ANTIREBO		;LLAMA A LA SUBRUTINA DE ANTIRREBOTE POR CAUSA DEL CONTACTO
	BTFSC	PORTB,2			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	SENSORSS21		;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR
	CALL	TIM5Seg			;HAY SEŅAL Y LLAMA EL RETARDO PARA CAMBIAR DE ESTADOS DE LOS SEMAFOROS 
	BTFSC	PORTB,2			;VUELVE A TESTEAR PARA VER SI HAY SEŅAL DEL PRIMER SENSOR
	GOTO	SENSORSS21		;COMO NO HAY SEŅAL EN EL PRIMER SENSOR TESTEA EL SGTE SENSOR

	MOVLW	B'00000011'
	MOVWF	PORTD			;AMARILLO PPAL - ROJO SECUNDS.
	MOVLW	0X00
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	B'00001011'		;ROJO PPAL - VERDE SS1 - ROJO SS2	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM20Seg		;LLAMA RETARDO DE DURACION DE LOS SEMAFOROS EN SU NUEVO ESTADO


	MOVLW	B'00001000'
	MOVWF	PORTD			;ROJO PPAL - AMARILLO SS1 - ROJO SS2
	MOVLW	B'00000011'
	MOVWF	PORTA		
	CALL	TIM2Seg
	CALL	ANTIREBO
	CALL	ANTIREBO

	MOVLW	B'00000011'		;ROJO PPAL - ROJO SECUNDS.	
	MOVWF	PORTA
	MOVLW	B'00000000'			
	MOVWF	PORTD
	CALL	TIM5Seg

	MOVLW	0X00 		;VERDE PPAL - ROJO SECUND	
	MOVWF	PORTD
	MOVLW	0X00			
	MOVWF	PORTA
	CALL	TIM5Seg
	CALL	TIM5Seg

	BTFSC	PORTB,0			;TESTEA SI HAY SEŅAL EN EL SENSOR DEL SEMAFORO SP1
	GOTO	SENSORSS21		;COMO NO HAY SEŅAL EN EL SENSOR TESTEA EL SGTE SENSOR
	GOTO	INICIO1


;**************************************************************
;==============================================================
;SUBRUTINA PARA LOS RETARDOS
;==============================================================
;**************************************************************

;=====================================================
;RETARDO DE 500 MILISEGUNDO
;TIEMPO ANTIRREBOTE
;=====================================================
ANTIREBO  
	  	MOVLW     .239      ; 1 set numero de repeticion  (B)
        MOVWF     PDel0     ; 1 |
PLoop01 MOVLW     .232      ; 1 set numero de repeticion  (A)
        MOVWF     PDel1     ; 1 |
PLoop02 CLRWDT              ; 1 clear watchdog
PDelL01 GOTO 	PDelL02     ; 2 ciclos delay
PDelL02 GOTO 	PDelL03     ; 2 ciclos delay
PDelL03 CLRWDT              ; 1 ciclo delay
        DECFSZ  PDel1,1  	; 1 + (1) es el tiempo 0  ? (A)
        GOTO    PLoop02    	; 2 no, loop
        DECFSZ  PDel0,1 	; 1 + (1) es el tiempo 0  ? (B)
        GOTO    PLoop01    	; 2 no, loop
PDelL04 GOTO 	PDelL05     ; 2 ciclos delay
PDelL05 GOTO 	PDelL06     ; 2 ciclos delay
PDelL06 GOTO 	PDelL07     ; 2 ciclos delay
PDelL07 CLRWDT              ; 1 ciclo delay
        RETURN              ; 2+2 Fin.
;=====================================================
;RETARDO DE 20 SEGUNDOS
;TIEMPO DE LOS SEMAFOROS 
;EN SUS NUEVO ESTADO DE CAMBIO
;=====================================================
TIM20Seg
		MOVLW     .71       ; 1 set numero de repeticion  (C)
        MOVWF     PDel0     ; 1 |
PLoop0  MOVLW     .254      ; 1 set numero de repeticion  (B)
        MOVWF     PDel1     ; 1 |
PLoop1  MOVLW     .221      ; 1 set numero de repeticion  (A)
        MOVWF     PDel2     ; 1 |
PLoop2  CLRWDT              ; 1 clear watchdog
        CLRWDT              ; 1 ciclo delay
        DECFSZ    PDel2,1	; 1 + (1) es el tiempo 0  ? (A)
        GOTO      PLoop2    ; 2 no, loop
        DECFSZ    PDel1,1	; 1 + (1) es el tiempo 0  ? (B)
        GOTO      PLoop1    ; 2 no, loop
        DECFSZ    PDel0,1	; 1 + (1) es el tiempo 0  ? (C)
        GOTO      PLoop0    ; 2 no, loop
PDelL1  GOTO PDelL2         ; 2 ciclos delay
PDelL2  GOTO PDelL3         ; 2 ciclos delay
PDelL3  CLRWDT              ; 1 ciclo delay
     	RETURN        		; 2+2 Fin.	
;=====================================================
;RETARDO DE 25 SEGUNDOS, TIEMPO DE LOS SEMAFOROS 
;EN SUS NUEVO ESTADO DE CAMBIO
;=====================================================	
TIM25Seg
		MOVLW	.106      	; 1 set numero de repeticion  (C)
        MOVWF	PDel0     	; 1 |
PLoop3  MOVLW	.135      	; 1 set numero de repeticion  (B)
       	MOVWF	PDel1     	; 1 |
PLoop4  MOVLW	.249      	; 1 set numero de repeticion  (A)
        MOVWF	PDel2     	; 1 |
PLoop5  CLRWDT              ; 1 clear watchdog
PDelL11 GOTO	PDelL12     ; 2 ciclos delay
PDelL12 CLRWDT              ; 1 ciclo delay
       	DECFSZ	PDel2,1  	; 1 + (1) es el tiempo 0  ? (A)
        GOTO	PLoop5  	; 2 no, loop
        DECFSZ	PDel1,1 	; 1 + (1) es el tiempo 0  ? (B)
        GOTO	PLoop4	    ; 2 no, loop
        DECFSZ	PDel0,1 	; 1 + (1) es el tiempo 0  ? (C)
        GOTO	PLoop3 		; 2 no, loop
        CLRWDT              ; 1 ciclo delay  
		RETURN 				; 2+2 Fin.
;=======================================================
;RETARDO DE 5 SEGUNDOS, TIEMPO PARA QUE LOS SEMAFOROS
;CAMBIEN DE ESTADO
;=======================================================
TIM5Seg
		movlw     .165      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop6  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop7  movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop8  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2,1  	; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop8    ; 2 no, loop
        decfsz    PDel1,1 	; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop7    ; 2 no, loop
        decfsz    PDel0,1 	; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop6    ; 2 no, loop
        return              ; 2+2 Fin.
;=======================================================
;RETARDO DE 5 SEGUNDOS, TIEMPO PARA QUE LOS SEMAFOROS
;CAMBIEN DE ESTADO
;=======================================================

TIM2Seg
		movlw     .167      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop9  movlw     .41       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop10  movlw    .72       ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop11  clrwdt             ; 1 clear watchdog
        decfsz    PDel2,1  	; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop11   ; 2 no, loop
        decfsz    PDel1,1 	; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop10   ; 2 no, loop
        decfsz    PDel0,1 	; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop9    ; 2 no, loop
PDelL100  goto 	PDelL200    ; 2 ciclos delay
PDelL200  clrwdt            ; 1 ciclo delay
        return              ; 2+2 Fin.
;=======================================================
	END
