;オートバイ排気管バルブテスト Ver 1.0	bitメカ工房		2010-07-05(月)
;
;[プログラム概要]
; ･オートバイの自作排気管バルブをラジコンサーボにて､
;　　手動ボタン開閉及び開度表示するプログラム｡
;
; ･7セグメントLED【カソードコモン(GND共通)】で表示する｡
; ･設定開度は5ﾟ刻みとする｡(0､5､10､15､20､25､30､35…90)
; ･2桁表示とするが､ダイナミック点灯は使用せず､通常点灯とする｡
; ･1桁目は｢0｣または｢5｣のどちらかなので､1ピン信号で切替表示するように､
;　　米粒6ピンPICで作成する｡
;
; 2桁目のLED配置
;
;	　　Ａ		     - E C D B G A F
;	　　─		rb,# X X X X X X X X b
;	Ｆ│Ｇ│Ｂ	
;	　　─		0/   0 1 1 1 1 0 1 1
;	Ｅ│　│Ｃ	1/   0 0 1 0 1 0 0 0
;	　　─　	2/   0 1 0 1 1 1 1 0
;	　　Ｄ		3/   0 0 1 1 1 1 1 0
;			4/   0 0 1 0 1 1 0 1
;			5/   0 0 1 1 0 1 1 1
;			6/   0 1 1 1 0 1 1 1
;			7/   0 0 1 0 1 0 1 1
;			8/   0 1 1 1 1 1 1 1
;			9/   0 0 1 1 1 1 1 1
;
;
;・4MHzの水晶発信器を使用する｡(1命令時間は1/4000000x4=0.000001秒)
;
;　　 　1.5ms(±0.5ms)
;　5V　┌―┐　　　　　┌―┐
;　　　｜　｜　　　　　｜　｜
;　　　｜　｜　　　　　｜　｜
;　0V　┘　└―――――┘　└――
;　　　 ←　　19ms　　→
;
;・タイマー1(16bit)のオーバーフローで1パルス周期19ms(0.019秒)をカウントする｡
;　インターネットで検索すると､周期が短いほどトルクがアップするようだが､
;　フタバサーボの実測値(19ms)が掲載されていたので､それを使用することにする｡
;　1/4000000x4x256x【74】=0.018944秒(プリスケールは｢1｣)
;
;・パルス1山時間(1～2mS)はタイマー0でカウントする｡
;　プリスケールを｢8｣とすると､【1.5ms】の場合187.5回になる｡
;　ニュートラルを【187】とする｡
;　1/4000000*4*8*187=0.001496秒
;
;
;[PIC選定その他仕様]
; ･PIC16F88-I/P使用｡(秋月電子通商で230円/個)
;			     ┌─┰─┐
;	サーボ信号	 RA2 ┥	     ┝ RA1	ボタン右
;	(未使用)	 RA3 ┥	     ┝ RA0	ボタン左
;	(未使用)	 RA4 ┥	     ┝ RA7	水晶
;			MCLR ┥PIC   ┝ RA6	(未使用)
;			 Vss ┥ 16F88┝ Vdd	5.0V
;	7LED_F		 RB0 ┥	     ┝ RB7	7LED_1桁目_ON･OFF
;	7LED_A		 RB1 ┥	     ┝ RB6	7LED_E
;	7LED_G		 RB2 ┥	     ┝ RB5	7LED_C
;	7LED_B		 RB3 ┥	     ┝ RB4	7LED_D
;			     └───┘
;
;[プログラムの基本流れ概要]
;
;	押しボタンチェック
;	↓
;	サーボ信号の1山時間設定及び送信
;	↓
;
;　　↑	19ms待つ
;　　└ リターン
;
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
; CVASM16アセンブラ用記述
;-------PICコンフィギュレーション設定---;

	include	'16f88.inc'

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

;	fuses	_ieso_off		;　内部/外部スイッチオーバーモード？
;	fuses	_fcmen_off		;　フェイルセーフクロックモニター？

	id	'0101'			;Ver1.01

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

mB_TIME		=	20h		;押しボタンタイムカウンター
mSERVO		=	21h		;
mPOINT		=	22h		;押しボタンカウンター


;=======プログラム開始==================;
;-------初期設定(電源ON時)--------------;

	clr	ra			;
	clr	rb			;

;(Bank 0)
	mov	t1con,#00000001b	;bit7…設定項目無し
					;bit6…0 オシレーター選択
					;bit5～4…プリスケールレート【1】
					;bit3…1 タイマー1オシレーター制御
					;bit2…0 外部クロック同期
					;bit1…0 タイマー1クロックソース選択
					;bit0…1 タイマー1オン

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

;(Bank 1)
	mov	option_reg,#00000010b	;bit7…0 RBプルアップ【無】
					;bit6…割り込みエッジ
					;bit5…0 タイマー0は内蔵クロック使用
					;bit4…タイマー0エッジ
					;bit3…プリスケーラはタイマー0へ割当
					;bit2～0…プリスケールレート【8】

	mov	trisa,#11111011b	;RAの入出力ピン設定
	mov	trisb,#00000000b	;RBの入出力ピン設定
	mov	ansel,#00000000b	;RBはすべてデジタルピンに設定

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


	clr	tmr1l			;
	clrb	tmr1if			;


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

	clr	mB_TIME			;
	clr	mPOINT			;
	mov	mSERVO,#128		;0ﾟ
	mov	rb,#01111011b		;
	jmp	rPULSE			;

rREPEAT

;サーボ長周期(19ms)
	mov	tmr1h,#182		;256-74=182


;ボタンチェック-------------------------;
	jnb	ra.0,rBT_CHK		;
	jnb	ra.1,rBT_CHK		;
;ボタン押しなければ､ボタンカウンタータイマーをリセット
	clr	mB_TIME			;
	jmp	rPULSE			;


;ボタンカウンター早過ぎ防止(19msを12回に1回ボタンチェックする)
rBT_CHK
	inc	mB_TIME			;+1
	cje	mB_TIME,#1,rB_L		;

	cjb	mB_TIME,#12,rPULSE	;12未満
	clr	mB_TIME			;
	jmp	rPULSE			;

;左ボタンチェック(閉)
rB_L	jb	ra.0,rB_R		;
	test	mPOINT			;
	jz	rPULSE			;下限無効
	dec	mPOINT			;-1
	jmp	rCHANGE			;

;右ボタンチェック(開)
rB_R
	jb	ra.1,rPULSE		;
	cjae	mPOINT,#18,rPULSE	;上限無効
	inc	mPOINT			;+1


;ボタンカウンター変換テーブル
rCHANGE
	cjne	mPOINT,#0,$+6		;(4Words)
	mov	mSERVO,#128		;0ﾟ

	cjne	mPOINT,#1,$+6		;(4Words)
	mov	mSERVO,#135		;

	cjne	mPOINT,#2,$+6		;(4Words)
	mov	mSERVO,#141		;

	cjne	mPOINT,#3,$+6		;(4Words)
	mov	mSERVO,#148		;

	cjne	mPOINT,#4,$+6		;(4Words)
	mov	mSERVO,#154		;

	cjne	mPOINT,#5,$+6		;(4Words)
	mov	mSERVO,#161		;

	cjne	mPOINT,#6,$+6		;(4Words)
	mov	mSERVO,#167		;

	cjne	mPOINT,#7,$+6		;(4Words)
	mov	mSERVO,#174		;

	cjne	mPOINT,#8,$+6		;(4Words)
	mov	mSERVO,#180		;

	cjne	mPOINT,#9,$+6		;(4Words)
	mov	mSERVO,#187		;45ﾟ

	cjne	mPOINT,#10,$+6		;(4Words)
	mov	mSERVO,#194		;

	cjne	mPOINT,#11,$+6		;(4Words)
	mov	mSERVO,#200		;

	cjne	mPOINT,#12,$+6		;(4Words)
	mov	mSERVO,#207		;

	cjne	mPOINT,#13,$+6		;(4Words)
	mov	mSERVO,#213		;

	cjne	mPOINT,#14,$+6		;(4Words)
	mov	mSERVO,#220		;

	cjne	mPOINT,#15,$+6		;(4Words)
	mov	mSERVO,#226		;

	cjne	mPOINT,#16,$+6		;(4Words)
	mov	mSERVO,#233		;

	cjne	mPOINT,#17,$+6		;(4Words)
	mov	mSERVO,#239		;

	cjne	mPOINT,#18,$+6		;(4Words)
	mov	mSERVO,#246		;90ﾟ

;7LED表示

	cjne	mSERVO,#128,rNEXT05	;0ﾟ
	mov	rb,#01111011b		;

rNEXT05
	cjne	mSERVO,#135,rNEXT10	;5ﾟ
	mov	rb,#11111011b		;

rNEXT10
	cjne	mSERVO,#141,rNEXT15	;10ﾟ
	mov	rb,#00101000b		;

rNEXT15
	cjne	mSERVO,#148,rNEXT20	;15ﾟ
	mov	rb,#10101000b		;

rNEXT20
	cjne	mSERVO,#154,rNEXT25	;20ﾟ
	mov	rb,#01011110b		;

rNEXT25
	cjne	mSERVO,#161,rNEXT30	;25ﾟ
	mov	rb,#11011110b		;

rNEXT30
	cjne	mSERVO,#167,rNEXT35	;30ﾟ
	mov	rb,#00111110b		;

rNEXT35
	cjne	mSERVO,#174,rNEXT40	;35ﾟ
	mov	rb,#10111110b		;

rNEXT40
	cjne	mSERVO,#180,rNEXT45	;40ﾟ
	mov	rb,#00101101b		;

rNEXT45
	cjne	mSERVO,#187,rNEXT50	;45ﾟ
	mov	rb,#10101101b		;

rNEXT50
	cjne	mSERVO,#194,rNEXT55	;50ﾟ
	mov	rb,#00110111b		;

rNEXT55
	cjne	mSERVO,#200,rNEXT60	;55ﾟ
	mov	rb,#10110111b		;

rNEXT60
	cjne	mSERVO,#207,rNEXT65	;60ﾟ
	mov	rb,#01110111b		;

rNEXT65
	cjne	mSERVO,#213,rNEXT70	;65ﾟ
	mov	rb,#11110111b		;

rNEXT70
	cjne	mSERVO,#220,rNEXT75	;70ﾟ
	mov	rb,#00101011b		;

rNEXT75
	cjne	mSERVO,#226,rNEXT80	;75ﾟ
	mov	rb,#10101011b		;

rNEXT80
	cjne	mSERVO,#233,rNEXT85	;80ﾟ
	mov	rb,#01111111b		;

rNEXT85
	cjne	mSERVO,#239,rNEXT90	;85ﾟ
	mov	rb,#11111111b		;

rNEXT90
	cjne	mSERVO,#246,rPULSE	;90ﾟ
	mov	rb,#00111111b		;


;パルス1山信号--------------------------;

rPULSE
	setb	ra.2			; ON

;タイマー0で【0.0012秒】待つ(0.0012/0.000008=150)

	clr	tmr0			;
	cjbe	tmr0,mSERVO,$		;★時間までここで待つ

	clrb	ra.2			;パルス1山信号 OFF
	jmp	rWAIT19			;





;19ms待ち-----------------------------------;

rWAIT19
;タイマー1で0.019秒待つ

	jnb	tmr1if,$		;オーバーフローを待つ
	clrb	tmr1if			;

	jmp	rREPEAT			;




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



;-------PIC16F88初期状態確認(参考)------;(△:変更必要)
;Bank 0
;	tmr0		xxxxxxxx	;　タイマー0の状態
;	status		00011xxx	;　Bankセレクト設定､各旗の状態
;	porta		xxx00000	;△RAピン出力状態(xは不定)
;	portb		00xxxxxx	;△RBピン出力状態(xは不定)
;	intcon		0000000x	;△割り込み他､設定
;	pir1		-0000000	;　旗状態(A/D､タイマー､
;	pir2		00-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	;　
;	txsta		0000-010	;　
;	spbrg		00000000	;　
;	ansel		-1111111	;△アナログorデジタルI/O設定
;	cmcon		00000111	;　
;	cvrcon		000-0000	;　
;	adresl		xxxxxxxx	;　A/D変換値0～8bit
;	adcon1		00--0000	;　A/Dピン設定
;Bank 2
;	wdtcon		---01000	;△ウォッチドックタイマー分周
;	eedata		xxxxxxxx	;　EEメモリーの状態 Lo？
;	eeadr		xxxxxxxx	;　EEメモリーのアドレス位置 Lo
;	eedath		--xxxxxx	;　EEメモリーの状態 Hi？
;	eeadrh		-----xxx	;　EEメモリーのアドレス位置 Hi
;Bank 3
;	eecon1		x--xx000	;　EEメモリー関係設定
;	eecon2		--------	;　EEメモリー関係設定？

