;******************************************************************************************
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H20.01.06
;   History      :
;   Description  :  50Hz Only
;******************************************************************************************
;   Define I/O
;     GP0:botton 1 
;     GP1:botton 2
;     GP2:botton 3
;     GP4:Synchronized AC-line clock signal 
;     GP5:Triac trigger control signal
;******************************************************************************************
; 注意！！！
;   電源電圧の微妙な違いによるフォトカプラの動作点の違いや、内部ＯＳＣの精度的な問題により
;   PI_MAX、PI_MIN、PI_JMINの微調整が必要になる可能性がある。(0 < PI_MIN < PI_MAX < 5A)
;     PI_MAX;  暗くしていった時に、最大の暗さを超えて、さらに点滅が始まるまで調整ができて
;              しまう場合には値を小さくする
;     PI_MIN;  明るくしていった時に、最大の明るさを超えて、さらに点滅が始まるまで調整ができ
;              てしまう場合には値を大きくする
;     PI_JMIN; 中途半端な暗さや明るさになる時は、値を前後する
;
;******************************************************************************************
#DEFINE	PI_MAX	H'50'
#DEFINE	PI_MIN	H'0A'
#DEFINE	PI_JMIN	H'0A'
	LIST	P=PIC12F683,ST=OFF,R=DEC
	INCLUDE	"P12F683.inc"
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF 
;
WATNUM	EQU	20H
TLP0	EQU	21H
TLP1	EQU	22H
NLP0	EQU	23H
NLP1	EQU	24H
WLP0	EQU	25H
WLP1	EQU	26H
WLP2	EQU	27H
WLP3	EQU	28H
LP0	EQU	29H
TMP1	EQU	2AH
TMP2	EQU	2BH
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	BSF	STATUS,RP0	; BANK1を選択
	BSF	OSCCON,6	; 8MHzを設定
	BSF	OSCCON,5	; 8MHzを設定
	BSF	OSCCON,4	; 8MHzを設定
	NOP
	NOP
	BCF	STATUS,RP0	; BANK0を選択
	MOVLW	07H		; BANK0でデジタルIO設定
	MOVWF	CMCON0		; BANK0でデジタルIO設定
	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0	; BANK1を選択
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'011111'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
;
	MOVLW	PI_MAX
	MOVWF	WATNUM
MAIN
; ****************************
;  1.明るさ変数を設定する
; ****************************
;  (1)ボタンをチェックして明るさ変数を設定
	CALL	BOTACT

; ****************************
;  2.10周期だけサイン波を出力する
; ****************************
; ----------------------------
;  0.初期設定
; ----------------------------
	MOVLW	H'0A'
	MOVWF	LP0

; ----------------------------
;  1.ＳＩＮ波のプラス側処理
; ----------------------------
MAIN2A
;  (1)ＳＩＮ波のプラス側スタートを検知する
	BTFSS	GPIO,4
	GOTO	MAIN2A

;  (2)設定時間だけ待つ
	CALL	SETWTTIM

;  (3)トライアックをトリガする
	CALL	TRGPLSON

; -----------------------------
;  2.ＳＩＮ波のマイナス側処理
; -----------------------------
MAIN2B
;  (1)ＳＩＮ波のマイナス側スタートを検知する
	BTFSC	GPIO,4
	GOTO	MAIN2B

;  (2)マイナスのタイミングを補正(PPLS-END <=> MPLS-STA間が必要)
	CALL	WATMIN

;  (3)設定時間だけ待つ
	CALL	SETWTTIM

;  (4)トライアックをトリガする
	CALL	TRGPLSON

; -----------------------------
;  3.ループ処理
; -----------------------------
	DECFSZ	LP0,F
	GOTO	MAIN2A 

	GOTO	MAIN



;******************************************************************************************
;   Function Name : BOTACT
;   Title         : ボタンが押された時の動作 
;   Input         : 
;   Output        : 
;   Description   :
;******************************************************************************************
BOTACT
; --------------------------------------------
;  0.ボタン(PORT0)が押された時のアクション
; --------------------------------------------
	BTFSS	GPIO,0
	GOTO	BOTACT1
;
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	CALL	ADDNUM
	RETLW	H'00'

; --------------------------------------------
;  1.ボタン(PORT1)が押された時のアクション
; --------------------------------------------
BOTACT1
	BTFSS	GPIO,1
	GOTO	BOTACT2
;
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	CALL	DECNUM
	RETLW	H'01'

; --------------------------------------------
;  2.ボタン(PORT2)が押された時のアクション
; --------------------------------------------
BOTACT2
	BTFSS	GPIO,2
	RETLW	H'00'
;
	MOVLW	PI_MAX
	MOVWF	WATNUM
	RETLW	H'02'

;******************************************************************************************
;   Function Name : ADDNUM
;   Title         : 明るくする 
;   Input         : 
;   Output        : 
;   Description   :
;******************************************************************************************
ADDNUM
	MOVFW	WATNUM
	XORLW	PI_MIN
	BTFSC	STATUS,Z
	GOTO	ADDNUM1
;
	DECF	WATNUM,F
	RETLW	H'00'
ADDNUM1
	MOVLW	PI_MIN
	MOVWF	WATNUM
	RETLW	H'01'

;******************************************************************************************
;   Function Name : DECNUM
;   Title         : 暗くする 
;   Input         : 
;   Output        : 
;   Description   :
;******************************************************************************************
DECNUM
	MOVFW	WATNUM
	MOVWF	TMP1
	MOVLW	PI_MAX
	SUBWF	TMP1,F
	BTFSC	STATUS,C
	GOTO	DECNUM1
;
	MOVLW	H'01'
	ADDWF	WATNUM
	RETLW	H'00'
DECNUM1
	MOVLW	PI_MAX
	MOVWF	WATNUM
	RETLW	H'01'

;******************************************************************************************
;   Function Name : TRGPLSON
;   Title         : トリガパルスを出力する 
;   Input         : 
;   Output        : 
;   Description   :
;******************************************************************************************
TRGPLSON
; ********************************
;  1.トリガパルスを出力
; ********************************
	BSF	GPIO,5

; ********************************
;  2.Ｗａｉｔ
; ********************************
	CALL	TRGPLSWT

; ********************************
;  3.トリガパルスを戻す
; ********************************
	BCF	GPIO,5
;
	RETLW	H'00'


;******************************************************************************************
;   Function Name : TRGPLSWT
;   Title         : トリガパルス(WAIT) 
;   Input         : 
;   Output        : 
;   Description   :  0.5mS(1/20 f)でトリガしている
;                   ※8MHz/4==(200)==> 10KHz ==(10)==> 1KHz
;******************************************************************************************
TRGPLSWT
	MOVLW	H'0A'
	MOVWF	TLP1
TRGPLSWTB
	MOVLW	H'14'
	MOVWF	TLP0
TRGPLSWTA
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	TLP0,F
	GOTO	TRGPLSWTA 
	DECFSZ	TLP1,F
	GOTO	TRGPLSWTB

	RETLW	H'00'

;******************************************************************************************
;   Function Name : WATMIN
;   Title         : マイナスパルスの補正 
;   Input         : 
;   Output        : 
;   Description   :  1mS(1/10f)
;                   ※8MHz/4==(200)==> 10KHz ==(PI_JMIN)==> マイナス補正
;******************************************************************************************
WATMIN
	MOVLW	PI_JMIN
	MOVWF	NLP1
WATMINB
	MOVLW	H'14'
	MOVWF	NLP0
WATMINA
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	NLP0,F
	GOTO	WATMINA 
	DECFSZ	NLP1,F
	GOTO	WATMINB

	RETLW	H'00'

;******************************************************************************************
;   Function Name : SETWTTIM
;   Title         : 設定時間だけ待つ(50Hz用) 
;   Input         : WATNUM ; 0 <= WATNUM < 100(90) 
;                            1 WATNUM = 100μS(0.000,1[S])
;   Output        : 
;   Description   : 
;                   ※8MHz/4==(200)==> 10KHz(100μS)
;******************************************************************************************
SETWTTIM
	MOVFW	WATNUM
	MOVWF	WLP1
SETWTTIM1
	MOVLW	H'14'
	MOVWF	WLP0
SETWTTIM0
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	WLP0,F
	GOTO	SETWTTIM0 
	DECFSZ	WLP1,F
	GOTO	SETWTTIM1 

	RETLW	H'00'

	END