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

●追加した回路部分です。さてこれは何でしょう?

楕円で囲んだ部分に注目、です。


特徴のある、この端子配列は?
そうです。9pinのDSUBコネクタです。
9pinのDSUBコネクタといえば、もう、おわかりですね。
RS232C回路でした。

単独のCPU回路だけではなくて、RAMがあって、ROMがあって、そして今また「TK80」の回路まで追加してしまったとすると、やっぱりパソコンとつないで、プログラムのSAVE/LOADとか、もっと言うと、できればアセンブラニーモニックで書いたプログラムをマシン語コードに翻訳して、それをこのCPUボード上のRAMにダウンロードするとか、いろいろできるといいなあ、とついつい欲がでてきてしまいました。

そこで、あとは野となれ、です。
えいやっ、とばかりに追加してしまいました(ハードはいいけど、うわぁ、ソフトが、大変だぁ…)。

●そこのところの、回路図です


●シリアル変換にはPICを使います

RS232Cのためのパラレルとシリアルの変換をTTL回路で行うこともできないことはありません。
しかしそれは、またなかなかに大変な回路になってしまいます。
まあ、それに、今回の企画は、「CPUをTTLで」というのがそもそものテーマなので、「周辺回路もTTLで」ということではありません。

PICはちょいとした回路にはなかなかに重宝するICで、上の回路図のように、周辺回路なしで動いてくれます(クリスタルも不要です!)。今回は、手ごろなPIC16F88をパラレル・シリアル変換に利用することにしました。
CPUとPICとの間は、8ビットパラレルで送受信データのやりとりをします。

回路図の下方にある74HC373がPICへの8ビットデータ送出用データラッチです。
出力データはPICが読み取りを完了するまでラッチしている必要がありますから、74HC373を使います。
同じく回路図下部の74HC244がPICからのデータ読み取り用データバッファです。
こちらはCPUがデータをREADするときだけ、ゲートがONしていればよいので、ただの入力ゲートです。

PICとのデータの受け渡しをするには、READ、WRITE、DATAREADYなどの制御信号が必要になりますから、それらの送出と読み取りに、もう一組の74HC373と74HC244を使います(回路図上部)。
このREAD、WRITE、DATAREADYはPICに固有のそういう信号端子がある、ということではありません(データのやり取りにそういう機能が必要なので、勝手に作ったラインです)。
このあたりのところは、ハードというよりも、ほとんどソフトウェアです。
いずれプログラムについても説明する機会があるかも知れませんが、今回はそれについては割愛します。

この回路図の74HC244と74HC373は、IN、OUT命令で制御するI/O回路です。
I/OアドレスとIORD、IOWR信号でコントロールします。
I/Oアドレスは[第120回]で紹介した、「7segLEDとKEY入力回路」の中の74HC138からの出力(94−97、98−9B)です。

ところで、下側の74HC373のpin1(Output Enable)に上側の74HC373の出力がつながっています。
なぜ、こんなことをしているか、といいますと、こうしておかないと、PICからデータを出力するときに、下側の74HC373からの出力とぶつかってしまうからです…。

と、ここまで書いてきて、これは変更したほうがいいな、という点に気がついてしまいました。
で、さっそく回路変更です。
どうせ、正月草々からパターンカット&ジャンパ配線必至ですから(前回[第128回]●やれやれ、またか…)、あと1本や2本増えたって、どうってことはありません。



変更したのは赤線で示した1本です。
74HC373からのデータ出力はPICがCPUからの出力データをREADするときだけアクティブにすればよいのですから、こうした方が理にかなっています。
変更前の考え方でも悪くはありません。CPUがデータを出力するときにアクティブにする、でも理屈は合っています。
しかし、変更すると、このラインの制御はPIC側のプログラムで行うことになります。
CPUの負担はできるだけ減らす、というのが基本ですから、この方がよいのです。

あともう少しだけ、もとの回路図の説明に戻ります。

RS232Cの信号レベル変換には、これも定番のMAX232Cを使います。
MAX232Cについては、「つくるCPU」の本来のテーマからは、少し外れていますから、今回、ここでは説明を省略します。

どうせPICとのデータのやりとりに、パラレルI/Oの回路を用意するのですから、余った入出力ビットは、汎用の入出力I/Oとして使用できるようにしてあります。
ことのついでに、余った出力の1ビットを使って、スピーカー出力回路まで、作ってしまいました!

●余談ですが…

TK80の時代には、プログラムの外部記憶装置といえば、カセットテープレコーダでした。TK80のモニタプログラムにはそのためのSAVE、LOADの機能も入っていましたが、インタフェース回路は付属していませんでした。
TK80のマニアルには、I/Oポート8255の入出力端子を利用した、カセートテープレコーダ用の簡易型インタフェース回路の製作方法もついていました。
いただいたTK80のマニアル([第125回])を今あらためて読んでみますと、データフォーマットはRS232Cと同じです。速度は、なんと110ボー(!)。

それでも当時としては、家庭用のカセットテープレコーダを使って、プログラムの保存ができるというのは、驚異的なことでした。
ただ、当初TK80のモニタプログラムに入れられていた、データの録音方式には弱点がありました。
それは、シリアルデータを音としてテープレコーダに記録するために、数KHzのパルスを、1の信号のときだけ送出するというものでした。

下の図は、31H(00110001)というコードを、パラレルからシリアルデータに変換した波形と、さらにテープレコーダに録音するために、パルス信号(音声信号)に換えた波形を示したものです。
図のように先頭に1ビット長の0データ(スタートビット)を送り、それに続いてデータのビット0から順に送出し、最後に1(ストップビット)を送ります。
ストップビットはTK80では3ビットでしたが、最近のパソコンにおけるRS232Cでは、たいていは1ビットだけです。

筆者はデジタルが専門でアナログ(&オーディオ)は門外漢なので、よくはわからないのですが、テープに録音された音声はデジタル(直流)として再生されず、交流波形として再生される(ようです)。
その場合、無信号(値が0)のビットが連続すると(無音声の期間が続くと)、下図中のような「たわみ」が出てきます(交流ノイズか?)。

最終的に図下のような、間違った波形として再生されてしまうことになります。
これを防ぐには、かえってボーレートを高くしたほうがよいのですが、そうすると、テープの回転ムラの影響を受けてしまうことになり、なかなか難しいのです。
当時は1と0で周波数を変えたり、なるべく少ないパルス数で録音できるように工夫したりなど、さまざまな方式が考案され、発表されたように記憶しています。

その後に発売されたシャープのMZ80(CPUはZ80)はディスプレイ一体型でカセットテープレコーダも内臓していたように記憶しています。
2008.12.20upload

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