Пятница, 24.11.2017, 20:10
Приветствую Вас Гость | RSS
Меню сайта
Форма входа
Поиск

Управление люстрой по 2-ум проводам на PIC12F629



Сей проект родился под впечетлением "китайского блока" управления люстрой.ПЕРЕКЛЮЧЕНИЕ ОБЫЧНЫМ ВЫКЛЮЧАТЕЛЕМ!!!


Внимание!!!
Идет тестирование!!!

В качестве выходных ключей использованы оптопары с детектором ноля МОС3061 в паре с симисторами ВТА137-800






Принцип работы.

При первом включеннии загораются все три лампы.Если в течении 3-ох секунд выключить-включить выключатель произойдет включение 2-ух ламп. Если в течении следующих 3-ох секунд выключить-включить выключатель произойдет включение 1-ой лампы. Если же после включения пройдет больше 3-ох секунд,то следующий цикл включения-выключения запустит опять все 3-и лампы.

Промежуточные данные при выключении сохраняются в EEPROM и определяют как будет вести себя устройство при следующем включении.Выносливость ячеек EEPROM cогласно документации MICROCHIP - 1 000 000 циклов стирания /записи

В перспективе добавление дистанционного управления.

Схема демонстрирующая принцип работы устройства:


                          
Схема всего лиш имитация, вместо светодиодов будут применятся оптопары в спарке с симисторами.




Пока лишь исходник.Который проверен.Конечно все это добро будет совершенствоваться и естественно проверятся в "метале".О чем мы будем Вам писать.
Но уже сейчас,судя по макетке устройство вполне работоспособное!!!



;***********************************************************************************************
; Lustra.V2.asm
; Управление люстрой.Версия 2 для pic12f629.
;===============================================================================================
            LIST        p=12F629    ; Установка типа микроконтроллера.
            __CONFIG    01FE4h      ; Бит защиты выключен, WDT выключен, 
            ERRORLEVEL -302                         ; внутр.генератор
;===============================================================================================
; Определение  положения  регистров  специального  назначения.
;===============================================================================================
IntCon      equ        0Bh         ; Регистр IntCon
Status      equ        03h         ; Регистр Status.
EEData      equ        9Ah         ; EEPROM - данные
EECon1      equ        9Ch         ; EECON1 - банк1.
EEAdr       equ        9Bh         ; EEPROM - адрес
EECon2      equ        9Dh         ; EECON2 - банк1.
Cmcon       equ        19h         ; Регистр Cmcon - компаратора
TrisiO      equ        05h         ; Регистр выбора направления работы выводов порта O.
GPIO        equ        05h         ; Регистр управления защелками порта O.

;===============================================================================================
; Определение  названия  и  положения  регистров  общего  назначения.
;===============================================================================================

SecH        equ        2Dh         ; Старший байт таймера.
SecL        equ        2Eh         ; Младший байт таймера.
SecF        equ        2Fh         ; Самый старший байт таймера.


;===============================================================================================
; Определение места размещения результатов операций.
;===============================================================================================
W           equ        0           ; Результат направить в аккумулятор.
F           equ        1           ; Результат направить в регистр.

;===============================================================================================
            org        2100h       ; Обращение к EEPROM памяти данных.
            DE         00h         ; Записать в ячейки с адресами .0, .1,  
                                   ; числа 03h, 0h, соответственно.  
             
;===============================================================================================
            org        0           ; Начать выполнение программы 
            goto       Start       ; с подпрограммы START.
;***********************************************************************************************

;***********************************************************************************************
;                               РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ
;***********************************************************************************************
Start       clrf        IntCon      ; Запретить все прерывания.
            bsf         Status,5    ; Перейти в 1-й банк (установить в 1 5-й бит
                                    ; регистра Status).
            movlw       .0          ; Записать константу .0 в аккумулятор (W).
            movwf       TrisiO      ; Скопировать .0 из W в регистр TrisB.
                                    ; Весь PortВ установлен на выход
 
;-----------------------------------------------------------------------------------------------
            bcf         Status,5    ; Перейти в 0-й банк (установить в 0 5-й бит
                                    ; регистра Status).
            clrf        GPIO        ; инициализация защелок (нули на всех защелках)
            movlw       .7          ; биты 0..2 поднять
            movwf       Cmcon       ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых

           movlw      3Fh          ; Записать в регистр W константу 06h
           movwf      GPIO         ; Скопировать 06h из W в регистр GPIO.
                                   ; Включаем HL1.



;===============================================================================================
;                               Чтение данных из EEPROM
;===============================================================================================
; Считывание содержимого байта с адресом 01h и запись его в акаммулятор W.
;-----------------------------------------------------------------------------------------------
            bsf        Status,5    ; Переход в 1-ый банк.

            movlw      0           ; Записать в регистр W константу 00h.
            movwf      EEAdr       ; Скопировать 00h из регистра W в регистр EEAdr.
 
            bsf        EECon1,0    ; Инициализировать чтение.

            movf       EEData,W    ; Скопировать число из ячейки EEPROM с адресом 01h в регистр W.

            bcf        Status,5    ; Переход в нулевой банк.

;-----------------------------------------------------------------------------------------------
           bcf        Status,2     ; опустим флаг Z в ноль
           XORLW      00h          ; проводим сравнение
           btfsc      Status,2     ; делаем бит-проверку Z-флага по условию
                                   ; если Z=1, то выполняется следующая инструкция, иначе пропускается
           
           goto       Metka_1      ; переход на Metka_1

           bcf        Status,2     ; опустим флаг Z в ноль
           XORLW      04h          ; проводим сравнение
           btfsc      Status,2     ; делаем бит-проверку Z-флага по условию
                                   ; если Z=1, то выполняется следующая инструкция, иначе пропускается

           goto       Metka_3      ; переход на Metka_3

;===============================================================================================
;                                Запись данных в EEPROM.             
;===============================================================================================
           bsf        Status,5    ; Переход в первый банк.
 
           movlw      0           ; Записать в регистр W константу 00h.
           movwf      EEAdr       ; Скопировать константу 00h из регистра W в регистр EEAdr.

           movlw      00h         ; Записать в регистр W константу 00h.
           movwf      EEData      ; Скопировать число из регистра W в ячейку EEPROM с адресом 01h.
         
           call       Zapis
;--------------------------------------------------------------------------------------------
           bcf        Status,5     ; Перейти в 0-й банк (установить в 0 5-й бит
                                   ; регистра Status).
           movlw      06h          ; Записать в регистр W константу 06h
           movwf      GPIO         ; Скопировать 06h из W в регистр GPIO.
                                   ; Включаем HL1.

           goto       PP 

;--------------------------------------------------------------------------------------------
Metka_1
;===============================================================================================
;                                Запись данных в EEPROM.             
;===============================================================================================
            bsf        Status,5    ; Переход в первый банк.
 
            movlw      00h         ; Записать в регистр W константу 00h.
            movwf      EEAdr       ; Скопировать константу 00h из регистра W в регистр EEAdr.

            movlw      04h         ; Записать в регистр W константу 04h
            movwf      EEData      ; Скопировать число из регистра W в ячейку EEPROM с адресом 01h.
         
            call       Zapis
;---------------------------------------------------------------------------------------------- 
            bcf         Status,5    ; Перейти в 0-й банк (установить в 0 5-й бит
                                    ; регистра Status).   
            movlw      00h          ; Записать в регистр W константу .7
            movwf      GPIO         ; Скопировать константу .7 из регистра W в регистр GPIO.
                                    ; Включаем HL1,HL2,HL3.

            goto        PP 

;--------------------------------------------------------------------------------------------

Metka_3    
;===============================================================================================
;                                Запись данных в EEPROM.             
;===============================================================================================
            bsf        Status,5    ; Переход в первый банк.
 
            movlw      0           ; Записать в регистр W константу 00h.
            movwf      EEAdr       ; Скопировать константу 00h из регистра W в регистр EEAdr.

            movlw      02h         ; Записать в регистр W константу .1
            movwf      EEData      ; Скопировать число из регистра W в ячейку EEPROM с адресом 01h.
         
            call       Zapis
;-----------------------------------------------------------------------------------------------
            bcf        Status,5    ; Перейти в 0-й банк (установить в 0 5-й бит
                                   ; регистра Status).
            movlw      04h         ; Записать в регистр W константу .3
            movwf      GPIO        ; Скопировать .3 из W в регистр GPIO.
                                   ; Включаем HL1,HL2.

PP
;-----------------------------------------------------------------------------------------------
; Задержка.
;----------------------------------------------------------------------------------------------- 
            movlw       .254        ; Записать в регистр W константу .254
            movwf       SecH        ; Скопировать .254 из W в регистр Sec. 
            movlw       .254        ; Записать в регистр W константу .254
            movwf       SecL        ; Скопировать .100 из W в регистр Sec.
            movlw       .15         ; Записать в регистр W константу .254
            movwf       SecF        ; Скопировать .100 из W в регистр Sec

Pause_1     decfsz      SecL,F      ; Декремент содержимого регистра Sec с помещением резуль-
                                    ; тата декремента в этот же регистр.
 
            goto        Pause_1     ; Если этот результат не=0, то осуществляется переход
                                    ; в ПП Pause_1 ("закольцовка" в этой ПП).
                                    ; Если =0, то программа исполняется далее.
                                    
            decfsz      SecH,F      ; Декремент содержимого регистра Sec с помещением резуль-
                                    ; тата декремента в этот же регистр.
  
            goto        Pause_1     ; Если этот результат не=0, то осуществляется переход
                                    ; в ПП Pause_1 ("закольцовка" в этой ПП).
                                    ; Если =0, то программа исполняется далее.

            decfsz      SecF,F      ; Декремент содержимого регистра Sec с помещением резуль-
                                    ; тата декремента в этот же регистр.
  
            goto        Pause_1     ; Если этот результат не=0, то осуществляется переход
                                    ; в ПП Pause_1 ("закольцовка" в этой ПП).
                                    ; Если =0, то программа исполняется далее.

;===============================================================================================
;                                Запись данных в EEPROM.             
;===============================================================================================
           bsf        Status,5    ; Переход в первый банк.
 
           movlw      00h         ; Записать в регистр W константу 00h.
           movwf      EEAdr       ; Скопировать константу 00h из регистра W в регистр EEAdr.

           movlw      00h         ; Записать в регистр W константу 00h.
           movwf      EEData      ; Скопировать число из регистра W в ячейку EEPROM с адресом 00h.
         
           call       Zapis

;-----------------------------------------------------------------------------------------------
; "Вечное кольцо"
;-----------------------------------------------------------------------------------------------
Stopor_1   goto        Stopor_2
Stopor_2   goto        Stopor_1


;-----------------------------------------------------------------------------------------------
Zapis       bsf        EECon1,2    ; Разрешить запись. 
                                    
            movlw      055h        ; Обязательная
            movwf      EECon2      ; процедура
            movlw      0AAh        ; при записи.
            movwf      EECon2      ; ----"----
            bsf        EECon1,1    ; ----"----

            bcf        EECon1,2    ; Запретить запись.

            return
;--------------------------------------------------------------------------------------------


;*******************************************************************************************
            end                    ; Конец программы. 


Продолжение следует !!!!!!