2013.3.5
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第336回]


●MIDIキーボードをSC−88につなぐ

インターネットからダウンロードいたしましたバッハのピアノ曲のMIDIファイル([第333回]参照)をE−80(仮称)ミニコンにロードしまして、それを1バイトずつ、間にFOR NEXT文をはさみながらゆっくりと、ヤフオクで落札しましたSC−88に送りましたところ、乱暴な方法ではありましたが、それなりになんとか、らしい演奏をしてくれました。
そこでY様にそのことをご報告いたしましたところ、Y様からMIDIキーボードが送られてきました([第332回])。



まずはこのMIDIキーボードをSC−88に接続して、キーボードを押したときにそれに対応した音階の音が出ることを確認いたしました。

次に、これはY様からのメールに書いてありましたテスト方法なのですが、このMIDIキーボードをE−80(仮称)ミニコンのMIDI−INに接続して、MIDI−OUTをSC−88に接続します。
そしてE−80(仮称)ミニコンで、MIDI−INから入力されたデータをそのままMIDI−OUTから出力するようなプログラムを実行して、そのときMIDIキーボードをSC−88に直接接続したときと同じ音が出ることが確認できましたら、E−80(仮称)ミニコンのMIDI回路が正しく機能していると判断できます。

なるほど。
さっそくテストプログラムを作成いたしました。
が。
その前にひとつ準備するものがありました。

Y様からMIDIキーボードを送っていただいたときに一緒に5pinDINケーブルも送っていただきました。
このケーブルはMIDIキーボードとSC−88とを直接接続するときにはそのまま利用できました。
しかし、E−80(仮称)ミニコンのMIDIコネクタは、通常のものよりも小さい5pinミニDINコネクタです。
先にE−80(仮称)ミニコンのMIDI−OUTとMIDI−INを接続して、ループバックテストを行ないましたときには、両端が5pinミニDINコネクタのケーブルを作成して、それを利用しました([第331回])。
今回は通常サイズの5pinDINコネクタも入手しまして、一方の側が通常サイズの5pinDINコネクタでもう一方の側がミニ5pinDINコネクタというケーブルを2本作りました。

一本はMIDIキーボード(5pinDINコネクタ)とE−80(仮称)ミニコンのMIDI−IN(5pinミニDINコネクタ)を接続するケーブルで、もう一本はE−80(仮称)ミニコンのMIDI−OUT(5pinミニDINコネクタ)とSC−88(5pinDINコネクタ)を接続するケーブルです。


●テストプログラム

E−80(仮称)ミニコンのMIDI−INから入力された信号をシリアル受信して、それをそのままMIDI−OUTからシリアル送信するだけのプログラムです。

2013/1/28  17:11  miditst4.txt
END=805A
              ;;; E-80 232C(MIDI) TEST4(jusin to sousin)
              ; 13/1/19 1/20 1/28
              ;
              	ORG $8000
              ;
8000 3E88     	LD A,88
8002 D3FB     	OUT (FB),A
8004 3EFF     	LD A,FF;16F88out disenable
8006 D3FA     	OUT (FA),A
              ;
              ;jusin
8008 3EFF     LP0:LD A,FF
800A D3FA     	OUT (FA),A
800C DBFE     LP01:IN A,(FE)
800E E610     	AND 10
8010 CA0C80   	JP Z,LP01
8013 3E01     	LD A,01;bit1=L,bit0=H data request on
8015 D3FE     	OUT (FE),A
8017 DBFE     LP1:IN A,(FE)
8019 E630     	AND 30
801B 2813     	JR Z,LP12;no data or err
801D FE20     	CP 20;strobe on?
801F 20F6     	JR NZ,LP1;no
8021 DBFD     	IN A,(FD)
8023 08       	EX AF,AF'
8024 AF       	XOR A;data request off
8025 D3FE     	OUT (FE),A
8027 DBFE     LP11:IN A,(FE)
8029 E610     	AND 10;strobe off?
802B 28FA     	JR Z,LP11;no
802D C33C80   	JP DATAOUT
8030 AF       LP12:XOR A;data request off
8031 D3FE     	OUT (FE),A
8033 DBFE     LP2:IN A,(FE)
8035 E610     	AND 10;strobe off?
8037 28FA     	JR Z,LP2;no
8039 C30C80   	JP LP01
              ;
803C 3EFB     DATAOUT:LD A,FB
803E D3FA     	OUT (FA),A
              ;sousin
8040 DBFE     LP3:IN A,(FE)
8042 E620     	AND 20
8044 CA4080   	JP Z,LP3
8047 08       	EX AF,AF'
8048 D3FD     	OUT (FD),A
804A 3E02     	LD A,02;bit1=L,bit0=H;bit0-4 are INVERT
804C D3FE     	OUT (FE),A
804E DBFE     LP4:IN A,(FE)
8050 E620     	AND 20
8052 C24E80   	JP NZ,LP4
8055 AF       	XOR A
8056 D3FE     	OUT (FE),A
8058 C30880   	JP LP0
              ;
DATAOUT      =803C  LP0          =8008  LP01         =800C  
LP1          =8017  LP11         =8027  LP12         =8030  
LP2          =8033  LP3          =8040  LP4          =804E  

単純なプログラムの割りにはごちゃごちゃしています。
MIDIの送受信にはPIC16F886のUSART(Universal Synchronous Asynchronous Reciever Transmitter)を使っています。
送受信データをPIC16F886との間でハンドシェーク方式でやり取りする部分がちょっと複雑に見えますが、要するにSTROBEとREADY/BUSYでお互いの状態を確認しながらデータをやり取りしているだけです。
このプログラムに関係する回路図は[第330回]にあります。

今気がついたのですが、プログラム先頭のLD A,FF OUT (FA),Aは重複していますねえ。
8004H〜8007Hは余計でありました。

システム用の82C55のPC2=0のときにCPUからPIC16F886にデータを送出するための8ビットのラッチ(74HC373)の出力がアクティブになります。
送信時はPIC16F886のREADY信号(I/OアドレスFEのビット5)=1を確認して、I/OアドレスFDにデータを送り、STROBE(I/OアドレスFEのビット1)をONにします。
[第330回]の回路図で、CPUからのSTROBE出力、READY出力にインバーターが入っているのはリセット時の誤動作を避けるためです。

受信データをPIC16F886に要求するときは、I/OアドレスFEのビット1を1にします。
PIC16F886に受信データがあるときは、PIC16F886はCPUからのデータ要求を見て、データをバスに出力した上でREADY信号をセットします。
CPUからはデータがセットされたことはI/OアドレスFEのビット4=0、ビット5=1で確認できます。
ビット4=1は受信データがないことを、ビット5=0は受信エラー発生を示しています。
PICからの受信データはI/OアドレスFDにIN命令を実行することで読み取れます。

●入力と出力の信号波形

Y様のメールには、MIDIキーボードを直接SC−88に接続したときと、間にE−80(仮称)ミニコンをはさんで接続したときとで、同じ音が出ることが確認できればE−80(仮称)ミニコンのMIDI回路が正しく機能していることになります、と書かれていました。
しかし、残念ながら私は、同じ音が出ているかどうかが分かるほどの耳は、持ち合わせてはおりません。
こういうときは、やっぱりオシロで確認することが一等確実です。

下はオシロで観測した波形の写真です。


この写真はY様にメール添付でお送りしましたが、そのメール中で写真の説明をしております部分を下に転記いたします。

**********************************************
CH1(上)がキーボードOUT(E−80IN)で、CH2(下)がE−80OUT(SC−88IN)です。
測定点はCH1がE−80のMIDI入力回路のフォトカプラからTTL回路に出力された点で、CH2はE−80のMIDI出力(74HCゲートの出力)です。
時間軸から見ると3バイトの受信送信が行なわれているようです。
最初の受信からそのデータの送信開始までは0.4msですが、1バイトのデータを受信し終わるまでに0.3msかかりますから、それ以下にはできません。
1バイト受信完了してから送信を開始するまでの処理による遅延時間は0.1msということになります。
3バイト連続して受信しても各バイト間で遅れが累積してはいないようですから、データが切れ目無く送られてきても処理時間は0.1msで変わりはないと思います。
このことから受信と送信とのタイムラグは0.4msの遅延で済むと思います。

ただしこのテストプログラムはほかの事をすることなくひたすら受信送信処理のみを行なっていますから、何か他の処理をしながらということになると、それなりにかかると思います(要はプログラム次第です)。
CPUクロックは10MHzです。
Z8S180は割り込み処理はしていません。
またZ8S180はバッファは設けていません。
Z8S180は初期設定のままですから、メモリアクセスは3ウェイト、I/Oアクセスは4ウェイトかかっています。またリフレッシュもデフォルトの間隔で挿入されています。
それらをカットすれば、もっとパフォーマンスはよくなると思います。
**********************************************

今回のテストを行なったことでE−80(仮称)ミニコンのMIDI−IN、MIDI−OUT回路が正しく機能することが確認できました。
これでMIDIについて私がやるべきことは、無事終了いたしました。
最初に購入しましたSC−88が壊れていたという思わぬトラブルによりまして、当初は泥沼でもがいてしまいましたが、それもヤフオクで落札しましたSC−88によって無事テストを終えることができました。
めでたし、めでたしであります。

が。
私といたしましては、これで終ってしまったのでは、ちょいと面白くはありませぬ。

ワンボードマイコンでCP/Mを![第336回]
2013.3.5upload

前へ
次へ
ホームページトップへ戻る