;=======================================================
;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