Вступ
Звісно, можна було купити заводську гірлянду і радіти... але дивитись на якесь "блимотіння" якоїсь гірлянди... це не для мене. Вирішено! Після невдалих спроб знайти 3...4 однакові гірлянди різних кольорів без комутатора, я придбав якусь з комутатором на 100 лампочок. Ця гірлянда представляє собою 4 скручені між собою окремі гірлянди. Це воно!
Конструкція
Конструкція представляє собою класичну схему. Мікроконтролер PIC16F628 (звісно, можна було використати і інший, більш дешевий мікроконтролер типу PIC12F629 чи PIC12F675, а ли з цим я вже досить добре знайомий...). Із чотирьох виводів порта сигнал поступає на оптодиністор MOC2030, який в свою чергу вмикається у коло керування тирістором (було використано тирістор на 0,8А 400В).
Живлення МК виконується по класичній схемі параметричного стабілізатора з використанням конденсатора 0,47мкФх400В у якості "гасящого резистора" і стабілітрона на 4,7В 1Вт. Зглажування - конденсатор 1000мкФх10В і 0,1мкФ (для подавлення перешкод)
Для синхронізації роботи МК з переходом напруги у мережі через ноль використовується сигнал (позитивні імпульси) з виходу випрямляча параметричного стабілізатора.
У зв'язку з тим, що гірлянда розрахована на 127В, то її живлення виконується через однонапівперіодний випрямляч.
Для захисту інших пристроїв від перешкод, які створює комутатор під час роботи встановлено простий фільтр: індуктивності (К12х10х4 із фериту М2000; кількість витків - скільки влізе в один шар) у кожний провід і конденсатор (0,047мкФх400В).
Запобіжники FU1, FU2 близько 0,1А.
Стабілітрон VD7 - будь-який, з напругою стабілізації
4,5...5В, потужністю не менше 1Вт.
Оптопари U1 - будь-які, що можуть керувати
тиристором.
Тиристори VS1...VS4 - будь-які на 400В 0,8А і вище (в
залежності від використовуємих гірлянд)
Конденсатор C4 - використовується для
подавлення ВЧ перешкод, бажано керамічний
Оригінал коду на асемблері представлено в кінці сторінки.
Прошивка у форматі Intel HEX
Фотки
Вигляд на дорожки (плату ще не промив):
Вигляд на монтаж:
А так воно виглядає у зборі:
На цій фотографії показано гірлянду в роботі:
Код
LIST
p=16F628
#include "P16F628.INC"
; __CONFIG 3F61h
radix DEC
;
w equ 0
f equ
1
PauseCntA equ
21h
PauseCntB equ 22h
Povtor equ 23h
LED1 equ 24h ; Яркость 1го светодиода (гирлядны) ;
LED2 equ 25h ; Яркость 2го светодиода (гирлядны)
;
LED3 equ 26h ; Яркость 3го
светодиода (гирлядны) ;
LED4 equ
27h ; Яркость 4го светодиода (гирлядны) ;
ShimTmr equ 30h ; Отсчет ШИМ таймера
IntW equ 31h ; Сохранение значения
контекста
IntStat equ 32h ; на
время обработки прерывания
ShimCon equ 33h ; Настройки ШИМ
#define LED1pin
PORTB,7 ; ножка 1го светодиoда
#define LED2pin PORTB,6 ; ножка 2го светодиoда
#define LED3pin PORTB,5 ; ножка 3го светодиoда
#define LED4pin PORTB,4 ; ножка 3го светодиoда
#define ZeroPin PORTA,4 ; Ножка
детектора "нуля" sin
#define sin ShimCon,0 ; Флаг начала полупериода Sin
;=====================================================
;
; Початок програми. Ініцілізація
;
;=====================================================
org 0
goto start ; (Start)
;=====================================================
; Подпрограмма обработки прерывания
;=====================================================
org 4h
movwf IntW ; Сохряняем содержимое регистра
; w на время обработки прерывания
movf STATUS,0; Сохряняем содержимое регистра
movwf IntStat ; STATUS на время обработки прерывания
bcf STATUS,RP0 ; Банк 0
bcf INTCON,T0IF
; Регулировка яркостью светодиодов с помощью ШИМ
bcf LED1pin ; Выключить 1й светодиод
bcf LED2pin ; Выключить 2й светодиод
bcf LED3pin ; Выключить 3й светодиод
bcf LED4pin ; Выключить 3й светодиод
comf ShimTmr,1 ; Инверсия значений
movf LED1,W ; Полный ШИМ цикл - 255
циклов.
subwf ShimTmr,W ; Если
текущее значение ШИМ счетчика больше "яркости" (LED1)
btfss STATUS,C ; то выключаем светодиод
bsf LED1pin
; btfss ZeroPin ; Если напряжение
отсуствует
; goto NoVoltage ; то
не включаем светодиоды.
btfss sin
; Если в прошлый раз sin=0,
clrf
ShimTmr ; то сбрасываем ШИМ-счетчик,
bsf sin ; и устнавливаем sin=1.
movf LED2,W ;
subwf ShimTmr,W ;
btfss STATUS,C ;
bsf LED2pin
movf LED3,W ;
subwf ShimTmr,W ;
btfss STATUS,C ;
bsf LED3pin
movf LED4,W ;
subwf ShimTmr,W ;
btfss STATUS,C ;
bsf LED4pin
NoVoltage
comf ShimTmr,1 ; Инверсия значений
; Приплюсовать
movlw 6h
addwf ShimTmr,1
btfss ZeroPin ; Если напряжение в сети =
0
bcf sin ; то устнавливаем sin=0.
btfsc PORTA,1 ; Проверки на нажатие
кнопки 1
clrf Povtor ; Сбросить
счетчик повторов
btfsc PORTA,2
clrf PauseCntA
movf IntStat,w ;
Восстановление контекста
movwf
STATUS
swapf IntW,F ; Тут
приходится хитрить, чтобы сохранить бит Z
swapf IntW,W ; (movf его может изменить, а swapf - нет)
retfie
;=====================================================
; Основна програма
;=====================================================
start
;-------------------------------; Первичная подготовка
bcf STATUS,RP0 ; Банк 0
bcf STATUS,RP1 ; Банк 0
clrf INTCON ; Запрет всех прерываний
clrf ShimCon ; Сброс всех настроек ШИМ
;-------------------------------;
Иницилизация модуля компараторов
bcf STATUS,RP0 ; Банк 0
clrf PORTA
; Иницилизация порта А
movlw
B'00000111' ;
movwf CMCON ;
Компараторы выключены
bsf
STATUS,RP0 ; Банк 1
movlw 0FFh ;
Порт А - все входы
movwf TRISA ;
bcf STATUS,RP0 ; Банк 0
bsf STATUS,RP0 ; Банк 1
clrf VRCON ; Источник опорного напряжение выключен
bcf PIE1,6 ; Прерывание от компараторов выключенно.
bcf STATUS,RP0 ; Банк 0
;-------------------------------; Подготовка портов ввода-вывода
; Порт A Мы уже настроимли в модуле компараторов
; Порт В
bsf STATUS,RP0 ; Банк 1
movlw b'00000000' ; все - выходы.
movwf TRISB ;
bcf STATUS,RP0 ; Банк 0
;-------------------------------;
Иницилизация модуля TMR0
bsf
STATUS,RP0 ; Банк 1
bcf
OPTION_REG,5 ; TMR0 работает от внутреннего генератора
bsf INTCON,T0IE ; Разрешено прерывание при переполнении
bsf OPTION_REG,PSA ; Предделитель перед WDT
bcf STATUS,RP0 ; Банк 0
bcf INTCON,T0IF
; bsf INTCON,PEIE ;
Включаем прерывания
bsf INTCON,GIE
bcf STATUS,RP0 ; Банк 0
clrf PORTB
;-------------------------------;
Бегущие огни (резкий переход)
BegOgniRezk
movlw .30
movwf Povtor ; Повторить хх раз
BegOgniRezkPov
movlw 0FFh ; Включаю яркость на 100%
movwf LED1 ;
call PAUSE1s
clrf LED1
movlw 0FFh ;
movwf LED2 ;
call PAUSE1s
clrf LED2
movlw 0FFh ;
movwf LED3 ;
call PAUSE1s
clrf LED3
movlw 0FFh ;
movwf LED4 ;
call PAUSE1s
clrf LED4
decfsz Povtor,1
goto BegOgniRezkPov
;-------------------------------;
Бегущие огни (плавный переход)
BegOgniPlav
movlw 0h ; Подготовка светодиодов
movwf LED1 ; Ве выключенно
movwf
LED2 ;
movwf LED3 ;
movlw .30
movwf Povtor ; Повторить хх раз
Zazyg
; call GIRLemul ; Эмуляция гирлянды ; Подготовка
call PAUSE01s ; Пауза 0,1 сек. ;
call PAUSE01s ; Пауза 0,1 сек. ;
call PAUSE01s ; Пауза 0,1 сек. ;
;
incfsz LED1,1 ; Плавно увеличиваю яркость ;
goto Zazyg ; до максимума ;
BegOgniPlavLED1
;
movlw 0FFh ; Включаю яркость на 100% ;
movwf LED1 ; ;
call PAUSE5s
BegOgniPlavLED12
; call GIRLemul ; Эмуляция гирлянды ; 1й светодиод плавно
call PAUSE01s ; Пауза 0,1 сек. ;
переходит в 2й
call PAUSE01s
;
decfsz LED1,1 ; Уменьшаю яркость
первого ;
nop ; светодиода и
увеличиваю ;
incfsz LED2,1 ;
второго ;
goto BegOgniPlavLED12 ;
clrf LED1
movlw 0FFh ; Включаю яркость на 100%
movwf LED2 ;
call PAUSE5s
BegOgniPlavLED23
; call GIRLemul ; Эмуляция гирлянды ; 2й светодиод плавно
call PAUSE01s ; Пауза 0,1 сек. ;
переходит в 3й
call PAUSE01s
;
decfsz LED2,1 ; Уменьшаю яркость
первого ;
nop ; светодиода и
увеличиваю ;
incfsz LED3,1 ;
второго ;
goto BegOgniPlavLED23 ;
clrf LED2
movlw 0FFh ; Включаю яркость на 100%
movwf LED3 ;
call PAUSE5s
BegOgniPlavLED34
; call GIRLemul ; Эмуляция гирлянды ; 3й светодиод плавно
call PAUSE01s ; Пауза 0,1 сек. ;
переходит в 4й
call PAUSE01s
decfsz LED3,1 ; Уменьшаю яркость первого
nop ; светодиода и увеличиваю
incfsz LED4,1 ; второго
goto BegOgniPlavLED34
clrf LED3
movlw 0FFh ; Включаю яркость на 100%
movwf LED4 ;
call PAUSE5s
BegOgniPlavLED41
; call GIRLemul ; Эмуляция гирлянды ; 4й светодиод плавно
call PAUSE01s ; Пауза 0,1 сек. ;
переходит в 1й
call PAUSE01s
decfsz LED4,1 ; Уменьшаю яркость первого
nop ; светодиода и увеличиваю
incfsz LED1,1 ; второго
goto BegOgniPlavLED41
clrf LED4
movlw 0FFh ; Включаю яркость на 100%
movwf LED1 ;
decfsz Povtor,1 ; Зацикливаемся
goto BegOgniPlavLED1
goto BegOgniMedlPlav
;-------------------------------; Бегущие огни (плавный переход, медленные)
BegOgniMedlPlav
movlw 0h ; Подготовка светодиодов
movwf LED1 ; Вcе выключенно
movwf LED2 ;
movwf LED3 ;
movlw .7
movwf Povtor ; Повторить
хх раз
ZazygMedl
;
call GIRLemul ; Эмуляция гирлянды ; Подготовка
call PAUSE01s ; Пауза 0,5 сек. ;
;
incfsz LED1,1 ; Плавно увеличиваю яркость ;
goto ZazygMedl ; до максимума ;
BegOgniMedlPlavLED1
;
movlw 0FFh ; Включаю яркость на 100% ;
movwf LED1 ; ;
call PAUSE15s
call PAUSE15s
BegOgniMedlPlavLED12
; call GIRLemul ; Эмуляция гирлянды ; 1й светодиод плавно
call PAUSE1s ; Пауза 0,5 сек. ;
переходит в 2й
call PAUSE05s ;
Пауза 0,5 сек.
;
decfsz LED1,1 ; Уменьшаю яркость первого ;
nop ; светодиода и увеличиваю ;
incfsz LED2,1 ; второго ;
goto BegOgniMedlPlavLED12 ;
clrf LED1
movlw 0FFh ; Включаю яркость на 100%
movwf LED2 ;
call PAUSE15s
call PAUSE15s
BegOgniMedlPlavLED23
; call GIRLemul ; Эмуляция гирлянды ; 2й светодиод плавно
call PAUSE1s ; Пауза 0,5 сек. ;
переходит в 3й
call PAUSE05s ;
Пауза 0,5 сек.
;
decfsz LED2,1 ; Уменьшаю яркость первого ;
nop ; светодиода и увеличиваю ;
incfsz LED3,1 ; второго ;
goto BegOgniMedlPlavLED23 ;
clrf LED2
movlw 0FFh ; Включаю яркость на 100%
movwf LED3 ;
call PAUSE15s
call PAUSE15s
BegOgniMedlPlavLED34
; call GIRLemul ; Эмуляция гирлянды ; 3й светодиод плавно
call PAUSE1s ; Пауза 0,5 сек. ;
переходит в 4й
call PAUSE05s ;
Пауза 0,5 сек.
decfsz LED3,1 ; Уменьшаю яркость первого
nop ; светодиода и увеличиваю
incfsz LED4,1 ; второго
goto BegOgniMedlPlavLED34
clrf LED3
movlw 0FFh ; Включаю яркость на 100%
movwf LED4 ;
call PAUSE15s
call PAUSE15s
BegOgniMedlPlavLED41
; call GIRLemul ; Эмуляция гирлянды ; 4й светодиод плавно
call PAUSE1s ; Пауза 0,5 сек. ;
переходит в 1й
call PAUSE05s ;
Пауза 0,5 сек.
decfsz LED4,1 ; Уменьшаю яркость первого
nop ; светодиода и увеличиваю
incfsz LED1,1 ; второго
goto BegOgniMedlPlavLED41
clrf LED4
movlw 0FFh ; Включаю яркость на 100%
movwf LED1 ;
decfsz Povtor,1 ; Зацикливаемся
goto BegOgniMedlPlavLED1
goto BegOgniMedRezk
;-------------------------------; Бегущие огни (резкий переход, медленно)
BegOgniMedRezk
movlw .7
movwf Povtor ; Повторить хх раз
BegOgniMedRezkPov
movlw 0FFh ; Включаю яркость на 100%
movwf LED1 ;
call PAUSE15s
call PAUSE1s
clrf LED1
movlw 0FFh ;
movwf LED2 ;
call PAUSE15s
call PAUSE1s
clrf LED2
movlw 0FFh ;
movwf LED3 ;
call PAUSE15s
call PAUSE1s
clrf LED3
movlw 0FFh ;
movwf LED4 ;
call PAUSE15s
call PAUSE1s
clrf LED4
decfsz Povtor,1
goto BegOgniMedRezkPov
goto BegTenRezk
;-------------------------------; Бегущая тень (резкий переход)
BegTenRezk
movlw .10
movwf Povtor ; Повторить
хх раз
BegTenRezkPov
movlw 0FFh ; Включаю яркость на 100%
movwf LED2 ;
movwf LED3 ;
movwf LED4 ;
movlw .128
movwf LED1
call PAUSE1s
movlw .64
movwf LED1
movlw .32
movwf LED1
call PAUSE1s
clrf LED1
call PAUSE5s
movlw 0FFh ;
movwf LED1 ;
movwf LED3 ;
movwf LED4 ;
movlw .128
movwf LED2
call PAUSE1s
movlw .64
movwf LED2
movlw .32
movwf LED2
call PAUSE1s
clrf LED2
call PAUSE5s
movlw 0FFh ;
movwf LED1 ;
movwf LED2 ;
movwf LED4 ;
movlw .128
movwf LED3
call PAUSE1s
movlw .64
movwf LED3
movlw .32
movwf LED3
call PAUSE1s
clrf LED3
call PAUSE5s
movlw 0FFh ;
movwf LED1 ;
movwf LED2 ;
movwf LED3 ;
movlw .128
movwf LED4
call PAUSE1s
movlw .64
movwf LED4
movlw .32
movwf LED4
call PAUSE1s
clrf LED4
call PAUSE5s
decfsz Povtor,1
goto BegTenRezkPov
; goto BegOgniRezk
;-------------------------------; Столбик
Stolb
movlw 0h ; Подготовка светодиодов
movwf LED1 ; Ве выключенно
movwf LED2 ;
movwf LED3 ;
movlw .10
movwf Povtor ; Повторить
хх раз
StolbLED1on
call PAUSE05s ; Пауза 0,5 сек.
;
incfsz LED1,1 ;
goto StolbLED1on
movlw 0FFh ; Включаю яркость на 100%
movwf LED1 ;
call PAUSE5s
StolbLED2on
call PAUSE05s ; Пауза 0,5 сек.
;
incfsz LED2,1 ;
goto StolbLED2on
movlw 0FFh ; Включаю яркость на 100%
movwf LED2 ;
call PAUSE5s
StolbLED3on
call PAUSE05s ; Пауза 0,5 сек.
incfsz LED3,1 ;
goto StolbLED3on
movlw 0FFh ; Включаю яркость на 100%
movwf LED3 ;
call PAUSE5s
StolbLED4on
call PAUSE05s ; Пауза 0,5 сек.
incfsz LED4,1 ;
goto StolbLED4on
movlw 0FFh ;
movwf LED4 ;
call PAUSE5s
StolbLED1off
call PAUSE05s ; Пауза 0,5 сек.
;
decfsz LED1,1 ;
goto StolbLED1off
movlw 0h
movwf LED1
call PAUSE5s
StolbLED2off
call PAUSE05s ; Пауза 0,5 сек.
;
decfsz LED2,1 ;
goto StolbLED2off
movlw 0h
movwf LED2
call PAUSE5s
StolbLED3off
call PAUSE05s ; Пауза 0,5 сек.
decfsz LED3,1 ;
goto StolbLED3off
movlw 0h
movwf LED3
call PAUSE5s
StolbLED4off
call PAUSE05s ; Пауза 0,5 сек.
decfsz LED4,1 ;
goto StolbLED4off
movlw 0h ;
movwf LED4 ;
call PAUSE1s
decfsz Povtor,1 ; Зацикливаемся
goto StolbLED1on
;-------------------------------; Два бегущих огня
DvaBeg
movlw
.7
movwf Povtor ; Повторить хх раз
clrf LED1
clrf LED2
clrf LED3
clrf LED4
DvaBegZazyg
; call GIRLemul ; Эмуляция гирлянды ; Подготовка
call PAUSE01s ; Пауза 0,1 сек. ;
call PAUSE01s ; Пауза 0,1 сек. ;
call PAUSE01s ; Пауза 0,1 сек. ;
incfsz LED4,1 ;
nop
incfsz
LED1,1 ; Плавно увеличиваю яркость ;
goto DvaBegZazyg ; до максимума ;
movlw 0FFh;
movwf LED1
movwf LED4
DvaBegS12
call PAUSE01s
decfsz LED1,1
nop
incfsz
LED2,1
goto DvaBegS12
movlw 0FFh
movwf LED2
clrf LED1
call PAUSE5s
DvaBegS23
call PAUSE01s
decfsz LED2,1
nop
incfsz
LED3,1
goto DvaBegS23
movlw 0FFh
movwf LED3
clrf LED2
call PAUSE5s
DvaBegS34
call PAUSE01s
decfsz LED4,1
nop
incfsz
LED1,1
goto DvaBegS34
movlw 0FFh
movwf LED1
clrf LED4
call PAUSE5s
DvaBegS45
call PAUSE01s
decfsz LED1,1
nop
incfsz
LED2,1
goto DvaBegS45
movlw 0FFh
movwf LED2
clrf LED1
call PAUSE5s
DvaBegS56
call PAUSE01s
decfsz LED2,1
nop
incfsz
LED4,1
goto DvaBegS56
movlw 0FFh
movwf LED4
clrf LED2
call PAUSE5s
DvaBegS67
call PAUSE01s
decfsz LED3,1
nop
incfsz
LED2,1
goto DvaBegS67
movlw 0FFh
movwf LED2
clrf LED3
call PAUSE5s
DvaBegS78
call PAUSE01s
decfsz LED4,1
nop
incfsz
LED1,1
goto DvaBegS78
movlw 0FFh
movwf LED1
clrf LED4
call PAUSE5s
DvaBegS89
call PAUSE01s
decfsz LED1,1
nop
incfsz
LED3,1
goto DvaBegS89
movlw 0FFh
movwf LED3
clrf LED1
call PAUSE5s
DvaBegS9A
call PAUSE01s
decfsz LED3,1
nop
incfsz
LED4,1
goto DvaBegS9A
movlw 0FFh
movwf LED4
clrf LED3
call PAUSE5s
DvaBegSAB
call PAUSE01s
decfsz LED2,1
nop
incfsz
LED1,1
goto DvaBegSAB
movlw 0FFh
movwf LED1
clrf LED2
call PAUSE5s
DvaBegSBC
call PAUSE01s
decfsz LED4,1
nop
incfsz
LED2,1
goto DvaBegSBC
movlw 0FFh
movwf LED2
clrf LED4
call PAUSE5s
DvaBegSCD
call PAUSE01s
decfsz LED2,1
nop
incfsz
LED3,1
goto DvaBegSCD
movlw 0FFh
movwf LED3
clrf LED2
call PAUSE5s
DvaBegSDE
call PAUSE01s
decfsz LED3,1
nop
incfsz
LED4,1
goto DvaBegSDE
movlw 0FFh
movwf LED4
clrf LED3
call PAUSE5s
decfsz Povtor,1 ; Зацикливаемся
goto DvaBegS12
goto BegOgniRezk
;-------------------------------; Пауза 15с
PAUSE15s
call
PAUSE5s
call PAUSE5s
call PAUSE5s
return
;-------------------------------; end
;-------------------------------; Пауза
5с
PAUSE5s
call PAUSE1s
call PAUSE1s
call PAUSE1s
call PAUSE1s
call PAUSE1s
return
;-------------------------------; end
;-------------------------------; Пауза
1с
PAUSE1s
movlw .255 ;пауза для 1 сек
movwf PauseCntA
P1 movlw .255
movwf PauseCntB
P2 decfsz PauseCntB,1
goto P2
nop
decfsz PauseCntA,1
goto P1
nop
return
;-------------------------------; end
;-------------------------------; Пауза 0,5с
PAUSE05s
call
PAUSE01s
call PAUSE01s
call PAUSE01s
call PAUSE01s
call PAUSE01s
return
;-------------------------------; end
;-------------------------------; Пауза 1с
PAUSE01s
movlw .2 ;пауза для 0,1 сек
movwf
PauseCntA
P01A movlw .220
movwf PauseCntB
P01B decfsz PauseCntB,1
goto P01B
nop
decfsz PauseCntA,1
goto P01A
nop
return
;-------------------------------; end
org 07FFh
goto start
END
Якщо у Вас будуть пропозиції - прошу!
13.03.2010