|
前項までは、MIDIの受信ルーティンを解説した。実は、MIDIを読み込むためにはその他に色々と前準備が必要なので、話が前後してしまうがここでその部分の解説を行うことにする。02番目の頁で解説したように、プログラムの先頭部分
.org h'002e
.data.w int_scr3
において、int_scr3 と名前を付けた割り込みのアドレス設定を行ったが、この対象は、H'002E〜H'002F に割り振られている割り込みベクター SCI3 である。この割り込み発生元は、受信データフル、送信データエンプティ、送信終了、受信エラー となっていて、各要素が合致したときに、メイン・プログラムから割り込み処理のルーティンにジャンプする。では、次にジャンプ先の処理を解説しよう。この例ではメインプログラムの末尾に記載しているが、相対的な位置にはあまり拘る必要はないだろう。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Exception handling routines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
int_scr3:
push.l er0
bclr #6,@scr3 ;Desable Receive interrupt
mov.b @rdr,r0h ;get midi rx
btst #5,@ssr
bne rx_err ;jump if error has occured
mov.b r0h,@(rx_fifo,er5) ;rx to fifo
inc.w #1,r5
bclr #1,r5h
bra rx_ok
rx_err:
mov.b @ssr,r0l
mov.b #H'80,r0l
mov.b r0l,@ssr ;clearing the error
rx_ok:
bset #6,@scr3 ;enable receive int
pop.l er0
rte
最初にレジスタの内容をメモリーに待避した後、 SCR3 の受信割り込みを制限している。シリアル・データ・リード・レジスターから、r0h に受信データを読み出し、エラーをチェック、読み出した内容を、rx_fifo に保管している。 rx_fifo のアドレスはレジスタへの記録後、1番地進められ、オーヴァーフローのチェックを行ってルーティンを完了。受信割り込みを復活させて、待避していたレジスタの内容を戻して割り込みルーティンを終了、メインプログラムに復帰する。
次に、シリアルインターフェイスとMIDI受信部の初期化ルーティンを解説しよう。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;SCI init
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sci_init:
mov.b #b'00000000,r0l
mov.b r0l,@scr3
mov.b #b'00000000,r0l
mov.b r0l,@smr
mov.b #15,r0l
mov.b r0l,@brr ; bitRateSet for 16MHz
mov.w #500,r0
_sci_wait:
dec.w #1,r0
bne _sci_wait
mov.b @ssr,r0l ; (dummy read)
mov.b #0,r0l
mov.b r0l,@ssr
mov.b #b'00000010,r0l ; TXD enable
mov.b r0l,@pmr1
rts
3052シリーズを使って工作した経験のある人は判ると思うが、TinyシリーズではSCI関連のレジスタが簡略化されている。上記のルーティンで行っているのは4段目までは単なる初期化だが、5段目は通信速度の設定である。サービスマニュアルのSCIの項目を検索すると、マスタークロックに対応した通信スピード設定表があるので16Mhzのところを確認すると、ビットレート31250bit/sec の処は 15 となっているので、これを一旦レジスタに代入した後、@brr に入力している。蛇足だが、ビットレート31250はMIDIの通信スピードである。 次に数値500を設定してこれを減算ループに入れてWaitルーティンをこなす。
なお、この後の赤字で示した部分は、Tinyシリーズでは必要がない項目となるが、H8で逆にこれを行わないと、レジスタのデータをリセット出来ない点に注意しよう。
ここでは、ssr から一度読み出しを行ってゼロ数値すなわち、リセットを入力している。 _sci_wait: 以前の ssr の状態は不明だが、一度レジスタの状態を読み出すことで、リセットが可能となるので、H8シリーズを使用する場合は立ち上げ時には必ず読み出しを行わなければならない。
|
最後に TxD の出力ポート設定を行っている。出力される場所はポート2だが、設定はpmr1で行われることに注意。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; MIDI rx start !
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
midi_start:
mov.b #b'01010000,r0l ; receive only 10100000 = Transmit Only
mov.b r0l,@scr3
mov.b @ssr,r0l ; (dummy read)
mov.b #0,r0l
mov.b r0l,@ssr
andc #b'01111111,ccr ; interrupt enable
rts
この部分はSCIの設定を行ってRxが受信体制に入るルーティンだ。最初の段では @scr3 レジスタの設定を行っている。各ビットの持つ機能を表に示す。
7
|
TIE 0 R/W トランスミットインタラプトイネーブル
|
セットすると、TXI 割り込み要求がイネーブル
|
6
|
RIE 0 R/W レシーブインタラプトイネーブル
|
セットすると、RXI およびERI 割り込み要求がイネーブル
|
5
|
TE 0 R/W トランスミットイネーブル
|
ビットが1 のとき送信動作が可能
|
4
|
RE 0 R/W レシーブイネーブル
|
ビットが1 のとき受信動作が可能
|
3
|
MPIE 0 R/W
マルチプロセッサインタラプトイネーブル(調歩同期式モードでSMR/MP=1 のとき有効)
|
セットすると、マルチプロセッサビットが0の受信データを読みとばし、SSR のRDRF、FER、OER の各ステータスフラグのセットを禁止する。マルチプロセッサビットが1 のデータを受信すると、このビットは自動的にクリアされ通常の受信動作に戻る。今回この項目は関係なし
|
2
|
TEIE 0 R/W
トランスミットエンドインタラプトイネーブル
|
セットするとTEI 割り込み要求がイネーブルとなる
|
1
|
CKE1
|
クロックイネーブル1〜0/クロックソースを選択する。調歩同期式の場合
00:内部ボーレートジェネレータ
|
0
|
CKE0
|
クロック同期式の場合
00:内部クロック) となる。
|
主にMIDIに関係があるのはMSB4桁なので、詳しい説明は割愛する。レジスタ設定後、先ほどと同様に @ssr を一旦読み出したのち、リセットを入力、最後に ccr (コンディションコードレジスタ)のインターラプトをイネーブル(受け付け可能状態)にして受信設定を終了する。 赤字の項目についてだが、3664などのTinyシリーズでは Tx、Rx共に、ssr のフラグ・クリアが自動化されているので、この部分は必要がないかも知れない。 →参考文献
|
|