Комутатор для чотирьох гірлянд на базі PIC16F628


Вступ 

Звісно, можна було купити заводську гірлянду і радіти... але дивитись на якесь "блимотіння" якоїсь гірлянди... це не для мене. Вирішено! Після невдалих спроб знайти 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В).


Схема в форматі spLine 5.0

Запобіжники 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