;オートバイウインカー制御 Ver 1.21	NAO TECHUNOHUT		2007-04-01(日)
;
;[プログラム概要]
; ･オートバイ用ウインカー制御プログラム｡
; ･ハザード点滅制御する｡
; ･ウインカー点滅制御する｡
; ･ポジション点灯制御する｡
;
; ･オシレーターは基本的に内部 RC 2MHzを使用する｡
;　　タイマー1(16bit)のプリスケーラを1:8設定にして､オシレーター微調整にて､
;　　オーバーフローを約1秒にする｡
;　　点滅時間はタイマー1のHiバイトで調整する｡
; ･タイマー0(8bit)はウォッチドックタイマーに使用する｡(初期設定のままで約2秒)
;
;
;[PIC選定その他仕様]
; ･PIC16F819-I/P使用｡(秋月電子通商で250円/個)
; ･MCLRは外配線を簡略するため内部接続モードとする｡
;			     ┌─┰─┐
;	左ウインカー入力 RA2 ┥	     ┝ RA1	ポジション入力
;	右ウインカー入力 RA3 ┥	     ┝ RA0	ハザード入力
;	動作確認用LED	 RA4 ┥	     ┝(#16)	(未使用)
;	(未使用)	(#04)┥PIC16 ┝(#15)	(未使用)
;			 Vss ┥  F819┝ Vdd	5.0V
;	左前出力	 RB0 ┥	     ┝ RB7	(未使用)
;	右前出力	 RB1 ┥	     ┝ RB6	右後出力
;	PWM出力		 RB2 ┥	     ┝ RB5	左後出力
;	(未使用)	 RB3 ┥	     ┝ RB4	後赤出力
;			     └───┘
;	※#04(RA5)は入力のみなので注意
;
;-------PIC初期状態確認-----------------;(▲:変更必要)
;Bank 0
;	tmr0		xxxxxxxx	;　タイマー0の状態
;	status		00011xxx	;　Bankセレクト設定､各旗の状態
;	porta		xxx00000	;▲RAピン出力状態(xは不定)
;	portb		xxxxxxxx	;▲RBピン出力状態(xは不定)
;	intcon		0000000x	;▲割り込み他､設定
;	pir1		-0--0000	;　旗状態(A/D､タイマー､
;	pir2		---0----	;　EEメモリー､他)
;	tmr1l		xxxxxxxx	;★タイマー1下位8bitの状態
;	tmr1h		xxxxxxxx	;★タイマー1上位8bitの状態
;	t1con		--000000	;▲タイマー1コントロール関係設定
;	tmr2		00000000	;★タイマー2の状態
;	t2con		-0000000	;▲タイマー2コントロール関係設定
;	sspbuf		xxxxxxxx	;　装置内通信SPI通信機能
;	sspcon		00000000	;　
;	ccpr1l		xxxxxxxx	;　
;	ccpr1h		xxxxxxxx	;　
;	ccp1con		--000000	;▲キャプチャ/コンペア/PWM
;	adresh		xxxxxxxx	;　A/D変換値9､10bit？
;	adcon0		000000-0	;　A/Dコントロール関係設定
;Bank 1
;	option_reg	11111111	;　プルアップ､プリスケーラー比率他､設定
;	trisa		11111111	;▲RAピンI/O制御設定(1は入力)
;	trisb		11111111	;▲RBピンI/O制御設定(1は入力)
;	pie1		-0--0000	;▲A/D､CCP､タイマー､EEメモリーの
;	pie2		---0----	;　割り込み使用するしない設定
;	pcon		------qq	;　パワーオン､低電圧リセットの？
;	osccon		-000-0--	;▲内部RCオシレーター周波数設定
;	osctune		--000000	;▲内蔵RCオシレーター微調整
;	pr2		11111111	;▲
;	sspadd		00000000	;　
;	sspstat		00000000	;　
;	adresl		xxxxxxxx	;　A/D変換値0～8bit
;	adcon1		00--0000	;▲A/Dピン設定
;Bank 2
;	eedata		xxxxxxxx	;　EEメモリーの状態 Lo？
;	eeadr		xxxxxxxx	;　EEメモリーのアドレス位置 Lo
;	eedath		--xxxxxx	;　EEメモリーの状態 Hi？
;	eeadrh		-----xxx	;　EEメモリーのアドレス位置 Hi
;Bank 3
;	eecon1		x--xx000	;　EEメモリー関係設定
;	eecon2		--------	;　EEメモリー関係設定？
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
; CVASM16アセンブラ用記述
;-------PICコンフィギュレーション設定---;

	include	'16f819.inc'

	fuses _intrc_io			;オシレーター設定→内蔵､ピンはra6設定
	fuses _wdt_on			;ウォッチドックタイマー→有効
	fuses _pwrte_on			;電源投入72ms間リセット→有効
	fuses _mclr_off			;MCLR端子(リセット)→設定しない
	fuses _boden_on			;低電圧リセット(約4V以下)→有効
	fuses _lvp_off			;低電圧プログミング(5V)→無効
	fuses _cpd_off			;eepromのコードプロテクト→無効
	fuses _wrt_enable_off		;eeconのFlashメモリ可能→しない
	fuses _debug_off		;インサーキットデバックモード→無効
	fuses _ccp1_rb2			;PWMピン選定(or_rb3)
	fuses _cp_off			;コードプロテクト→無効

	id	'0121'			;Ver1.21

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

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

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

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


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

	jmp	rSTART			;

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

	org	4			;割込

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

	xor	ra,#00010000b		;割り込み動作確認用LED

rHAZARD
	jnb	mIN_b.0,rWINK_L		;
	xor	rb,#01100011b		;
	jmp	rT_SET			;

rWINK_L
	jnb	mIN_b.2,rWINK_R		;
	xor	rb,#00100001b		;
	jmp	rT_SET			;

rWINK_R
	jnb	mIN_b.3,rP_TION		;
	xor	rb,#01000010b		;
	jmp	rT_SET			;

rP_TION
	jnb	mIN_b.1,rRETI		;
	mov	ccp1con,#00001100b	;PWMモードに設定
	mov	rb,#00010000b		;
	jmp	rRETI			;


rT_SET
	test	rb			;消灯状態(ゼロ)か?
	jz	rW_CHK			;
	mov	tmr1h,#vON_T		;点灯時間設定
	jmp	rRETI			;
rW_CHK
	mov	tmr1h,#vOFF_T		;消灯時間設定

rRETI
	clr	wdt			;ウォッチドックタイマー
	reti				;

;=======================================;

rSTART
	clr	wdt			;ウォッチドックタイマー
	clr	tmr1l			;
	clr	tmr1h			;
	clr	ra			;
	clr	rb			;
	clr	mIN_b			;点灯初回判定メモリーをクリアー

	mov	intcon,#11000000b	;割り込み有効
	mov	t1con,#00110001b	;タイマー1 ON､プリスケール1:8
	mov	t2con,#00000100b	;タイマー2 ON､プリスケール1:1
	mov	ccpr1l,#030		;★PWM/Loになるタイミング

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	trisa,#00001111b	;RA0～3は入力｡他は出力ピンに設定
	mov	trisb,#00000000b	;RBをすべて出力ピンに設定
	mov	osccon,#01010000b	;内蔵オシレーター周波数を2MHzに設定
	mov	osctune,#00001111b	;★最大=xx011111 最小=xx100000
	mov	adcon1,#00000110b	;すべてデジタルピンに設定

	setb	pie1.0			;タイマー1割込を設定
	mov	pr2,#100		;PWM周期

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


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

rREPEAT

;ハンドルスイッチチェック

	jnb	ra.0,rNEXT1		;ハザード(点滅)
	jb	mIN_b.0,rREPEAT		;初回判定
	mov	mIN_b,#00000001b	;
	clr	ccp1con			;PWMモードを解除
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	mov	rb,#01100011b		;初回は点灯させる
	jmp	rREPEAT			;

rNEXT1
	jnb	ra.2,rNEXT2		;左ウインカー(点滅)
	jb	mIN_b.2,rREPEAT		;初回判定
	mov	mIN_b,#00000100b	;
	clr	ccp1con			;PWMモードを解除
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	mov	rb,#00100001b		;初回は点灯させる
	jmp	rREPEAT			;

rNEXT2
	jnb	ra.3,rNEXT3		;右ウインカー(点滅)
	jb	mIN_b.3,rREPEAT		;初回判定
	mov	mIN_b,#00001000b	;
	clr	ccp1con			;PWMモードを解除
	clr	tmr1l			;
	mov	tmr1h,#vON_T		;点灯時間設定
	mov	rb,#01000010b		;初回は点灯させる
	jmp	rREPEAT			;

rNEXT3
	jb	ra.1,rNEXT3a		;【ポジションスイッチ不感帯対策】
	jnb	mIN_b.1,rCLEAR		;

	clr	tmr1l			;
	mov	tmr1h,#230		;約0.1秒を設定する
	cjne	tmr1h,#0,$		;割り込み入るまで待つ

	jb	ra.1,rNEXT3a		;ON判定
	jmp	rCLEAR			;OFF判定

rNEXT3a
	jb	mIN_b.1,rREPEAT		;切替初回判定
	mov	mIN_b,#00000010b	;
	clr	tmr1l			;
	mov	tmr1h,#vOFF_T		;点灯時間設定
	clr	rb			;ON直後は消灯させる
	jmp	rREPEAT			;

rCLEAR
	clr	rb			;全消灯
	clr	mIN_b			;初回判定メモリーをクリアー
	clr	ccp1con			;PWMモードを解除
	jmp	rREPEAT			;メインループ最初へ


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