El programa consiste en el control de 2 semáforos en el cruce de 2 calles. Existen dos sensores que proveen información del tráfico en las calles (un sensor para cada calle). Los sensores se activan (Envían un “1” cuando detectan que no hay vehículos en la calle correspondiente).
-Interrupciones por el Puerto B (Pines RB4-RB7).
Diagrama de Conexión:
Funcionamiento:
Luz Verde1=25 segundos o hasta que SENSOR1=1 (no hay vehículos en la calle 1), lo que ocurra antes.
Luz Verde2 =25 segundos o hasta que SENSOR2=1 (no hay vehículos en la calle 2), lo que ocurra antes.
Luces Ámbar1 y Ámbar2 = 5 segundos (Se deshabilitan los sensores en este lapso de tiempo).
Luces Roja 1 y Roja 2 sujetas al comportamiento de las luces Verde 1 y Verde 2.
- Se crea una variable TIME que se incrementa cada 1 segundo y se verifica continuamente para cambiar el estado de las luces.
- Los sensores generan interrupciones por el Puerto B (RB4-RB7) en el flanco de subida (Comprobación de flanco incluida en la rutina de interrupción).
- Cuando se activa un sensor se preestablece TIME al valor que hará que cambien las luces según el siguiente diagrama:
Prueba:
Programa en Assembler:
Archivos .ASM y .HEX
;-----------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos con sensores
;Un sensor para cada semaforo. Se activan cuando no
;hay vehiculos. Cuando se activa un sensor (no hay vehiculos)
;permite que circulen vehiculos por la avenida perpendicular
;Entradas: Puerto B (RB4 y RB4) mediante interrupciones
;Salidas: Puerto B (RB0-RB5)
; RB0=Verde1, RB1=Ambar1, RB2=Rojo1
; RB3=Verde2, RB4=Ambar2, RB5=Rojo2
;-----------------------------------------------------------
include "p16f84a.inc"
LIST P=16f84a
__CONFIG _WDT_OFF & _XT_OSC
TIME equ 0x0C
COUNT1 equ 0x0D
COUNT2 equ 0x0E
COUNT3 equ 0x0F
TEMP equ 0x10
TEMP2 equ 0x11
org 0x00 ; Inicio de programa
goto BEGIN
org 0x04 ; Inicio de rutina de interrupcion
movwf TEMP ; Salva el registro W
movf STATUS,0
movwf TEMP2 ; Salva el estado de los flags
VERIF1: btfss PORTB,4 ; Procedimiento si se activa RB4
goto VERIF2
movlw 0x19 ; Verificar TIME<25
subwf TIME,0
btfsc STATUS,0 ; Finalizar si TIME>25 segundos
goto FININT
movlw 0x18 ; Si TIME<25 segundos
movwf TIME ; Preestablecer TIME=24
goto FININT
VERIF2: btfss PORTB,5 ; Procedimiento si se activa RB5
goto FININT
movlw 0x1F ; Verificar TIME>30
subwf TIME,0
btfss STATUS,0 ; Finalizar si TIME<30 segundos
goto FININT
movlw 0x37 ; verificar TIME<55
subwf TIME,0
btfsc STATUS,5
goto FININT
movlw 0x36 ; Si TIME<55 segundos
movwf TIME ; Preestablecer TIME=54
FININT:
movf PORTB,0 ; Necesario para habilitar interrupciones
bcf INTCON,0 ; Permitir interrupciones
movf TEMP2,0
movwf STATUS ; Restaura estado de flags
movf TEMP,0
retfie ; Retorno de Interrupcion
; Principal
BEGIN: bsf INTCON,7 ; Habilitacion global de interrupciones
bsf INTCON,3 ; Interrupciones por puerto B (RB4-RB7)
bcf INTCON,0 ; Permitir interrupciones
bsf STATUS,5 ; Inicio configuracion E/S
clrf PORTA ; Puerto A como salida
movlw 0xF0
movwf PORTB ; RB0-RB3 como salidas y RB4-RB7 como entradas
bcf STATUS,5 ; Fin configuracion E/S
clrf TIME
movlw 0x01 ; b'00000001'
movwf PORTA
movlw 0x04 ; b'00000100'
movwf PORTB ; RA0=Verde1 y RB2=Rojo2
LOOP: movlw 0xFA ; Inicio rutina para que TIME se incremente
movwf COUNT1 ; cada 1 segundo
movlw 0xC8 ; Calibrado para cristal de 10 MHz
movwf COUNT2
movlw 0x12
movwf COUNT3
LOOP1: decfsz COUNT1,1
goto LOOP1
movlw 0xFA
movwf COUNT1
decfsz COUNT2,1
goto LOOP1
movlw 0xFA
movwf COUNT1
movlw 0xC8
movwf COUNT2
decfsz COUNT3,1
goto LOOP1
incf TIME,1
movlw 0x3C
subwf TIME,0
btfsc STATUS,2 ; borrar TIME cuando llegue a 60 segundos
clrf TIME ; Fin de rutina TIME
movlw 0x00 ; 0 segundos
subwf TIME,0
btfsc STATUS,2 ; si TIME=0 segundos saltar a FIRST
goto FIRST
movlw 0x19 ; 25 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=25 segundos saltar a SECOND
goto SECOND
movlw 0x1E ; 30 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=30 segundos saltar a THIRD
goto THIRD
movlw 0x37 ; 55 segundos
subwf TIME,0
btfsc STATUS,2 ; Si TIME=55 segundos saltar a FOURTH
goto FOURTH
goto FINISH
FIRST: bsf INTCON,7 ; Habilitacion global de interrupciones
movlw 0x01 ; b'00000001'
movwf PORTA
movlw 0x04 ; b'00000100'
movwf PORTB ; RA0=Verde1 y RB2=Rojo2
goto FINISH
SECOND: bcf INTCON,7 ; Deshabilitar interrupciones en Ambar
movlw 0x02 ; b'00000010'
movwf PORTA ; RA1=Ambar1 y RB2=Rojo2
goto FINISH
THIRD: bsf INTCON,7 ; Habilitacion global de interrupciones
movlw 0x04 ; b'00000100'
movwf PORTA
movlw 0x01 ; b'00000001'
movwf PORTB ; RA2=Rojo1 y RB0=Verde2
goto FINISH
FOURTH: bcf INTCON,7 ; Deshabilitar interrupciones en Ambar
movlw 0x02 ; b'00000010'
movwf PORTB ; RA2=Rojo1 y RB1=Ambar2
FINISH: goto LOOP
end ; Fin de Prograna
Archivos .ASM y .HEX
hola.... en verdad disculpa q te moleste.....soy de ecuador.... mi nombre es Ruth y mi proyecto de tesis habla sobre un sensor para semáforo... con la diferencia q tiene q enviar una llamada a la comisión de transito.-.. estoy investigando sobre eso.... y por suerte encontré tu pagina.... por favor ayúdame sip...
ResponderEliminarClaro, si me dejas tu correo te contacto para que me expliques acerca de tu proyecto.
Eliminarok muchas gracias ..... rutholguin_91@hotmail.com
ResponderEliminarHola podrias decirme la lista de los materiales q utilizaste por fis...gracias
ResponderEliminarHola, lo que utilice:
Eliminar-1 pic 16f84a
-1 cristal de 10 MHz
-2 condesadores de 22pF
-1 fuente 5V (lo puedes implementar con un regulador LM7805, una bateria de 9V y 2 condensadores de 10 uF)
-2 pulsadores
-2 led rojo, 2 led verde, 2 led amarillo
-6 resistencias de 1K en serie con los LED
-2 resistencias de 100 (pull up en los pines que conectas los pulsadores)
Saludos.
Que sensores se podrian utilizar para detectar cuantos autos existen en una cuadra..
ResponderEliminarmmm...seria un diseño algo complejo, tendrias que hacer procesamiento de imagenes. Se me ocurre que podrias utilizar una camara de fotos o video y relacionar los bordes de los autos con plantillas o con una camara infrarroja (pues el motor de los autos estara a altas temperaturas) y contar...en fin...son ideas.
EliminarSaludos.
Me podrías dar el diagrama de tu circuito.
ResponderEliminarSALUDOS!
Hola, el diagrama es el que aparece más arriba aunque le faltan algunas conexiones básicas al pic (VDD, GND, etc). Y en cuanto a las luces del semáforo reemplazalas con leds con una resistencia en serie de 1k hacia tierra.
EliminarSaludos.
disculpa como le puedo hacer para configurar el código para que funcione con una cristal de 4MHz.
ResponderEliminarSaludos!
Lograste solucionar?
Eliminarque sensor se puede utilizar para la vida real?
ResponderEliminar