;オートバイウインカー制御		bitメカ工房		2017-05-18(木)
;
;メーターVer2を流用修正使用する｡(PICは88→16F630に変更)
;　修正箇所は多い｡(ｵｼﾚｰﾀｰ周波数が異なる｡PWM機能無しなど｡)
;
;[プログラム概要]
; ･オートバイ用ウインカー制御プログラム｡
; ･ハザード点滅制御する｡
; ･ウインカー点滅制御する｡
; ･80km/h以上のスピードは点滅間隔を早くする｡
; ･ポジション点灯制御する｡
;
; ･オシレーターは内部 RC 4MHzを使用する｡
;　　タイマー1(16bit)のプリスケーラを1:8設定にして､点滅時間はタイマー1の
;　　Hiバイトで調整する｡
;　　オーバーフロー時間：1/4000000*4*256*256*8=0.524288秒
;　　
; ･タイマー0(8bit)は前ウインカーのポジション用としてPWM風に使用する｡
;　　プリスケールを1:2に設定して
;　　オーバーフロー時間：1/4000000*4*256*2=0.000512秒
;
;[PIC選定その他仕様]
;			     ┌─┰─┐
;	5.0V		 Vdd ┥	     ┝ Vss	GND
;	ハザード入力	 RA5 ┥	     ┝ RA0	左後出力
;	右ウインカー入力 RA4 ┥PIC   ┝ RA1	右後出力
;	左ウインカー入力 RA3 ┥16F630┝ RA2	後赤出力
;	ポジション入力	 RC5 ┥	     ┝ RC0	左前出力
;	(未接続)	 RC4 ┥	     ┝ RC1	右前出力
;	80km/h信号入力	 RC3 ┥	     ┝ RC2	前左右同時出力
;			     └───┘
;
; ･MCLRは外配線を簡略するため内部接続モードとする｡
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
; CVASM16アセンブラ用記述
;-------PICコンフィギュレーション設定---;

	include	'16f630.inc'

	fuses	_cpd_off		;eepromのコードプロテクト→無効
	fuses	_cp_off			;コードプロテクト→無効
	fuses	_boden			;低電圧リセット→有効
	fuses	_mclre_off		;MCLR端子(リセット)→設定しない
	fuses	_pwrte_on		;電源投入72ms間リセット→有効
	fuses	_wdt_off		;ウォッチドックタイマー→無効
	fuses	_intrc_osc_noclkout	;オシレーター設定→内蔵RC

	id	'0100'			;Ver1.00


;-------プログラムメモリー割当----------;

mIN_b		=	20h		;点灯初回判定用

;-------代入数設定----------------------;

;vON_T		=	61		;★点灯時間設定(0.4秒)
;vOFF_T		=	139		;★消灯時間設定(0.24秒)点灯の3/5

;vON2_T		=	110		;★点灯時間設定(0.3秒)
;vOFF2_T	=	168		;★消灯時間設定(0.18秒)点灯の3/5

;実測すると1割くらい早いので修正する｡
vON_T		=	39		;★点灯時間設定(0.4秒)
vOFF_T		=	126		;★消灯時間設定(0.24秒)点灯の3/5

vON2_T		=	93		;★点灯時間設定(0.3秒)
vOFF2_T		=	158		;★消灯時間設定(0.18秒)点灯の3/5


;=======プログラム初期設定==============;

	jmp	rSTART			;

;=======================================;
;*******割込****************************;

	org	4			;割込

	clrb	tmr1if			;タイマー1の旗クリアー

rHAZARD
	jnb	mIN_b.0,rWINK_L		;ハザード動作中か？
	xor	rc,#00000011b		;前右左 点滅
	xor	ra,#00000011b		;後右左 点滅
	jmp	rT_SET			;

rWINK_L
	jnb	mIN_b.1,rWINK_R		;左ウインカー動作中か？
	and	rc,#00000001b		;念のため(誤点灯)他のbit消灯
	and	ra,#00000001b		;念のため(誤点灯)他のbit消灯
	xor	rc,#00000001b		;前左 点滅
	xor	ra,#00000001b		;後左 点滅
	jmp	rT_SET			;

rWINK_R
	jnb	mIN_b.2,rRETI		;右ウインカー動作中か？
	and	rc,#00000010b		;念のため(誤点灯)他のbit消灯
	and	ra,#00000010b		;念のため(誤点灯)他のbit消灯
	xor	rc,#00000010b		;前右 点滅
	xor	ra,#00000010b		;後右 点滅
;	jmp	rT_SET			;

rT_SET
;	test	rc			;点灯状態か？消灯状態か?
;	jz	rW_CHK			;

	jb	rc.0,rW_CHK		;↑test後rc_bitﾁｪｯｸｼﾞｬﾝﾌﾟ不具合発生
	jb	rc.1,rW_CHK		;

	jb	rc.3,r80OFF		;80km/h以上か？
	mov	tmr1h,#vOFF_T		;消灯時間設定(L)
	jmp	rRETI			;
r80OFF
	mov	tmr1h,#vOFF2_T		;消灯時間設定(H)
	jmp	rRETI			;

rW_CHK
	jb	rc.3,r80ON		;80km/h以上か？
	mov	tmr1h,#vON_T		;点灯時間設定(L)
	jmp	rRETI			;
r80ON
	mov	tmr1h,#vON2_T		;点灯時間設定(H)

rRETI
	reti				;

;***************************************;
;=======================================;

rSTART
	clr	tmr1l			;
	clr	tmr1h			;
	clr	ra			;
	clr	rc			;
	clr	mIN_b			;点灯初回判定メモリーをクリアー

	mov	intcon,#11000000b	;割り込み有効
	mov	t1con,#00110001b	;タイマー1 ON､プリスケール1:8
;	初期状態	0000 0000
					;bit7…-
					;bit6…ゲートアクティブの？
					;bit5～4…プリスケールレート【8】
					;bit3…0 タイマー1専用オシレーター
					;bit2…0 外部クロック同期
					;bit1…0 タイマー1クロックソース選択
					;bit0…1 タイマー1オン

	mov	cmcon,#00000111b	;コンパレーター設定
;	初期状態	-0-0 0000

;Bank 1
	setb	rp0			;ページ変更(Bank 1へ)

	mov	option_reg,#11010000b	;タイマー0設定､プリスケール1:2
;	初期状態	1111 1111

	mov	trisa,#00111000b	;RA3､4､5 は入力｡他は出力ピンに設定
;	初期状態	--11 1111
	mov	trisc,#00101000b	;RC3､5 は入力｡他は出力ピンに設定
;	初期状態	--11 1111

	setb	pie1.0			;タイマー1割込を設定

	clrb	rp0			;ページ変更(Bank 0へ戻す)


;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;

;ハンドルスイッチの状態チェック

rREPEAT
	jnb	ra.5,rNEXT1		;ハザード ONか？
	jb	mIN_b.0,rREPEAT		;初回判定
	mov	mIN_b,#00000001b	;
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	jnb	rc.3,rNH0		;80km/h以上か？
	mov	tmr1h,#vON2_T		;点灯時間設定
rNH0
	mov	rc,#00000011b		;初回は点灯させる
	mov	ra,#00000011b		;
	jmp	rREPEAT			;

rNEXT1
	jnb	ra.3,rNEXT2		;左ウインカー ONか？
	jb	mIN_b.1,rREPEAT		;初回判定
	mov	mIN_b,#00000010b	;
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	jnb	rc.3,rNH1		;80km/h以上か？
	mov	tmr1h,#vON2_T		;点灯時間設定
rNH1
	mov	rc,#00000001b		;初回は点灯させる
	mov	ra,#00000001b		;
	jmp	rREPEAT			;

rNEXT2
	jnb	ra.4,rNEXT3		;右ウインカー ONか？
	jb	mIN_b.2,rREPEAT		;初回判定
	mov	mIN_b,#00000100b	;
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	jnb	rc.3,rNH2		;80km/h以上か？
	mov	tmr1h,#vON2_T		;点灯時間設定
rNH2
	mov	rc,#00000010b		;初回は点灯させる
	mov	ra,#00000010b		;
	jmp	rREPEAT			;

rNEXT3
	jnb	rc.5,rCLEAR		;ポジションスイッチ ONか？

	cja	tmr0,#50,rCLEAR		;PWM風制御

	mov	rc,#00000100b		;前左右同時点灯
	mov	ra,#00000100b		;後赤同時点灯

	jmp	rREPEAT			;

rCLEAR
	clr	rc			;全消灯
	clr	ra			;全消灯
	clr	mIN_b			;初回判定メモリーをクリアー
	jmp	rREPEAT			;メインループ最初へ


;***[ メインループここまで ]************;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;
