MIDI-I/Fの受信部(31,250bps、8N1の非同期通信処理)を作成します。
RS232C通信は、何度も作っているので、大まかな手順はわかっており、数時間でできると予測していました。しかし、これも毎度のことながら、通信速度の設定が面倒です。
今回は、内部カウンタが8bit/16bitの利用と、クロックの分周設定がレジスタで直接設定するのでなく、パラメータ設定によって、変わるというのがわかりにくさ。BRG16とBRGHの2つのビット設定によって、決まります。この分周をもとに、31250bpsのカウンタを計算します。31250bpsで受信できるようになりましたが、連続受信するとオーバランエラーが発生しました。連続受信可否のビット(CREN)を0にすると、受信そのものが止まります。ビット名と処理内容が一致していないような。。。
この対策で試行錯誤して3時間ほど費やしました。最終的に何も対策しなかったのですが、オーバーランエラーは発生しなくなりました。オーバーランしたときの復帰処理は入れていありますが、動作したことはなさそうです。
受信データを表示できないので、受信データ数や最終データだけビット表示させるなどして、受信が正しくできていることは確認できました。
PC版では、データリストア時にQY20がチェックサムエラーを表示しているので、データフォーマットとチェックサムの計算方法を確認。QY20の取説に、バルクデータのフォーマットが書かれているのですが、細かいところは記載されておらず、結局、わかりませんでした。
分かったことは、 QY20のデータメモリが、約128KBytesであることがわかりました。すなわち、使う予定だった64Kbytes(512Kbits)のEEPROMでは足りない。8種類を書き込む得る予定(1回に8KBytes想定)でしたが、これじゃ、1Mbits(128Kbytes)のEEPROM に1つしか書けません。まぁ、仕方がないので、その仕様に変更です。
せっかく、ページ選択ボタン処理や表示処理を作ったのに、ほとんど意味がなくありました。7SegLEDを使った処理モード表示を充実させます。
今日、やったのは、
- MIDI-I/F受信部の完成
- 内部の状態遷移の整理(ページ切り替え、実行モード、処理中モード)
- 各状態における禁止動作の処理
- 受信処理のデバッグ・テスト表示
で、7時間程度です。