
;**********************************************************************
;                                                                     *
;    Filename:	    onoff1.asm                                        *
;    Date:          21.07.2003                                        *
;    File Version:  1.00                                              *
;                                                                     *
;    Author:        Alexey Petrushev                                  *
;    Company:                                                         *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:                                                  *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: Устройство плавного включения и выключения ламп           *
;           накаливания, бытовой выключатель.                         *
;**********************************************************************



		LIST p=12C509a
	#include <p12c509a.inc>
	__CONFIG	_MCLRE_OFF & _CP_OFF & _XT_OSC & _WDT_ON

PORTB	equ GPIO

Sync	equ 0				;датчик фазы
Key	equ 3				;кнопка управления
Out	equ 1				;выход управления


	cblock 0x07
		Dimmer			;затемнение
		Flag_ON			;флаг состояния 0 - выключено, FF - включено
		Time_KEY		;время удержания кнопки в 20 мс интервалах
		TMR			;переменная для временной задержки
		TMR_MC			;переменная для временной задержки
		Time_Z0			;переменная для задержки при выключении
	endc

		org 0x00
		GOTO MAIN

		;org 0x100

MAIN ;------------------Инициализация начальные установки------------------------------------------


		;настройка порта B
		CLRF PORTB		;порт B в ноль
 		MOVLW B'11111101'	;RB1 на вывод , остальные на ввод
 		TRIS  PORTB

 		MOVLW B'11000000'	; отключаем активные нагрузки
 		OPTION
            
;----------------------Начальные установки---------------------------------------------------------

		MOVLW D'255'		
		MOVWF Dimmer
		CLRF PORTB		;порт B в ноль
		CLRF Time_KEY		;время удержания кнопки
		CLRF Time_Z0
		CLRF Flag_ON		;флаг состояния 0 - выключено, если сброс по питанию


;-------Задержка для стабилизации и зарядки источника питания--------------------------------------
		MOVLW D'100'			; 2 секунды	
		MOVWF TMR
		BTFSS PORTB, Sync		;ждем Sync=1
		GOTO $-1
		CLRWDT				;сбрасываем WDT
		BTFSC PORTB, Sync		;ждем Sync=0
		GOTO $-1
		CLRWDT				;сбрасываем WDT
		DECFSZ TMR,F
		GOTO $-7



WORK_CYCLE ;--------------------------Рабочий цикл-------------------------------------------------
		CLRWDT				;сбрасываем WDT
		BTFSC PORTB, Sync		;ждем Sync=0
		GOTO $-1
		CLRWDT				;сбрасываем WDT
		BTFSS PORTB, Sync		;ждем Sync=1
		GOTO $-1
		CLRWDT				;сбрасываем WDT


		;если задержка максимальна, ничего не включаем
		INCF Dimmer, W
		BTFSC STATUS, Z
		GOTO END_WORK_CYCLE		

		;задержка 1 мс для питания устройства остаточным напряжением
		CALL Time1mc		;задержка 1 мс	

		;проверяем, есть ли дополнительная задержка
		MOVF Dimmer, W		
		BTFSC STATUS, Z		
		GOTO NO_DIMMER

		;Дополнительная задержка от 0 до 8 мс для изменения напряжения
		MOVWF TMR_MC
		MOVLW D'7'		
		MOVWF TMR
		DECFSZ TMR,F
		GOTO $-1
		NOP
		NOP
		NOP
		DECFSZ TMR_MC,F
		GOTO $-8

NO_DIMMER	;запускаем триак

		;импульс 100 мкс
		BSF PORTB, Out
		CALL TimeIMP		;задержка 100 мкс
		BCF PORTB, Out

		;задержка 10 мс для второй полуволны
		CALL Time1mc		;задержка 1 мс	
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CLRWDT			;сбрасываем WDT
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс
		CALL Time1mc		;задержка 1 мс

		;импульс 100 мкс
		BSF PORTB, Out
		CALL TimeIMP		;задержка 100 мкс
		BCF PORTB, Out

		CALL Time100mkc		;Задержка для стабилизации порта
		CALL Time100mkc		;и завершения переходных процессов после включения триака

END_WORK_CYCLE ;-----------------------------------------------------------------------------------

KEY_SCAN ;-----------------Обработка нажатий на кнопку---------------------------------------------
		;проверяем нажатие кнопки
		BTFSC PORTB, Key
		GOTO KEY_OFF

KEY_ON		;Кнопка нажата
		INCF Time_KEY, W 	;Добавляем время удержания, до 255
		BTFSS STATUS, Z
		INCF Time_KEY, F 	
		GOTO END_KEY_SCAN

KEY_OFF		;Кнопка отжата
		;проверяем => 4
		MOVLW D'4'
		SUBWF Time_KEY,W
		BTFSC STATUS, C
		COMF Flag_ON, F		;изменяем флаг состояния
		CLRF Time_KEY 		;обнуляем время удержания
END_KEY_SCAN ;-------------------------------------------------------------------------------------

LOGIC ;-----------------Логическая часть-----------------------------------------------------------
		;проверяем состояние устройства
		MOVF Flag_ON, F		
		BTFSC STATUS, Z		
		GOTO DEVICE_OFF

DEVICE_ON 	;включено
		MOVF Dimmer, W			;уменьшаем до 0		
		BTFSS STATUS, Z		
		DECF Dimmer, F
		GOTO END_LOGIC

DEVICE_OFF	;выключено
		BSF Dimmer, 7			;сразу увеличиваем на 128, остальное за 50 секунд
		INCF Time_Z0, F
		MOVLW D'20'
		SUBWF Time_Z0, W
		BTFSS STATUS, Z
		GOTO END_LOGIC

DEVICE_1S	;изменяем раз в секунду 
		CLRF Time_Z0
		INCF Dimmer, W			;увиличиваем до 255 		
		BTFSS STATUS, Z		
		INCF Dimmer, F
		GOTO END_LOGIC

END_LOGIC 	GOTO WORK_CYCLE;---------------------------------------------------------------
		

;---------------------Подпрограмма задержки на импульс (98 мкс Fosc=4 mG)---------------------- 
TimeIMP
	MOVLW D'31'		
	MOVWF TMR
	DECFSZ TMR,F
	GOTO $-1
	RETURN
;----------------------------------------------------------------------------------------------- 

;---------------------Подпрограмма задержки на (100 мкс Fosc=4 mG)---------------------- 
Time100mkc
	MOVLW D'31'		
	MOVWF TMR
	DECFSZ TMR,F
	GOTO $-1
	NOP
	NOP
	RETURN
;----------------------------------------------------------------------------------------------- 

;---------------------Подпрограмма задержки на  (1 мс Fosc=4 mG)-------------------------------- 
Time1mc	
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL Time100mkc
	CALL TimeIMP
	RETURN
;----------------------------------------------------------------------------------------------- 
	END


