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

●PIC18F14K50のプログラムの概要

前回、PIC18F14K50とZ80CPUとの間でのデータのやりとりについて簡単に説明をいたしましたが、その仕組みからもおそらく想像できますように、ND80ZVのPIC18F14K50はかなりキツい作業をこなしているのです。
そのあたりの事情につきましては[第567回]でも説明をいたしました。

PIC18F14K50の一番の役目はもちろんWindowsパソコンとの間でUSB(HID)を介してデータの送受信を行うことです。
しかし単にHID送受信を行うのではなくて、WindowsパソコンからUSB(HID)で受信したデータをそのままZ80CPUに伝える、あるいはZ80CPUからのデータをUSB(HID)でWindowsパソコンに送らなくてはいけません。
つまりPIC18F14K50は片方でUSBの送受信を行いつつ、もう一方では、Z80CPUとの間でのデータの受け渡しもしなければならないのです。
さらにもうひとつ、その間にPIC18F14K50はRS232Cでの送受信と、そのデータもZ80CPUとの間でやり取りする、という作業もこなさなければなりません。
まさに八面六臂(はちめんろっぴ)の大活躍です。

その作業のうちのZ80CPUとの間でのデータのやりとりについては、前回、回路図とタイミングチャートで簡単に説明をしました。
USB(HID)での送受信については、送信、または受信バッファを設定しておくとともに、送信あるいは受信可能な状態をプログラムで設定しておくことによって、実際のUSB(HID)送信、受信はPIC18F14K50内蔵のUSBコントローラが、PIC18F14K50のプログラムとは非同期にこなしてくれます。
その設定作業はなかなかに理解しがたいところがありまして、それを理解するまでに、なんと数ヶ月もかかってしまいました。
その詳細はまだ説明しておりませんが、いずれゆっくり説明をさせていただくつもりでおります。

RS232Cの受信については、普通のプログラムでは受信データの処理が追いつかなくて、オーバーフローしてしまうことがわかりましたので、RS232C用の受信バッファを設けて、割り込みプログラムで処理することにしました([第568回])。
割り込みプログラムとその仕組みについてはそれほど難しいものではありませんが、そこのところが詳しく知りたいなあ、とお思いの方もいらっしゃると思います。
それにつきましては、もう少し先のところで、説明をさせていただくつもりでおります。

ともあれ、RS232Cの受信につきましても、そのように割り込みプログラムで処理しますから、PIC18F14K50のメインプログラムとしては、
1)USB受信については、USBコントローラの状態をセンスして、USBデータが受信済みになっていたら、受信バッファからデータを読み出してから、ふたたび受信可の状態にセットする
2)USB送信については、USBコントローラの状態をセンスして、USBデータが送信済みになっていて、そのとき送信するデータがあったら、送信バッファに新しいデータを書き込んでから、ふたたび送信可の状態にセットする
3)RS232C受信については、RS232C受信バッファに受信データがあったら、それを読み出す
という作業をそれぞれ行うことで、実際のデータの送受信のタイミングとは切り離して、PIC18F14K50のメインプログラムのフローを滞らせることなく、データを処理することができます。

なぜ、そこで「滞ることなく」処理する必要があるかといいますと、あくまでデータ処理の主導権はZ80CPUの側の、ND80ZVモニタプログラムあるいはZ80BASICプログラムが握っているからです。
Z80CPUがマスターですから、PIC18F14K50はスレーブに徹しなければならないのです。
Z80CPUからの要求にはできるだけ速く応答しなければなりません。
もっとも、USB通信やRS232C受信にも一定の時間内に処理しなければならない制約はありますから、Z80CPUとの間のデータの受け渡しについても、そこで余り長い時間待ちが発生してしまうような処理の仕方は避けなければなりません。

それに加えて、USBでは最初にWindowsパソコンと接続したときのセットアップの過程であのややこしいEnumerationの手続きもこなさなければなりません。
その手続きも含めたPIC18F14K50のプログラムはなかなかに複雑なものになっています。
しかし、そのプログラムについての説明を始めてしまいますと、またまた藪の奥深く入り込んでしまって、出てこられなくなってしまいますから、それにつきましては、いずれ後日、ということにさせていただきたいと思います。

ここでは、RS232Cでの受信データにときどき欠落がおきる、ということの説明をすることがそもそもの目的ですから、そのことをご理解いただくための予備知識として、PIC18F14K50のプログラム全体の流れについてだけ、簡単に説明することにいたします。

●PIC18F14K50のプロク゜ラムのフローチャート

PIC18F14K50のプログラムの概略フローチャートです。


このフローチャートでは、LOOPTOPから始まるようになっていますが、勿論これより前の部分にはいろいろな初期設定の処理があります。
しかし初期設定を終わったら、このLOOPTOP以下のルーチンを、その名前の通りループして処理を続けます。

ループのトップにはUSBホスト(Windowsパソコン)から送られてくるsetupコマンドを検出する部分が置かれています。
通常は、一度セットアップの処理を完了してWindowsパソコンにHIDデバイスとして認識されてしまえば、セットアップ作業は必要ないのですが、実はセットアップの処理は、ここだけではなくて、その次のEP0[in]の処理も含めておこないますから、このような流れにしてあります。

EnumerationはEP0[out]にWindowsパソコンがセットアップコマンドを送ってくることから開始されます。
[in]、[out]はPIC18F14K50から見た向きとは逆になっています。
[in]はホスト、つまりWindowsパソコンから見て「入力」になるパイプで、[out]はWindowsパソコンから見て「出力」になるパイプです。
フローチャートにはEP0[out]の処理が書かれていませんが、その処理は[setup]の中で行われます。

ところで、フローチャートでは、セットアップコマンドの検出がずっとループの中で繰り返されるようになっています。
一見すると、この流れは無駄なようです。
セットアップの処理は一度完了して、WindowsパソコンにHIDデバイスとして認識されてしまえば、USBケーブルでの接続が保たれていて、WindowsパソコンもND80ZVも電源が入っていて正常に動作している限り、再び行われることはありません。
途中でUSBケーブルの抜き差しをしてしまったときなどは、またセットアップから始めることになりますが、しかし、そのような場合にはZ80CPUの側のプログラムもWindowsパソコンの側も途中でハングアップしてしまっているはずですから、どのみちリセットして最初からやりなおさなければならないはずです。

してみると、このセットアップの処理は、LOOPTOPより前の初期設定のところに含めてしまって、ループからは外してしまったほうがよいように思えます。
ところがそのようにはできない事情があるのです。

セットアップの完了後は、ホストであるWindowsパソコンの側ではND80ZVがHIDデバイスとして認識できれば、それ以後は再びセットアップの処理が繰り返されることはありません。
しかし、PIC18F14K50の側では、セットアップの手続きが完了したかどうかは単純には判断することはできません。
まあ、要するに、PIC18F14K50としては、ホストから送られてくるデータ要求に従って、順番にデスクリプタを送るだけで、その結果がどうなったのかは、わからないのですよねえ。

確かに、緻密にプログラムを組めば、セットアップが完了して通常のデータ処理が開始されたことを認識して、その時点でセットアップ処理をループから外すようにすることもできるとは思いますが。
しかしそうまでしなくても、PIC18F14K50の処理速度はなにしろ48MHzのクロックで動作するので非常に高速ですから、それを考えれば、セットアップコマンドの検出部分をループに残したままでも、特に支障はありません。
で、そのままにしてあるのです。
こうしておくほうが、プログラムとしては簡単になりますから。

実は、今回のそもそもの問題であります、232C受信データの欠落という現象も、このループの処理そのものがセットアップコマンドの検出部分を含めて実行されていながら、想定していたよりもずっと速く行われてしまうことが原因だった、というほど速く処理されているのです。

したがってセットアップが完了してからの通常のデータ処理サイクルでは、最初のsetup、及びEP0[in]の処理は常にスルーされる、と考えてもよいことになりますから、すると、ループのトップで最初にチェックされるのは、Z80CPUからのSTBがアクティブになっているかどうか、ということです。
Z80STBがアクティブならば、Z80からのデータがセットされていることになりますから、そこでそのデータを受け取る処理を行います。
このとき同時に、232Cセレクト信号の状態をチェックして、それがアクティブならばそのデータを232Cで送信します(souts)。
232Cセレクト信号がアクティブでなければ、USB(HID)でWindowsパソコンに送るデータですから、HID送出用のバッファにそのデータを書き込みます。

どちらの処理も完了後は、次のEP1[out]のチェックに行きます。
EP1[out]は、WindowsパソコンからUSB(HID)でデータを送るときに使われるエンドポイントです。
そこに送られてきたデータがあるかどうかをチェックします。

一方、最初のZ80STBのチェックのところで、Z80STBがアクティブでない場合には、次にRS232Cセレクト信号がアクティブであるかどうかをチェックします。
232Cセレクト信号がアクティブのときは、Z80側が、232C受信データを要求していますから、232C受信バッファを確認して、受信データがあれば、それをZ80に渡す処理を行います。
232C受信バッファが空であれば、バッファエンプティを知らせる処理を行います。

いずれの場合も、その次にはEP1[out]のチェックへ行きます。
EP1[out]でWindowsパソコンからUSB(HID)を通じて受け取ったデータがあるときには、そのデータをZ80側に送ります(dtout)。
EP1[out]でのデータが無い場合には、つぎにEP1[in]のバッファの状態をチェックします。
PIC18F14K50内蔵のUSBコントローラの状態をセンスして、EP1[in]バッファのデータがWindowsパソコンに送出されていたら、次に送るデータがあるかどうかを確認して、データがあれば、そのデータをEP1[in]送出用バッファに書き込んだあと、USBコントローラを、EP1[in]バッファデータの送出可の状態にセットします。
これでループを一巡したことになりますから、LOOPTOPに戻ります。

●フリーソフトDiagramDesigner

フローチャートなど滅多に描くことはありませんし、もしその必要があったとしても、エンピツでメモ書き程度にサッサと描いてしまいます。
今回お見せしたフローチャートも、もとはエンピツで描いたものです。

しかしいくらなんでもこんなものを皆様にお見せして、これで説明するというのもなんだかなあ、という感じですので、もうちょっと見やすいように描き直そうと思いまして。
最初は簡単にmspaintで、とも思ったのですけれど、意外と簡単ではないのですよねえ。
それならということで、回路図の作成に使いましたbsch3vで描き始めたのですけれど、これもなかなかにフローチャートには不向きなところがあります。

フローチャートには文字が欠かせないのですが、bsch3vでは文字も図形(線画)も目の粗いセクション位置にしか置けないために、図形を小さくまとめようとすると、文字をその中にうまく納めることができません。
まあ、でも、文字の配置に目をつぶれば、bsch3vでフローチャートを描くこともできないことはありません。
bsch3vにつきましては[第273回]でご紹介いたしました。

しかしせっかく皆様に見ていただくわけですから、どうせ手間をかけるのでしたら、すこしでも見栄えのするものの方がよいと思いまして、ネットでフリーなソフトをサーチしてみました。
いくつかみつかったのですけれど、私としては今回使わせていただきました、DiagramDesignerが好みにピッタリという感じです。

フリーのフローチャート作成ソフトDiagramDesignerは、こちらのサイトへ行っていただいて、下の画面コピーにも見えております、Download Nowをクリックしていただきますと、DiagramDesignerSetup.exeがダウンロードされますから、それを実行することで簡単にセットアップできます(下の画面はただのコピーですから、クリックできません)。


さっそくdownloadいたしましたところ、Windows98(SE)では、setupの途中で、gdiplus.dllがない、ということでsetupできません。
それじゃあ、ということで、またネットをサーチしまして、見つけたgdiplus.dllをdownloadして、再度setupしてみたのですけれど。
今度は。

ということで、結局setupできませんでした。

仕方がありませんから、Windows98にインストールするのはあきらめて、WindowsXPでsetupすることにいたしました。
WindowsXPでは、特に問題になることもなく、あっさりとセットアップできてしまいました。
うむむ。
だんだんWindows98では使えないものが増えてきてしまいますねえ。
悲しいことです。

DiagramDesignerの実行画面です。

右のシンボルを中央の作画エリアにドラッグするだけで簡単に配置できます。
初めて使ってみたのですがHelpを全く見ることなく作画することができました。
何回か試行錯誤を繰り返すうちに、ごく自然に、こうすればいいんだな、ということがわかってきます。
こういうソフトは好きですねえ。

フォントも選ぶことができるのですけれど、かな、漢字がどういうわけか横向きになって寝てしまいます。
まあ、大体において、プログラム自体が英字で書くわけですから、日本語の表示に難があったとしても、それほど支障があるとは思えません。

おお。今回も道草をしてしまいました。
次回こそは、232C受信時のデータ欠落について、の核心にせまりたいと思います。
2010.8.11upload

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