sábado, 8 de octubre de 2011

Semáforo

Programa para ATmega8

Control de 2 semáforos.

-Uso de contadores
-Subrutina de retardo calibrado a 1 s para oscilador interno de 8 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:

Programa en Assembler:

;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa de control de 2 semaforos 
;Salidas: Puerto D (RD0-RD5)
;    RD0=Verde1, RD1=Ambar1, RD2=Rojo1
;   RD3=Verde2, RD4=Ambar2, RD5=Rojo2
;Para reloj interno de 8 MHz
;---------------------------------------------------------

.nolist
.include "m8def.inc"
.list
.device  atmega8

.def COUNT1=r20
.def COUNT2=r21
.def COUNT3=r22
.def TIME=r4
.def STATE=r17

.org 0x0000

; Inicializacion de Stack
 ldi r16,LOW(RAMEND)
 out SPL,r16
 ldi r16,HIGH(RAMEND)
 out SPH,r16
; Fin inicializacion de Stack

; Inicio de programa

 ldi r16,0xFF
 out DDRD,r16 ; Puerto B como salida
 clr TIME
BEGIN: ldi r16,0x00 ; 00 segundos
 cp r16,TIME
 brbs 1,FIRST
 ldi r16,0x19 ; 25 segundos
 cp r16,TIME
 brbs 1,SECOND
 ldi r16,0x1E ; 30 segundos
 cp r16,TIME
 brbs 1,THIRD
 ldi r16,0x37 ; 55 segundos
 cp r16,TIME
 brbs 1,FOURTH
 rjmp FINISH
FIRST: ldi STATE,0x21 ; '00100001'b
 out PORTD,STATE
 rjmp FINISH
SECOND: ldi STATE,0x22 ; '00100010'b
 out PORTD,STATE
 rjmp FINISH
THIRD: ldi STATE,0x0C ; '00001100'b
 out PORTD,STATE
 rjmp FINISH 
FOURTH: ldi STATE,0x14 ; '00010100'b
 out PORTD,STATE
FINISH: nop
 rcall DELAY
 rjmp BEGIN

; Subrutinas

DELAY: ldi COUNT1,0xFF ; Retardo de 1 segundo
 ldi COUNT2,0xFF
 ldi COUNT3,0x29
LOOP: dec COUNT1
 brne LOOP
 ldi COUNT1,0xFF
 dec COUNT2
 brne LOOP
 ldi COUNT1,0xFF
 ldi COUNT2,0xFF
 dec COUNT3
 brne LOOP
 inc TIME
 ldi r16,0x3C ; reiniciar en 60 segundos
 cp r16,TIME
 brne RETURN
 clr  TIME
RETURN: ret

Archivos de programa:
Descargar

1 comentario:

  1. disculpa podrias explicarme las subrutinas y como se utilizan los registros por favor a y las instrucciones.gracias

    ResponderEliminar