平成14年1月7日朝刊
なひたふ新聞 電子回路が大好きな趣味人「なひたふ」のWebサイト
maruTOPページへ戻る
maru電子回路の豆知識
第0章 基本の豆知識
第1章 部品の豆知識
第2章 個別半導体の豆知識
第3章 オペアンプ回路の豆知識
第4章 ディジタル回路の豆知識
第5章 コネクタと規格の豆知識
5.1 プリンタポート
5.2 RS232C
5.3 VGAコネクタ
5.4 電話線
5.5 ISDN
5.6 LAN
5.7 168ピンDIMM
第6章 画像信号の豆知識
メール
メールアイコン御意見、御感想は
nahitafu@nifty.com
Copyright
このWebページ上で紹介したすべての回路、情報、内容に関する著作権は私、なひたふが所有します。無断転載を固く禁じます。
(C)Copyright 1999-2001 Nahitafu
平成10年2月28日発行.第三種郵便物不認可
プリンターポート
 ここでは、DOS/Vのプリンターポートについて解説します。プリンターポートは、将来的には廃止されるらしいのですが、現在でもほとんどのパソコンに備え付けられている汎用のパラレルポートです。

 このポートには、8ビットのデータ入出力用端子と、4ビットのコマンド出力端子、5ビットのステータス入力端子があります。自作の周辺機器など、プリンタ以外のものにつなぐのであれば、これらの入出力端子は本来の機能にとらわれることなく自由に使えます。
 また、単方向、双方向、ECP、EPPなど、いくつかのモードがありますが、ECPやEPPはWindowsで使うには、面倒な(あるいは高価な)デバイスドライバが必要になりますので、単方向、双方向についてハード、ソフトともに解説します。
単方向・双方向モードのススメ
 最も原始的な単方向モードでも、800kHzから1MHzくらいの速さでデータを出力することができますし、なんと言ってもプログラミングが簡単です。双方向モードは、8本あるデータ線を入力にも出力にもできるモードで、これもプログラミングが簡単です。
 単方向モードでも、プリンタポートにはあらかじめ制御用入力信号が用意されているので、それらを利用してデータの入力ができます。
 なんといっても、これらのモードはソフトハードともに簡単に使うことができます。つなぐだけ、でいいのです。ソフトウェアも、outpやinpするだけでいいのです。
プリンターポートのピン割り当て
 パソコンについているコネクタはD-SUB25pinのメスです。
D-SUB25pinメス
#記号方向意味
1#STROBEIOデータのストローブ
2D0IOデータ
3D1IOデータ
4D2IOデータ
5D3IOデータ
6D4IOデータ
7D5IOデータ
8D6IOデータ
9D7IOデータ
10#ACKIアクノリッジを返すときにL
11BUSYIビジーでH
12PEI紙が切れるとH
13SLCTIオンラインならH
#記号方向意味
14#AUTO FX INITO印刷後に自動改行するならL
15#ERRORIプリンタのエラーでL
16#INITOプリンタの初期化をするときにL
17#SLCTINOプリンタをセレクトするときにL
18GND-グラウンド
19GND-グラウンド
20GND-グラウンド
21GND-グラウンド
22GND-グラウンド
23GND-グラウンド
24GND-グラウンド
25GND-グラウンド
説明
 標準のプリンターとプリンターポートを介してインターフェースするときには、まず、プリンタがビジーでないことを確認します。そして、データを出力し、ストローブをカチカチっとHLHと動かします。プリンターはデータを受け取ったしるしにACKを返します。

 さて、プリンターポートは本来はプリンタとの接続に使うものですが、汎用ポートとして使って自作の機器をつなぐことのほうが多いかもしれません。そのような場合は、上に書いた信号の意味はすべて無視して、信号が入力か出力かということだけを気にすればよいのです。

 現に、プリンターポート同士でDOS/V間をつなぐInterLinkなんていうのもありましたが、それですら上の信号の意味をほとんど無視して使っています。
 注意しなければならないピンは#SLCT INです。これはINという名前がついていますが出力端子です。気をつけましょう。

信号の電気的特性
 入力Hは2V以上、Lは0.8V以下。

 出力Hは2.4V以上、Lは0.8V以下。

と、TTLレベルに近いレベルです。でも、実際にはかなりいいかげんなものです。入出力のインピーダンスは、使っているマザーボードによって違いますし、私の使っていたパソコンでは、データとストローブで出力インピーダンスや電圧がちがうということがありました。


インターフェース
 プリンターと自作機器のインターフェースには結構神経を使います。プリンターポートの電気的特性はかなりいいかげんであるうえ、数メーターもの長いケーブルを使うこともあります。すると、多かれ少なかれ信号の反射が生じますし、信号がクロストーク することも多々あります。

 前に、片方がオープンの2mのプリンタケーブルに数MHzの信号を流すと、2Vくらいのクロストークが観察されたこともあります。信号線がショートしているのではないかと思ったくらいです。
 よって、信号の受け側には10kΩ程度のプルダウン(もしくはプルアップ)抵抗を入れて、自作の機器に入れる前にバッファを入れるべきです。できればシュミットトリガー型のバッファが望ましいですが、贅沢は言いません。

 パラレルポートから送られたデータをPICなどを使って処理するときはどうでもいいのですが、ロジック回路で組んだステートマシンなどに入力するときには、必ず自作機器のクロックが入ったD-FFで受けてから、ロジック回路に渡しましょう。そうしないとほとんどの場合は誤動作します。
 なぜ、誤動作するかといいますと、自作機器とパソコンではクロックが非同期なので、自作機器のクロックとほぼ同時にデータが変化すると、フリップフロップが正しく遷移できないからです。そのために、身代わりのフリップフロップが必要になります。

 自作機器からプリンタポートにデータを送るときには、できるだけ低いインピーダンスで送り出します。プリンタポートの入力インピーダンスが数百Ωしかないというパソコンもありましたので。
プリンターポートと自作機器との安全なインターフェース回路


ソフトウェア
 DOSでプリンターポートをアクセスするためには、IOポートを直接たたくことが許されます。IOポートを叩いて、プリンターポートをつかさどるレジスタにアクセスします。Windows95/98を使っていても、IOポートをアクセスすれば(VxDが仲介するけれども)プリンタポートにアクセスできます。残念ながらWindowsNTや2000ではプリンタポートにはアクセスできません。プリンターポートにアクセスするための、IOのアドレスは通常は0x378,0x278,0x3BCのいずれかです。自分のパソコンがどのアドレスに割り当てられているかは、メモリーの40:08番地を読めば書いてあります。

 ちょっと面倒ですが、次の手順でプリンターポートのアドレスを知ることができます。まず、MS-DOSプロンプトを起動し、debugというコマンドを実行します。そして、
d 40:08と入力しますと、メモリの40:08番地からダンプしてくれます。

 このdebugは結構便利なツールです。DOSやWindowsに標準でついていて、IOポートのアクセスもできます。

 左の図によれば、どうやら私のパソコンのプリンターポートは、アドレス0x378にあるようです。
 378というのは、プリンターポートの先頭アドレスで、実際にはそこから4バイトのアドレス空間がプリンターポートの制御用レジスタになっています。最初の378がデータで、次の379がステータス、次の37Aがコマンドです。最後の37Bは触ってはいけません。おそらく、大昔のPC/ATなんかはプリンターポートに8255という汎用パラレルポートICを使っていたのでしょう。8255は各アドレスを入力や出力に設定できますが、8255自体の設定が37Bにあるはずです。今のDOS/V機ではもちろん8255などは使っていませんが、このポートに何があるかは不明なので、触らないほうがいいでしょう。

 各アドレスの機能を以下に示します。

ここから先は、ちょっと未確認なので、あまり信用しないでくださいね・・

レジスタ0x378,0x278,0x3BC(データレジスタ)

読み書きが可能。
ビット機能意味極性ピンとの対応
0Data bit 0データのビット0-
1Data bit 1データのビット1-
2Data bit 2データのビット2-
3Data bit 3データのビット3-
4Data bit 4データのビット4-
5Data bit 5データのビット5-
6Data bit 6データのビット6-
7Data bit 7データのビット7-

レジスタ0x379,0x279,0x3BD(ステータスレジスタ)

読みこみが可能。
ビット機能意味極性ピンとの対応
0予約さわっちゃだめ--
1予約さわっちゃだめ--
2割り込みステータス --
3#ERRORプリンタがエラー0でエラー
4SLCTプリンタがオンライン1でオンライン
5PEプリンタが用紙切れ1で用紙切れ
6ACKプリンタがアクノリッジ0でアクノリッジ
7BUSYプリンタがビジー1でビジー反転

レジスタ0x37A,0x27A,0x3BE(コマンドレジスタ)

書きこみが可能。
ビット機能意味極性ピンとの対応
0STBデータのストローブ1でストローブ反転
1AUTOFXINIT印刷後自動改行1で印刷後自動改行反転
2#INITプリンタ初期化0でプリンタ初期化
3SLCTINプリンタセレクト1でプリンタセレクト反転
4割り込み許可割り込み許可1で割り込み許可-
5データポートの方向データポートの方向0で出力、1で入力-
6予約  -
7予約  -


となっています。見てわかるとおり、レジスタの内容とポートにでてくるピンの極性が逆転していることがよくあるので注意してください。


プリンタポートアクセス例
 次の図はプリンタポートにアクセスする図です。先ほどのdebugツールを使用しています。


  • o 37a ccでコマンドポートに0xCCを出力します。このとき、データポートは出力になるはずです。
  • o 378 55でデータポートに0x55を出力します。この時点でデータポートの各ピンに0x55が出力されているはずです。
  • i 378でデータの値を読みます。今、データポートが出力モードになっているので、前回に出力したデータ(0x55)が見えています。
  • o 37a ecでコマンドポートに0xECを出力します。このとき、データポートは入力になるはずです。
  • i 378でデータの値を読みます。今、データポートが入力モードになっているので、先ほど書きこんだデータ(0x55)は見えずに、ポートのピンの状態(0xFF)が見えています。
  • i 37Bで禁止されているアクセスをします。0xFFが返ってくるので、あまり面白くありません。
  • i 379でステータスレジスタを読みます。


使っているプリンターポートのモードを確かめる方法
 いま使っているプリンターポートが双方向モードに対応しているかどうかは、次の方法で確かめます。
  • アドレス37a(あるいは27a,3be)のレジスタのビット5を1にしたデータを書きこみます(入力モードになる)。
  • アドレス378(あるいは278,3bc)のレジスタ(データポート)に、適当なデータを書きこみます。0x55でいいでしょう。
  • アドレス378(あるいは278,3bc)のレジスタ(データポート)を読みます。先ほど出力したデータ(0x55)と同じであった場合は、お使いのプリンターポートは双方向に対応していません。
  • ためしに、アドレス378(あるいは278,3bc)のレジスタ(データポート)に、別の適当なデータを書きこみます。0xAAでいいでしょう。
  • アドレス378(あるいは278,3bc)のレジスタ(データポート)を読みます。先ほど出力したデータ(0xAA)と同じであった場合は、お使いのプリンターポートは双方向に対応していません。
解説
 プリンターポートが出力モードのときに、データポートを読むと最後に書きこまれたデータが読み出されます。プリンターポートが入力モードのときに、データポートを読むと現在のデータ端子の値が読み出されます。もし、単方向にしか対応していない場合は、データポートが出力にしかならないので、常に最後に書いたデータと同じデータが読み出されるわけなので、それを使ってポートが双方向かどうかを確かめることができるわけです。