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

●USBとRS232CとPIC18F14K50とZ80

ND80ZVの基板上にはPIC18F14K50があります。
すでに何回も書いておりますように、このPIC18F14K50は、ND80ZVをUSBケーブルでWindowsパソコンと接続してUSB送受信をする際のインターフェースとしての役目を担っています。
そしてそれだけではなくて、PIC18F14K50は、同時にRS232Cのインターフェイスとしての役もこなしています。
インターフェイスと言うからには、当然ND80ZVのCPU、Z80との間でのデータの交換も行いつつ、それらの役をこなさなければなりません。

たとえばPICとパソコンとの間で、RS232Cの通信を行う、というようなプログラムは比較的容易なものでありましょう。
それに比較しますと、PICとパソコンとの間でUSB通信を行う、となりますといきなりハードルが高くなってしまう、ということにつきましては、皆様方もおそらく異存の無いところでありましょう。
まあ、PICを使ってのUSBのハードルが異常に高いことからして、もしも、もしもですが、PICでUSB通信を行うプログラムまで作ることができたとしましたならば、さらにそれにRS232Cの送受信機能を追加して、たとえばRS232Cの送受信を行いつつ、USBでの通信も行う、というようにプログラムを書き換えることはそれほど困難なことではないでしょう。

しかし、しかし、そのうえさらに、PIC18F14K50とWindowsパソコンとの間でのUSBの送受信と、同じPIC18F14K50と外部装置との間でのRS232Cの送受信をこなしつつ、その都度、その伝送データを、これまた同じPIC18F14K50とZ80CPUとの間でデータ交換しなければならない、ということになりますと、これはもう、どれほどのハードルになりますか、ご想像いただけますでしょうか?

今回のND80ZV組立キットは、もうかなり前に製品基板も出来あがっておりまして、その基板を使って組立説明書の検証を兼ねて1台サンプルもとっくの昔に出来あがっているのでありますが…。
そのあたりにつきましても、早く皆様方に写真などもご紹介いたしたいと思いながら、ここのところずっと後回しになってしまっております。

なにしろ、大詰めに近付いてはきていると思うのですけれど、その通信のところでここ数日思い悩んでおります。
このところBASICプログラムの説明などで、画面表示のコピーをお見せしておりますように、

[USB通信]Windowsパソコン←→PIC18F14K50←→Z80CPU
[RS232C通信]外部装置←→PIC18F14K50←→Z80CPU

のいずれも概ね順調にほぼ完成に近付いてきております。
しかし最後の詰め、といいますか、BASICプログラムでRS232Cの送受信を含むプログラムを実行しつつ、同時にUSB通信によってWindowsパソコンのキーボードからデータを入力し、かつDOSプロンプト画面に表示を行う、という総合的な機能を実現しようとしますと、なかなかに悩ましいのです。

もともとBASICでの、その機能はもう10年も昔に、当社のZBKシステムで実現していたものでありますが。
そのZBKボードでは、USBの部分はFTDI社のFT245を使ってシリアルパラレル変換でCPUとの間のデータ交換をし、RS232Cについては、ZBKボードのCPU、川崎製鉄のKL5C8012内蔵のRS232Cインターフェイスを使っておりましたので、データの交通整理はそれほど困難なものではありませんでした。

今回、そのZBKV3BASICをもとにして、ND80ZVへの移植を試みているのでありますが、最後のRS232CとUSBとの交通整理でつかえてしまっているのです。
特に今悩んでおりますのがBASICでのRS232C受信の処理の部分です。
当初、PIC18F14K50ではUSBもRS232Cも割り込みは使わないで、通常の処理プログラムで書いておりました。
BASICプログラム上でそれらを高速で実行しない限り、たとえばUSBの送受信とRS232Cの送受信を全く同時に行うというシチュエーションは考える必要はありません。
USB通信において、Windows側からPIC18F14K50に送られるキーボード入力と、PIC18F14K50からWindows側に送られて、DOSプロンプト画面に表示されるデータは同時に送受信されるように見えますが、USB(HID)でのデータの送信、受信は1msec毎にしか行われませんから、がら空きのスカスカ状態です。
ですからあえてPIC18F14K50のUSB送受信プログラムに割り込みを使う必要はさらさら無い、と判断しております。
なにしろPIC18F14K50のCPUクロックは48MHzなのですから、そりゃあ普通の処理に割り込みなど必要ありませんでしょう。
さらに、もしもZ80との間でのデータのやり取りに時間がかかって、たまたまUSBでの応答に間に合わなかったとしても、そのときはPIC18F14K50がBUSYであると、ホスト(Windowsパソコン)に回答しますから、それで支障が生じることはありません。

RS232Cは、ND80ZVの場合、ハードウェアハンドシェイク方式ではなくて、RX、TXラインとGNDのみのタレ流し方式ですから、送信については、これも特に難しいプログラムにはなりません。

ND80ZVのキー操作でRS232Cの送信、受信を行うには、RS232C送信は、7セグメントLEDに送信開始アドレスと終了アドレスを表示させておいて、[*(I/O)][2(SO)]と操作します。SOはSerial Outです。
RS232C受信は、[*(I/O)][3(SI)]と操作します。SIはSerial Inです。

RS232C受信についても、そのようなキー操作では、ひたすら受信データを待つだけですから、そしてND80ZVのRS232Cのボーレートは最高でも9600ボーですから、それで受信データを取りこぼしてしまうようなことはありません。

ND80ZVをUSBでWindowsパソコンと接続してリモートプログラムでキー入力操作をする場合でも、RS232Cの送受信を行うことができます。
リモートプログラムでRS232C送信を行う場合には、7セグメントLEDに送信開始アドレスと終了アドレスを表示させたあと、[*(I/O)][2(SO)]とキー操作する代わりに、/s[enter]と入力します。
/s に続けてファイル名を入力してから[Enter]を入力すると、指定した範囲のメモリデータがUSBを経由してWindowsパソコンに送られてきて、そこでそのファイル名でsaveされますが、ファイル名をつけない場合にはRS232C送信が行われます。
リモートプログラムでRS232C受信を行う場合には、[*(I/O)][3(SI)]とキー操作する代わりに、/l(小文字のL)[enter]と入力します。
/l に続けてファイル名を入力してから[Enter]を入力すると、そのファイルのデータがUSBを経由してND80ZVに送られて、メモリにloadされます。ファイル名をつけない場合にはRS232C受信が行われます。

リモートプログラム上でRS232Cの送受信操作をするときには、USB送信、受信とRS232C送信、受信が同時に行われるように思われますが、この場合にもパソコンのキーボードから入力されたRS232C送信または受信開始コマンドがUSB経由でND80ZVに送られてしまったあとは、USBの受信(PIC18F14K50→Windowsパソコンの方向)のみが1msecに1回オートマチックに行われるだけで、それはPIC18F14K50内蔵のUSBコントローラがPICプログラムとは非同期に自動でこなしてくれますから、PIC18F14K50のプログラムは、RS232Cの送信、または受信するデータをPIC18F14K50とZ80CPUとの間で受け渡しすることだけにほとんど専念することができます。

そこまではとりあえずクリアできているのです。
ところが、このままの232Cの仕様でBASICのプログラムとして実行しますと。
だめだぁ、こりゃあ。
という駄目なところが、ぼろぼろ出てきてしまって、232Cの部分はPICのプログラムもBASICのプログラムも大幅に書き直さなくてはならないことがわかってしまいました。

で、ここのところ何日かの間、暑さの中でうんうんうなりながら考えていたのです。
あ。本日もまた時間が無くなってしまいました。
この続きは次回にすることにいたします。
2010.7.29upload

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