miércoles, 2 de marzo de 2011

Semáforo con Sensores

Programa para PIC16F84A


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:


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

12 comentarios:

  1. 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...

    ResponderEliminar
    Respuestas
    1. Claro, si me dejas tu correo te contacto para que me expliques acerca de tu proyecto.

      Eliminar
  2. ok muchas gracias ..... rutholguin_91@hotmail.com

    ResponderEliminar
  3. Hola podrias decirme la lista de los materiales q utilizaste por fis...gracias

    ResponderEliminar
    Respuestas
    1. Hola, lo que utilice:
      -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.

      Eliminar
  4. Que sensores se podrian utilizar para detectar cuantos autos existen en una cuadra..

    ResponderEliminar
    Respuestas
    1. mmm...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.

      Saludos.

      Eliminar
  5. Me podrías dar el diagrama de tu circuito.

    SALUDOS!

    ResponderEliminar
    Respuestas
    1. 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.

      Saludos.

      Eliminar
  6. disculpa como le puedo hacer para configurar el código para que funcione con una cristal de 4MHz.

    Saludos!

    ResponderEliminar