プリンターポートのピン割り当て |
パソコンについているコネクタはD-SUB25pinのメスです。
# | 記号 | 方向 | 意味 |
1 | #STROBE | IO | データのストローブ |
2 | D0 | IO | データ |
3 | D1 | IO | データ |
4 | D2 | IO | データ |
5 | D3 | IO | データ |
6 | D4 | IO | データ |
7 | D5 | IO | データ |
8 | D6 | IO | データ |
9 | D7 | IO | データ |
10 | #ACK | I | アクノリッジを返すときにL |
11 | BUSY | I | ビジーでH |
12 | PE | I | 紙が切れるとH |
13 | SLCT | I | オンラインならH |
|
# | 記号 | 方向 | 意味 |
14 | #AUTO FX INIT | O | 印刷後に自動改行するならL |
15 | #ERROR | I | プリンタのエラーでL |
16 | #INIT | O | プリンタの初期化をするときにL |
17 | #SLCTIN | O | プリンタをセレクトするときにL |
18 | GND | - | グラウンド |
19 | GND | - | グラウンド |
20 | GND | - | グラウンド |
21 | GND | - | グラウンド |
22 | GND | - | グラウンド |
23 | GND | - | グラウンド |
24 | GND | - | グラウンド |
25 | GND | - | グラウンド |
|
|
説明 |
標準のプリンターとプリンターポートを介してインターフェースするときには、まず、プリンタがビジーでないことを確認します。そして、データを出力し、ストローブをカチカチっと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(データレジスタ)
読み書きが可能。
ビット | 機能 | 意味 | 極性 | ピンとの対応
| 0 | Data bit 0 | データのビット0 | - | 正
| 1 | Data bit 1 | データのビット1 | - | 正
| 2 | Data bit 2 | データのビット2 | - | 正
| 3 | Data bit 3 | データのビット3 | - | 正
| 4 | Data bit 4 | データのビット4 | - | 正
| 5 | Data bit 5 | データのビット5 | - | 正
| 6 | Data bit 6 | データのビット6 | - | 正
| 7 | Data bit 7 | データのビット7 | - | 正
|
レジスタ0x379,0x279,0x3BD(ステータスレジスタ)
読みこみが可能。
ビット | 機能 | 意味 | 極性 | ピンとの対応
| 0 | 予約 | さわっちゃだめ | - | -
| 1 | 予約 | さわっちゃだめ | - | -
| 2 | 割り込みステータス | | - | -
| 3 | #ERROR | プリンタがエラー | 0でエラー | 正
| 4 | SLCT | プリンタがオンライン | 1でオンライン | 正
| 5 | PE | プリンタが用紙切れ | 1で用紙切れ | 正
| 6 | ACK | プリンタがアクノリッジ | 0でアクノリッジ | 正
| 7 | BUSY | プリンタがビジー | 1でビジー | 反転
|
レジスタ0x37A,0x27A,0x3BE(コマンドレジスタ)
書きこみが可能。
ビット | 機能 | 意味 | 極性 | ピンとの対応
| 0 | STB | データのストローブ | 1でストローブ | 反転
| 1 | AUTOFXINIT | 印刷後自動改行 | 1で印刷後自動改行 | 反転
| 2 | #INIT | プリンタ初期化 | 0でプリンタ初期化 | 正
| 3 | SLCTIN | プリンタセレクト | 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)と同じであった場合は、お使いのプリンターポートは双方向に対応していません。
解説
プリンターポートが出力モードのときに、データポートを読むと最後に書きこまれたデータが読み出されます。プリンターポートが入力モードのときに、データポートを読むと現在のデータ端子の値が読み出されます。もし、単方向にしか対応していない場合は、データポートが出力にしかならないので、常に最後に書いたデータと同じデータが読み出されるわけなので、それを使ってポートが双方向かどうかを確かめることができるわけです。
|
|