|
8−4.I/Oアドレスデコード
マイコンを使ってデータを入出力する場合、I/Oポートを使ってアクセスします。I/Oポートアドレスはアドレスバスの下位8ビットに出力されるので、合計256個の外部装置を接続する事が出来ます。外部装置をI/Oポートアドレスで区別するためには、アドレスデコーダと呼ばれるデジタルICを使って外部装置の1つを選択するようにしなければなりません。
8−5.その他の制御線
一般にこの用途には・74138(3 to 8)
などが使われます(上の3 to 8とは3ビットの入力で8つの出力のうち1つを選択するという意味です)。とくにICのサイズとの兼ね合いから、74138が良く用いられているようです。74138には3ビットの入力と8ビットの出力の他にG1、G2A、G2Bの3つの端子があり、それぞれG1=1、G2A=G2B=0の時に出力が有効になるようになっています。このICは出力が負論理なので、有効になるとは、選択されたビットが0になり、その他の出力は1のままと言うことです。
・74139(2 to 4×2)
・74154(4 to 16)
・74155(2 to 4×2 or 3 to 8)
さて、アドレスデコードは本来は256通り、すべてのI/Oポートアドレスが正しく1対1に対応しているのが望ましいのですが、IC節約のために、1つの外部装置に複数のI/Oポートアドレスが割り当てられた状態になることがあります。このことを「イメージ」といいます。これはアドレスバスの一部をどこにもつながないままにしておいたときに発生します。しかしよほどの問題のない限りこれでも通常の使用には差し支えないので、0でも1でも選択されるようなビットは0に固定しておきます。
外部装置のアドレス選択方法はわかりました。ほかにZ80のピンで入出力に関係するのはRD,WR,IORQです。RDはCPUがデータを外部から読み込むとき、WRはCPUがデータを外部に書き込むとき、IORQは外部装置とデータのやりとりをするときにそれぞれアクティブ(負論理なので0)になります。よってI/Oポートを使って外部からデータを読み込むときには、RDとIORQが、書き出すときにはWRとIORQが両方アクティブになっているので、これをORゲートに通して出力をIOR(I/Oリード)、IOW(I/Oライト)とすると扱いやすいと思います。つまり、外部装置からデータを読み出すときはIORがアクティブに、データを書き込むときはIOWがアクティブになるわけです。
8−6.8255
さて、実際にデータを出力する場合、ただI/Oポートにデータを書き出すだけではデータの出力されている時間は一瞬で終わってしまうので、それを保持する回路が必要です。つまりCPUは高速で作業をしているので、データを出力した次の瞬間には、もう別の仕事をしていて、データバスには別のデータが流れているわけです。そのためDラッチと呼ばれるIC(74574など)が使われることもありますが、制御線の扱いが多少面倒なのと、出力のみで入力が出来ないという欠点があるので、一般には簡単な入出力には8255と呼ばれるICがよく使われます。これは入出力の出来るポートが3つあり、それぞれ8ビットなので、計24ポートの入出力が可能です。ただ後述する割り込み処理には不向きです。それでは8255のピン配列を見てみましょう。
このようになっています。それぞれのピンの解説をすると、
PA0〜7:Aポート。8ビット入出力。
PB0〜7:Bポート。8ビット入出力。
PC0〜7:Cポート。8ビット入出力。このポートは上下4ビットずつに分けて使用可。
D0〜7:データバス。Z80のデータバスと直結する。
A0〜1:アドレス。3つのポートの内1つを選択。普通はZ80のA0〜1と接続。
RD:リード。先ほどのIORをつなぐ。
WR:ライト。同じくIOWをつなぐ。
CS:チップセレクト。ここが0の時このICは動作する。ここにはアドレスデコーダの出力をつなぐ。
RESET:リセット入力。Z80とは逆で正論理(1でリセットがかかる)なので、NOTゲートを入れること。
さて、8255を使う前にはまず初期化を行う必要があります。初期化はコントロールポートに、次のような値を出力すればOKです。
bit7:1
bit6:0
bit5:0
bit4:Aポート設定。1で入力、0で出力。
bit3:Cポート上位4ビット設定。1で入力、0で出力。
bit2:0
bit1:Bポート設定。1で入力、0で出力。
bit0:Cポート下位4ビット設定。1で入力、0で出力。
たとえば全ポート出力にしたいなら、10000000、つまり80Hをコントロールポートに出力すればOKです。 なおポート指定とアドレスの関係は次の通りです。
A1 A0 ポート指定 0 0 Aポート 0 1 Bポート 1 0 Cポート 1 1 コントロールポート