- Несколько лет назад сын очень захотел себе для игр светофор. Ну так, при очередном посещении детского магазина, была куплена поделка дядюшки Ляо из куска пластмассы, лампочек, батарейки и незамысловатой капли (микросхемы). Стоимость уже и не помню.
Насколько я сейчас помню "прожила" эта поделка не долго, частично от того, что пожирала батарейки нещадно, а частично от убогости и хлипкости конструкции.
После того как пришла в негодность данная штуковина, сын затребовал такой же аппарат но в рабочем состоянии. Восстанавливать поломанную игрушку желания не было, поэтому быстро обежав все известные мне детские миры и иже с ними, было решено надо сделать что то похожее самостоятельно. О чем и было обещано ребенку). Это было с одной стороны ошибкой, потому как более требовательного Заказчика найти сложно. при каждой встрече мне так, ненавязчиво напоминалось - "пап, ты светофор уже сделал?". Оставалось только отвечать нет еще, и ускоряться. В то время у меня не было опыта в написании программ для микроконтроллеров (а именно на одном из них было решено делать устройство). Давнишний опыт написания на ассемблере был, в школьные годы писал для 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
;/ 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
Этот комментарий был удален администратором блога.
ОтветитьУдалить