*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
関連項目:

  
H8/3664
  
AKI-H8
  
PallarellPort増設
  
VHDL coding

  前の頁  次の頁
今回は、TxD のルーティンを紹介しよう。Tiny系では動作確認を完了していないが、3052の環境では実績のあるコードだ。

ここでは、レジスタ6を受信データのポインタとして使用している。


2005年7月18日現在、ようやく送信系の実装に成功した。以下、実装に際しての注意点を解説する。なおその際、他の項目と重複してしまうがシリアルインターフェイスの初期設定に関してもここで言及しておく。

r6/e6は送信データ用のポインタとして使用する。データの読み出しポイントを確認後、
,@ssr の TDRE フラッグを確認する。btst は、指定されたビットの状態を反転し、結果をCCRのゼロフラッグに反映する。CCR とは、コンディション・コード・レジスタ の略で、演算結果の状態を記憶するレジスタだ。bne CCR ゼロフラッグ を参照し、Z=0、すなわち、ゼロでない状態=一致しない場合に分岐する。この辺りの概念が直感的とはとても言えないところが、このマイコンの泣き所といえるだろう。 さて、分岐先では送信データを格納してあるバッファー、tx_fifo にアクセスし、データを tdr に転送する。H8シリーズでは本来ここで、ssr のフラッグをリセットしていたが、Tinyシリーズではこの作業は自動的に行われる事に注意しよう。
  1. tx_midi_check:
  2.     cmp.w r6,e6 ;r6: tx_top, e6: tx_end
  3.     bne _tx_exist
  4.     rts
  5. _tx_exist:
  6.     btst #7,@ssr ; test TRDE
  7.     bne _tx_seq
  8.     rts
  9. _tx_seq:
  10.     sub.l er1,er1
  11.     mov.w e6,r1
  12.     mov.b @(tx_fifo,er1),r0l
  13.     mov.b r0l,@tdr
  14.     bclr #7,@ssr
  15.     inc.w #1,r1
  16.     bclr #1,r1h ; tx buffer 512
  17.     mov.w r1,e6
  18.     rts
  1. tx_fifo_set:
  2.     push.l er1
  3.     sub.l er1,er1
  4.     mov.w r6,r1
  5.     mov.b r0l,@(tx_fifo,er1) ; r0l contains tx data
  6.     inc.w #1,r6
  7.     bclr #1,r6h ; tx buffer 512
  8.     pop.l er1
  9.     rts
Tinyシリーズの特徴は、その小ささだけではなく、各命令体系がよりインテリジェント化されている点にある。赤字で示した点がSCIに関するH8との相違点で、Tinyを使用する上で、この部分は必要がない。下は、バッファーにデータを格納するサブルーチンである。センシングを行うパートで状態の変化が感知されると、条件に合わせて選択されたデータがこの部分に送り込まれてくる。混乱を避けるためにデータ送信用のレジスタは全ルーチン共通で r0l に固定している。

次に、SCIの初期設定の違いについて説明する。SCIの構造は簡略化されていて、扱いは単純であるが、その反面、データの取りこぼしには対応しきれないらしい。が、楽器用途で人命に関わる事はまず無いとおもわれるので、深くは考えないことにする。
  1. sci_init:
  2.    mov.b #b'00000000,r0l
  3.    mov.b r0l,@scr3
  4.    mov.b #b'00000000,r0l
  5.    mov.b r0l,@smr
  6.    mov.b #15,r0l
  7.    mov.b r0l,@brr ; bitRateSet for 16MHz
  8.    mov.w #500,r0

  9. _sci_wait:
  10.    dec.w #1,r0
  11.    bne _sci_wait

  12.    mov.b #b'00000010,r0l ; TXD enable
  13.    mov.b r0l,@pmr1

  14.    rts
ご覧のように、酷くスッキリとしている。ダミーリードが必要ない点もH8シリーズとは異なる部分だ。TXD端子は pmr1 レジスタの2ndBitで設定することに注意必ず、SCIが稼働状態になる前に、設定を完了しよう。
つづく→