標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第579回]

●PIC18F14K50とZ80CPUとの間のデータ送受の仕組み

本日は前回予告いたしましたので、[第571回]で、RS232Cの受信データが時々欠落してしまいます、と書きましたことについて、その続きを書かなければいけません。

しかしこれがなかなかにホネなのです。
データが欠落していた原因につきましては、もうとっくに解決済みなのですけれど、それを皆様方に説明しようといたしますと、いろいろ準備しなければならないものがいっぱいあって、そりゃあもうたいへんなのです。

ほんとうは、もういいかげんにND80ZV組立キットの説明書などを準備しなければいけませんから、なかなかじっくり説明をさせていただくことができません。
今回のこのテーマにつきましても、下準備が大変だなあ、ということで、それもあって、つい後回しになってしまっていました。
でも、この間からずっと作業を続けておりました、Z80BASICをND80ZVの上で動作させるようにする試みについて、なんとかやっと完全に動作するところまで来ました(と思います)ので、ちょっと肩の力が抜けたところです。
で、この機会に片付けてしまいます。

いろいろ下準備しておりましたら、肝心の受信データの欠落のところの説明に入る前に、先に説明をしておかなければならないことがずいぶん出て来てしまいましたので、どうやら今回1回だけでは終わりそうにありません。
しばしご辛抱いただいて、お付き合いをお願いいたします。

●ND80ZVのI/Oインタフェース回路図

ND80ZVの回路図は、以前にもお見せしているとは思いますが、あらためて見ていただくことに致します。

回路図の真中あたり、PIC18F14K50の左側の信号ラインに太字で追記しましたのが、Z80CPUとPIC18F14K50との間でデータの送受をするのに使う信号ラインです。
PIC18F14K50はI/O端子が少ないため、データを8ビットパラレルで送受することができません。
そこでデータ線は半分の4本にして、8ビットのデータを、下位4ビットと上位4ビットの2回に分けて送るようにしています。

データはZ80からPIC18F14K50に送る場合と、逆にPIC18F14K50からZ80に送る場合があります。
いずれの場合も送出する側は、データをセットしたあとSTBをアクティブ(L)にします。
受け取る側は、STBがアクティブになったのを見て、データを読み込んでからBUSYを出力(L)します。
データの処理が終わったら、BUSYをHにします(READY)。
送出側は、READYを確認してから次のデータをセットします。
以上の動作を簡単なタイミングチャートで示します。


Z80とPIC18F14K50との間で送受するデータは、USB(HID)を通じてWindowsパソコンとPIC18F14K50との間で送受信するデータと、RS232CでPIC18F14K50が外部との間で送受信するデータの2通りがあります。
上のタイミングチャートはUSB(HID)を通じて、WindowsパソコンとPIC18F14K50との間で送受信するデータを、PIC18F14K50とZ80との間で送受するときのタイミングチャートです。

232Cのデータか、USB(HID)のデータかの区別は、Z80側から出力される、232Cセレクト信号によって選択されます。
232Cセレクト信号がHのときは、そのデータがUSBで送受信されるデータであることをPIC18F14K50に示しています。

逆に232Cセレクト信号がアクティブ(L)のときは、Z80側がPIC18F14K50に対して、RS232Cでの送受信を要求していることを示しています。
そのときのタイミングチャートを下に示します。


Z80側からPIC18F14K50に232C送信のためのデータを送る場合のタイミングチャートは、232Cセレクトラインがアクティブ(L)になることを除いては、USB通信のためのデータをZ80からPIC18F14K50に送る場合のタイミングチャートと同じです。
しかしPIC18F14K50がRS232Cで受信したデータをZ80に送るときのタイミングチャートは、USBで受信したデータをZ80に送るときのタイミングチャートとは、少しタイミングが異なっています。

●232Cの受信データがないときの処理

USBを介してWindowsパソコンからPIC18F14K50に送られてくるデータは、ND80ZVのモニタプログラムまたはZ80BASICプログラムがコントロールしていますから、データの有無も含めてコード化してPIC18F14K50とZ80との間で送受することができます。

一方、RS232C受信の場合には、PIC18F14K50が割り込み受信をして、それをPIC18F14K50の汎用メモリに設けた受信バッファに読み込みます。

このタイミングはZ80側のプログラムとは全く関係無く行われますから、Z80BASICの232C受信命令が実行されるたびに、PIC18F14K50の受信バッファにデータがあるかどうかをポーリングして確認する必要があります。
このポーリングのときに、受信バッファエンプティを示す信号線があると、ことは簡単になるのですが、残念ながらPIC18F14K50のポート出力は全て使ってしまっていますから、それに割り当てることのできる端子が残っていません。
またZ80側のI/O回路にも空いている端子はありません。

それならバッファエンプティを示す意味で00(0x00)を出力できないか、とも考えてはみたのですが、ASCIIコードのみの送受信ならばそれも可能なのですけれど、RS232Cを使ってバイナリデータの送受信をすることもありますから、そういうわけにもいきません。

そこで、RS232Cの受信バッファが空であることを示すために、232Cセレクト信号とPIC18F14K50のSTB信号を、下のタイミングチャートのように使います。


Z80BASICの232C受信命令が実行されると、PIC18F14K50に対して232C受信バッファのデータの送出を要求するために、232Cセレクト信号がアクティブになります。
232C送信データを出力する場合には、232Cセレクト信号と同時にZ80側のSTBもアクティブになりますから、STBがアクティブであるかないかを同時にチェックすることで、PIC18F14K50は、232C送信か232C受信のいずれをZ80側が要求しているかを知ることができます。

このときもし受信バッファが空の場合には、PIC18F14K50はデータをセットすることなくSTB信号だけを約15μsecの間だけアクティブにします。
Z80BASICの側は、STB信号がアクティブになってもすぐにデータを読まずに、そのまま約30μsecの間STB信号を監視していて、その間にHになってしまったら、受信バッファエンプティであると判断してリターンします。
その期間を過ぎてもSTB信号がLのままなら、そこではじめてデータを読み込みます。

この扱いのために、さきほどのタイミングチャートのところで、Z80がUSBからのデータを受け取るタイミングと、232C受信データを受け取るタイミングが少し異なっているいるのです。

説明の途中ですけれど、やっぱり時間がなくなってしまいました。
この続きは次回にすることにいたします。
2010.8.10upload

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