Самодельный светофор игрушка.


  • Несколько лет назад сын очень захотел себе для игр светофор. Ну так, при очередном посещении детского магазина, была куплена поделка дядюшки Ляо из куска пластмассы, лампочек, батарейки и незамысловатой капли (микросхемы). Стоимость уже и не помню.

    Насколько я сейчас помню "прожила" эта поделка не долго, частично от того, что пожирала батарейки нещадно, а частично от убогости и хлипкости конструкции.

    После того как пришла в негодность данная штуковина, сын затребовал такой же аппарат но в рабочем состоянии. Восстанавливать поломанную игрушку желания не было, поэтому быстро обежав все известные мне детские миры и иже с ними, было решено надо сделать что то похожее самостоятельно. О чем и было обещано ребенку). Это было с одной стороны ошибкой, потому как более требовательного Заказчика найти сложно. при каждой встрече мне так, ненавязчиво напоминалось - "пап, ты светофор уже сделал?". Оставалось только отвечать нет еще, и ускоряться. В то время у меня не было опыта в написании программ для микроконтроллеров (а именно на одном из них было решено делать устройство). Давнишний опыт написания на ассемблере был, в школьные годы писал для Z80, но что то не сложное и просто так, для интереса. Тут же был навскидку выбор или AVR или PIC. Покурил и то и то... выбрал AVR. Не спрашивайте почему, не помню.

   В общем был пожеван мануал по Attiny12, маркером нарисована мелкая платка, в виде контроллера, трех полевых ключей с ограничивающими ток резисторами, вытравлена и спаяна. Далее как полагается - прошивка, отладка... потом корпус. Куплено в магазине радиодеталей основание - коробочка, плюс держатель батареек, большие светодиоды, кнопка и выключатель. В качестве головной части взял бутылек от лекарства, вставил светодиоды, спаял их и залил все это хозяйство эпоксидкой для прочности.

на видео ясны режимы работы, кнопка сброса переводит режимы из дежурного в рабочий и обратно.

если кому надо попробую нарисовать схему, я ее вообще нигде не сохранял, прошивка  сохранилась, вот она.

;/ svetofor
.include "D:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\tn12def.inc"
.DEF TEMP=R16
.DEF TEMP1=R17
.DEF TEMP2=R18
.DEF TEMP3=R19
.DEF TEMP4=R20
.DEF STAT=R21
 

.CSEG
.ORG 0
RJMP RESET
NOP
NOP
NOP
NOP
NOP
NOP

SEI
reset:
LDI TEMP1,50;0
CIKL:
DEC TEMP1
BRNE CIKL

ldi temp,0
out tccr0, temp
out acsr, temp
out gimsk, temp
out timsk, temp
out mcucr, temp
out wdtcr, temp

ldi temp, 0b00000010
out osccal, temp

CPI STAT,1 ;ПРОВЕРЯЕМ ОТКУДА ПРИШЛА
BRNE YELLOW

RJMP UP

YELLOW: ;ЦИКЛ ЖЕЛТОГО
ldi temp1,1
rcall pause1
yellow1:
LDI STAT, 1
LDI TEMP, 0B00000010    ; ЗАЖИГАЕМ ЖЕЛТЫЙ
OUT PORTB, TEMP

ldi temp1, 5        ;0.5sec
RCALL PAUSE1

LDI TEMP, 0B00000000    ; ГАСИМ ЖЕЛТЫЙ
OUT PORTB, TEMP

ldi temp1, 5        ;0.5sec
RCALL PAUSE1

RJMP YELLOW1

UP:                ; ОСНОВНОЙ ЦИКЛ INIT
LDI TEMP, 0B00011111
OUT DDRB, TEMP
; SEI

LDI STAT, 0

start:  ; ПРОГРАММА РАБОТЫ ОБЫЧНОГО СВЕТОФОРА ОСНОВНАЯ
ldi temp, 0b00001100    ;RED1 GREEN2

out PORTB, TEMP

ldi temp1, 25    ; 2.5sec
RCALL PAUSE1

ldi temp, 0b00000100    ;GREEN2 OFF

out PORTB, TEMP

ldi temp1, 3    ; 0.3sec
RCALL PAUSE1

ldi temp, 0b00001100    ;RED1 GREEN2

out PORTB, TEMP

ldi temp1, 3    ; 0.3sec
RCALL PAUSE1

ldi temp, 0b00000100    ;GREEN2 OFF    ;

out PORTB, TEMP

ldi temp1, 3    ; 0.3sec
RCALL PAUSE1

ldi temp, 0b00001100    ;RED1 GREEN2

out PORTB, TEMP

ldi temp1, 3    ; 0.3sec
RCALL PAUSE1

LDI TEMP, 0B00000000    ;ALL OFF
OUT PORTB, TEMP

ldi temp1, 1
RCALL PAUSE1

LDI TEMP, 0B00000010    ;YELLOW
OUT PORTB, TEMP

ldi temp1, 5    ;0.5sec
RCALL PAUSE1

LDI TEMP, 0B00000000    ;ALL OFF
OUT PORTB, TEMP

ldi temp1, 1
RCALL PAUSE1

LDI TEMP, 0B00010001    ;GREEN1 RED2
OUT PORTB, TEMP

 ldi temp1,25    ;2,5sec
RCALL PAUSE1

LDI TEMP, 0B00010000    ;RED2
OUT PORTB, TEMP

 ldi temp1,3    ;0.3sec
RCALL PAUSE1

LDI TEMP, 0B00010001    ;GREEN1 RED2
OUT PORTB, TEMP

 ldi temp1,3    ;0.3sec
RCALL PAUSE1

LDI TEMP, 0B00010000    ; RED2
OUT PORTB, TEMP

 ldi temp1,3    ;0.3sec
RCALL PAUSE1

LDI TEMP, 0B00010001    ;GREEN1 RED2
OUT PORTB, TEMP

 ldi temp1,3    ;0.3sec
RCALL PAUSE1

LDI TEMP, 0B00000000;     ;ALL OFF
OUT PORTB, TEMP

ldi temp1, 1
RCALL PAUSE1

LDI TEMP, 0B00000010    ;YELLOW
OUT PORTB, TEMP

ldi temp1, 5    ;0,5sec
RCALL PAUSE1

LDI TEMP, 0B00000000    ;ALL OFF
OUT PORTB, TEMP

ldi temp1, 1
RCALL PAUSE1

rjmp start

PAUSE1:                 ;подпрограмма задержки
ldi temp2,1
;MOV TEMP2, TEMP1
CIKL0:
LDI TEMP3,50
CIKL1:
LDI TEMP4,0
CIKL2:
DEC TEMP4
BRNE CIKL2
DEC TEMP3
BRNE CIKL1
DEC TEMP2
BRNE CIKL0
ret


1 комментарий:

  1. Этот комментарий был удален администратором блога.

    ОтветитьУдалить