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

●受信バッファエンプティ

RS232Cの受信データはPIC18F14K50の割り込みプログラムによって、PIC18F14K50内部メモリに設けた256バイトの受信バッファに書き込まれます。
ND80ZVのND80Zモニタの機能を使って232C受信データを読み込む場合には、[*(I/O]キーと[SI](16進キーの3)を使って、先にND80ZVを受信スタンバイにしておいてから、送信側の送信をスタートさせる、という使い方になると思いますから、そういう使い方ならば、受信バッファは必要ありません。

事実、最初にPIC18F14K50のRS232C受信プログラムを書いた時点では、受信割り込みプログラムではなくて、普通に受信データを待っていて、受信したらそのデータをすぐにZ80CPU側に渡す、というプログラムでした。
ところがだんだん欲がでてきて、WindowsパソコンとUSBで接続して、Windowsパソコンのキーボードからキーデータを入力する、リモートプログラムが使えるようにしました。
そしたら、またまたさらに欲がでてきてしまって、ついにZ80BASICを走らせるところまできてしまいました。
BASICでプログラムを書く、ということになりますと、当然、RS232C受信をしながら、その受信データを画面に表示するとか、あるいはなにかほかの作業をしながら同時に232Cの受信もする、というようなプログラムも書く場合がでてきます。

そうなりますと、最初ND80ZVのモニタプログラムでの232C受信で考えていたような、ひたすら受信データを待っている、という硬直した機能では使い物になりません。
そこで、PIC18F14K50の232C受信は割り込みによって処理することにして、Z80CPU側から受信データを渡すように要求されるまでは、受信したデータは受信バッファに書き込むようにしたのです。

それにともなって、PIC18F14K50とZ80CPU側のプログラムとの間での受信データの受け渡しの方法も変わってきます。
Z80CPU側の232C受信プログラムがスタートして、PIC18F14K50に、232C受信データを渡すように要求したとしても、そのときに受信データがあるとは限りません。
ND80ZVでのRS232C通信のボーレートは最高9600ボーで、これはかなり速い転送速度なのですが、それでも960バイト/秒の速度ですから、1バイトのデータを受信してから、次の1バイトのデータを受信するまでに、約1msecの空きができてしまいます。
ND80ZVのZ80CPUのクロックは6MHzですから、1msecもあればかなりのことが実行できてしまいます。
ほかのことを何もしないで、ただ受信データを待つ、というだけのプログラムでしたら、PIC18F14K50から受け取った受信データをRAMに書き込む作業はあっという間に済んでしまいますから、受信バッファにデータが溜まる余地はまずありません。

するとZ80CPUがPIC18F14K50に受信データを渡すように要求したときに、Z80CPU側に渡す受信データがありませんから、そういうときにはデータを渡す代わりに「受信データがありません」ということをZ80CPU側に知らせることになります。
それが受信バッファエンプティです。

ほんとうは、そういうときに、どこかの信号線をHかLかにすることで、受信バッファエンプティの合図にする、という方法が一番簡単なのですが、前回も書きましたように、PIC18F14K50のI/O端子は全てすでに使い切ってしまっていますから、受信バッファエンプティに割り当てる信号がありません。
そこで、苦肉の策として、PIC18F14K50からのデータ出力の際のSTROBE信号を利用して、15μsecの間だけアクティブにすることで、受信バッファエンプティ信号の代用としたのです。

この方法は当初はうまくいっているように思えましたが、先回書きましたように、7セグメントLED表示のためのDMAによって、その受信バッファエンプティ信号をZ80CPUが読み落としてしまい、そのために受信できなくてハングアップしてしまう、という信じられないことが確認されたことで、なにか他の方法を考えなくてはならなくなってしまいました。

というところまでが、前回の内容だったのですが、今回も時間が無くなってしまい、先に進めませんでした。
詳細は次回に説明することにいたします。
2010.8.23upload

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