6-7 シリアル通信(送信側)


シリアルインターフェイスを使って、0〜99のデータを送信します。

注意

シリアル通信は、水晶発振で動作させてください。

受信は、次に掲載されいる「シリアル通信(受信側)」で行ってください。

53行目ではローバッテリ自動検出を禁止しています。実体は158行目以降のBattChkOnとBattChkOffです。

56行目では、シリアルインターフェイスの初期化を行っています。初期化の実体は95行目以降のルーチンです。非常に手間がかかるので、このロジックをそのままコピーして利用することをお勧めします。

初期化を行った後は、0.5秒ごとに発生するベースタイマー割り込みでカウンタをインクリメントします。このカウンタの数値をシリアルインターフェイスで送信します。

MODEボタンによりプログラムが中断されると、シリアルインターフェイスを規定の値に書き戻し(126行目からのSioEndルーチン)、ローバッテリ自動検出を有効にしてプログラムを終了します。

●GHEAD.ASM

001	chip	LC868700
002	world	external
003	; *-----------------------------------------------------*
004	; *	External header program Ver 1.00		*
005	; *					05/20-'98	*
006	; *-----------------------------------------------------*
007	
008	public	fm_wrt_ex_exit,fm_vrf_ex_exit
009	public	fm_prd_ex_exit,timer_ex_exit,_game_start,_game_end
010	other_side_symbol	fm_wrt_in,fm_vrf_in
011	other_side_symbol	fm_prd_in,timer_in,game_end
012	
013	extern	main			;ユーザープログラム側にあるシンボル
014	extern	int_BaseTimer		;ユーザープログラム側にあるシンボル
015	
016	; *-----------------------------------------------------*
017	; *	Vector table(?)					*
018	; *-----------------------------------------------------*
019	cseg
020	org	0000h
021	_game_start:
022	;reset:
023			jmpf	main		; main program jump
024	org	0003h
025	;int_03:
026			jmp	int_03
027	org	000bh
028	;int_0b:
029			jmp	int_0b
030	org	0013h
031	;int_13:
032			jmp	int_13
033	org	001bh
034	;int_1b:
035			jmp	int_1b
036	org	0023h
037	;int_23:
038			jmp	int_23
039	org	002bh
040	;int_2b:
041			jmp	int_2b
042	org	0033h
043	;int_33:
044			jmp	int_33
045	org	003bh
046	;int_3b:
047			jmp	int_3b
048	org	0043h
049	;int_43:
050			jmp	int_43
051	org	004bh
052	;int_4b:
053			jmp	int_4b
054	; *-----------------------------------------------------*
055	; *	interrupt programs				*
056	; *-----------------------------------------------------*
057	int_03:
058			reti
059	int_0b:
060			reti
061	int_13:
062			reti
063	int_23:
064			reti
065	int_2b:
066			reti
067	int_33:
068			reti
069	int_3b:
070			reti
071	; *-----------------------------------------------------*
072	int_43:
073			reti
074	int_4b:
075			clr1	p3int,1		;interrupt flag clear
076			reti
077	
078	org	0100h
079	; *-----------------------------------------------------*
080	; *	flash memory write external program		*
081	; *-----------------------------------------------------*
082	fm_wrt_ex:
083			change	fm_wrt_in
084		fm_wrt_ex_exit:
085			ret
086	org	0110h
087	; *-----------------------------------------------------*
088	; *	flash memory verify external program		*
089	; *-----------------------------------------------------*
090	fm_vrf_ex:
091			change	fm_vrf_in
092		fm_vrf_ex_exit:
093			ret
094	
095	org	0120h
096	; *-----------------------------------------------------*
097	; *	flash memory page read external program		*
098	; *-----------------------------------------------------*
099	fm_prd_ex:
100			change	fm_prd_in
101		fm_prd_ex_exit:
102			ret
103	
104	org	0130h
105	; *-----------------------------------------------------*
106	; *	flash memory => timer call external program	*
107	; *-----------------------------------------------------*
108	int_1b:
109	timer_ex:
110			push	ie
111			clr1	ie,7		;interrupt prohibition
112			change	timer_in
113		timer_ex_exit:
114			call	int_BaseTimer ; ユーザー側割り込み処理
115			pop	ie
116			reti
117	
118	org	01f0h
119	_game_end:
120			change	game_end
121	end
●TIMER1.ASM
001	; Tab width = 4
002	
003	;----------------------------------------------------------------------------
004	; ** シリアル通信サンプル1 (データ送信) **
005	;
006	; ・一定期間ごとにシリアル通信ポートから単純なデータを送信する
007	;----------------------------------------------------------------------------
008	; 1.01 990208 SEGA Enterprises,LTD.
009	;----------------------------------------------------------------------------
010	
011	chip	LC868700			; チップの種類をアセンブラに指定
012	world	external			; 外部メモリ用プログラム
013	
014	public	main				; ghead.asm から参照されるシンボル
015	public	int_BaseTimer		; ghead.asm から参照されるシンボル
016	
017	extern	_game_end			; アプリケーション終了
018	
019	
020	; **** システム定数の定義 ***************************************************
021	
022								; OCR(発振制御レジスタ)設定値
023	osc_rc		equ 04dh		;	システムクロックに内蔵RC発振を指定
024	osc_xt		equ 0efh		;	システムクロックに水晶発振を指定
025	
026	LowBattChk	equ 06eh		; ローバッテリ検出フラグ(RAMバンク0)
027	
028	
029	; *** データセグメント ******************************************************
030	
031			dseg				; データセグメント開始
032	
033	r0:		ds		1			; 間接アドレッシングレジスタ r0
034	r1:		ds		1			; 間接アドレッシングレジスタ r1
035	r2:		ds		1			; 間接アドレッシングレジスタ r2
036	r3:		ds		1			; 間接アドレッシングレジスタ r3
037			ds		12			; その他のレジスタ
038	
039	counter: ds		1			; カウンタ
040	
041	
042	; *** コードセグメント ******************************************************
043	
044			cseg				; コードセグメント開始
045	
046	; *-------------------------------------------------------------------------*
047	; * ユーザープログラム														*
048	; *-------------------------------------------------------------------------*
049	main:
050			push	PSW			; PSW値を退避
051			set1	PSW,1		; データRAMバンク1を選択
052	
053			call	BattChkOff	; ローバッテリ自動検出機能 OFF
054	
055	cwait:
056			call	SioInit		; シリアル通信の初期化
057			bz		start		; VM が接続されていればスタート
058	
059			ld		P3			; [M]ボタンチェック
060			bn		acc,6,finish ; [M]ボタンが押されていたらアプリ終了
061	
062			jmp		cwait		; VM が接続されるまで待機
063	start:
064	
065			set1	pcon,0		; 次の割り込みまで(0.5秒)HALTで待つ
066	
067			mov		#0,counter	; カウンタの値を0にリセット
068	loop0:
069			ld		counter		; カウンタの値を読み込む
070	
071			call	SioSend1	; 1byte送信する
072	
073			set1	pcon,0		; 次の割り込みまで(0.5秒)HALTで待つ
074	
075								; ** [M](モード)ボタンチェック **
076			ld		P3
077			bn		acc,6,finish ; [M]ボタンが押されていたらアプリ終了
078	
079			jmp		loop0		; 繰り返し
080	
081	finish:						; ** アプリケーション終了処理 **
082			call	SioEnd		; シリアル通信終了処理
083			call	BattChkOn	; ローバッテリ自動検出機能 ON
084			pop		PSW			; PSW値を復帰
085			jmp		_game_end	; アプリケーション終了
086	
087	; *-------------------------------------------------------------------------*
088	; * シリアル通信の初期化													*
089	; * 出力: acc = 0   : 正常終了												*
090	; *       acc = 0ffh: VM が接続されていない								*
091	; *-------------------------------------------------------------------------*
092	; シリアル通信の初期化
093	; システムクロックが水晶モードであることを前提としています。
094	
095	SioInit:
096								; **** VM同士の接続を確認 ****
097			ld		P7			; 接続状態の確認
098			and		#%00001101	; P70, P72, P73 をチェック
099			sub		#%00001000	; P70=0, P72=0, P73=1 か判定
100			bz		next2		; 接続されているときnext2へ
101		
102			mov		#0ffh,acc	; 接続されていないとき acc=0ffh として異常終了
103			ret					; SioInit終わり
104	next2:
105	
106								; **** シリアル通信の初期化 ****
107			mov		#0,SCON0	; LSBを先頭に出力するよう指定
108			mov		#0,SCON1	; LSBを先頭に入力するよう指定
109			mov		#088h,SBR	; 転送レートを設定する
110			clr1	P1,0		; P10ラッチをクリア(P10/SO0)
111			clr1	P1,2		; P12ラッチをクリア(P12/SCK0)
112			clr1	P1,3		; P13ラッチをクリア(P13/SO1)
113	
114			mov		#%00000101,P1FCR ; 端子機能設定
115			mov		#%00000101,P1DDR ; 端子機能設定
116	
117			mov		#0,SBUF0	; 転送バッファクリア
118			mov		#0,SBUF1	; 転送バッファクリア
119	
120			ret					; SioInit終わり
121	
122	
123	; *-------------------------------------------------------------------------*
124	; * シリアル通信の終了														*
125	; *-------------------------------------------------------------------------*
126	SioEnd:						; **** シリアル通信終了処理 ****
127	
128			mov		#0,SCON0	; SCON0 = 0
129			mov		#0,	SCON1	; SCON1 = 0
130			mov		#0bfh,P1FCR	; P1FCR = 0bfh
131			mov		#0a4h,P1DDR	; P1DDR = 0a4h
132	
133			ret					; SioEnd終わり
134	
135	
136	; *-------------------------------------------------------------------------*
137	; * シリアルポートから1byte送信する											*
138	; *   入力 acc: 送信データ													*
139	; *-------------------------------------------------------------------------*
140	SioSend1:					; **** 1byte送信する ****
141	
142			push	acc			; 送信データの退避
143			
144	sslp1:	ld		SCON0		; 前のデータの送信中なら待つ
145			bp		acc,3,sslp1 ; 
146			
147			pop		acc			; 送信データの復帰
148			
149			st		SBUF0		; 転送するデータをセットする
150			set1	SCON0,3		; 送信開始
151	
152			ret					; SioSend1終わり
153	
154	
155	; *-------------------------------------------------------------------------*
156	; *	ローバッテリ自動検出機能 ON												*
157	; *-------------------------------------------------------------------------*
158	BattChkOn:
159			push	PSW			; PSW値を退避
160	
161			clr1	PSW,1		; データRAMバンク0を選択
162			mov		#0,acc		; ローバッテリ検出をする(0)
163			st		LowBattChk	; ローバッテリ自動検出フラグ(RAMバンク0)
164	
165			pop		PSW			; PSW値を復帰
166			ret					; BattChkOn終わり
167	
168	
169	; *-------------------------------------------------------------------------*
170	; *	ローバッテリ自動検出機能 OFF											*
171	; *-------------------------------------------------------------------------*
172	BattChkOff:
173			push	PSW			; PSW値を退避
174	
175			clr1	PSW,1		; データRAMバンク0を選択
176			mov		#0ffh,acc	; ローバッテリ検出をしない(0ffh)
177			st		LowBattChk	; ローバッテリ自動検出フラグ(RAMバンク0)
178	
179			pop		PSW			; PSW値を復帰
180			ret					; BattChkOff終わり
181	
182	
183	; *-------------------------------------------------------------------------*
184	; *	ベースタイマ割り込みハンドラ											*
185	; *-------------------------------------------------------------------------*
186	int_BaseTimer:
187			push	PSW			; PSW値を退避
188			push	acc
189	
190			set1	PSW,1		; データRAMバンク1を選択
191			
192			inc		counter		; カウンタを進める
193			
194			ld		counter		; カウンタの値が..
195			bne		#100,next1	; 100でなければnext1
196			mov		#0,counter	; 100ならば0にリセット
197	next1:
198			pop		acc
199			pop		PSW			; PSW値復帰
200			
201			clr1	BTCR,1		; ベースタイマ割り込み要因クリア
202			ret					; ユーザー側割り込み処理終了

[]   [INDEX]   []

(C)SEGA ENTERPRISES, LTD., 1998