martes, 1 de marzo de 2011

Semáforo

Programa para PIC16F84A

Control de 2 semáforos.

-Uso de contadores
-Subrutina de retardo calibrado a 1 s para un cristal de 10 MHz

Diagrama de conexión:


Funcionamiento:


             La luz Verde dura 25 segundos.
             La Luz Ámbar dura 5 segundos.
             La Luz Roja dura 30 segundos.
  • Se crea una variable TIME que se incrementa cada 1 segundo (calibrado mediante contadores para un cristal de 10 MHz).
  • Se verifica la variable TIME para cambiar el estado de las luces según el siguiente diagrama:

Prueba:


 Programa en Assembler:


;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos 
;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

 org 0x00  ; Inicio de programa
 bsf STATUS,5 ; Inicio configiracion E/S
 clrf PORTB  ; Puerto B como salida
 bcf STATUS,5 ; Fin configuracion E/S
 movlw 0x21  ; b'000100001'
 movwf PORTB  ; RB0=Verde1 y RB5=Rojo2
BEGIN: call COUNTER  ; Llama a subrutina COUNTER
 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: movlw 0x21  ; b'000100001'
 movwf PORTB  ; RB0=Verde1 y RB5=Rojo2
 goto FINISH
SECOND: movlw 0x22  ; b'000100010'
 movwf PORTB  ; RB1=Ambar1 y RB5=Rojo2
 goto FINISH
THIRD: movlw 0x0C  ; b'00001100'
 movwf PORTB  ; RB2=Rojo1 y RB3=Verde2
 goto FINISH
FOURTH: movlw 0x14  ; b'00010100'
 movwf PORTB  ; RB2=Rojo1 y RB4=Ambar2
 goto FINISH
FINISH: goto BEGIN

;Subrutinas

COUNTER movlw 0xFA    ; Subrutina para que TIME 
 movwf COUNT1  ; se incremente cada 1 segundo
 movlw 0xC8  ; calibrado para cristal de 10 MHz
 movwf COUNT2  ; modificar COUNT1, COUNT2 y COUNT3
 movlw 0x12  ; para otras frecuencias
 movwf COUNT3
LOOP: decfsz COUNT1,1
 goto LOOP
 movlw 0xFA    
 movwf COUNT1
 decfsz COUNT2,1
 goto LOOP
 movlw 0xFA
 movwf COUNT1
 movlw 0xC8 
 movwf COUNT2
 decfsz COUNT3,1
 goto LOOP
 incf TIME,1 
 movlw 0x3C  ; 60 segundos entonces reiniciar TIME
 subwf TIME,0
 btfsc STATUS,2
 clrf TIME
 return

 end   ; Fin de programa
  


****Programa Pic Basic (Microcode)****


'****************************************************************
'*  Name    : SEMAFORO.BAS                                      *
'*  Author  : LONELY113                                         *
'*  Notice  : Copyright (c) 2011 LONELY113                      *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F84a                                         *
'*          : RB0=GREEN1, RB1=YELLOW1, RB2=RED1                 *
'*          : RB3=GREEN2, RB4=YELLOW2, RB5=RED2                 *
'****************************************************************

@  __config _HS_OSC & _WDT_OFF

DEFINE OSC 10    '10 MHz
trisb=$00        'Puerto B como salida

loop1:
 portb=100001 'Green1, Red2
 PAUSE 25000     'Retardo de 25 segundo
 portb=100010 'Ambar1, Red2
 PAUSE 5000      'Retardo 5 segundos
 portb=001100 'Red1, Green2
 PAUSE 25000     'Retardo 25 segundos
 portb=010100 'Red1, Yellow2
 PAUSE 5000      'Retardo 5 segundos
GOTO loop1
END

Archivos .ASM y .HEX
Descargar

8 comentarios:

  1. ke bien .. falta ke el verde parpadee antes de cambiar al ambar :)

    ResponderEliminar
  2. Te quedo muy buien, solo una pregunta, como le isiste para simular el semaforo en el proteus??

    ResponderEliminar
    Respuestas
    1. A que te refieres exactamente, sabes simular pics en proteus?

      Saludos.

      Eliminar
  3. quien me podría ayudar a programar 2 semáforos con su paso peatonal

    ResponderEliminar
  4. como hago pa que se choquen mis autos con el semaforo desconpuesto

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Como modifico el U1(MLCR) por que cuando o inserto no enciende le modifique a una opcion pero solo enciende el rojo y el verde respectivos de cada semaforo

    ResponderEliminar