8255への出力ができたので同じように入力も確かめてみました。プログラムは以下のようにPAのみ入力に設定したあとPAの読み取りデータをPB,PCに出力するのみです。
I/Oへの出力(STORE)時のCNTLフィールドは0x41(AS=1.SB=0,OPT='001')でも0x51(AS=1.SB=1,OPT='001')でもどちらでも各レジスタへのアクセスはできました。
ところがI/Oからの入力(LOAD)時は何故か0x40(AS=1.SB=0,OPT='000')か0x50(AS=1.SB=1,OPT='000')でないと読取れないのです。マニュアルから得た理解と違いアライメントがどうなっているかあとで調べなければなりませんが、とりあえずはI/Oの入出力ができたので一歩前進です。
ところでこの実験はテスト用治具のパラレルモニタ部分の機能を使っています。8bitパラレル×2系統、16bit分のレベルをモニタ出来るのですがうち左端4bit分にはトグルスイッチがついていてロジックレベルを強制的に注入することもできるようになっています。
以下は1チャンネル分の回路ですが左端の端子は双方向性で出力ポートテストをするときはバッファを通してLEDをドライブしH/Lをモニタ、入力ポートテストをするときはトグルスイッチを切替えると端子にH/Lレベルを印加することができます。スイッチの中点にある10kΩは端子を出力モニタとして使うときスイッチ状態の影響を受けないようにするものです。
ところがこの治具を8255の入力ポートに接続したところ、スイッチの切替えでL→Hを注入すると8255で該当ビットのH状態を読取れましたが、今度はH→LにしようとしてもLにならないのです。テスト治具側もターゲット側もCMOS入力の高インピーダンスのはずで10k程度で十分H/Lのロジックは確定できると思ってました。
スイッチをGND側に倒したときでも端子の電圧は落ち切らずに約2.8Vもあるのです。これは等価的に8255の入力ピンが8kΩくらいでプルアップされてるようなものでHのままなのは当然です。
ということでスイッチ中点の保護抵抗10kΩを適当に3.9kΩに交換しました。こうすると8k//3.9kで2:1。CMOSの閾値VDD×1/3から考えるともっと小さくするべきだったか。
これをターゲットにつなぐと今度はうまくいきました。ちゃんとスイッチのL/Hを読取れています。念のためL設定時の端子電圧を測ってみるときっちり0Vまで落ちていてなんか8255の入力特性が変です。
いまさらですが8255のデータシートを見直したら意外なことがわかりました。
以下のように各ポートの全ピンにバスホールド回路が内蔵されているようなのです。入力ピンのH/Lレベルによってアクティブpull up/pull downが切り替わるのでかかる挙動になっていたのでしょう。
しかし8255は昔から使っていますがこんな機能があったなんて初めて知りました・・・というか調べてみるとこれは今回実装したハリス(Intersil)社製のCS82C55A固有の機能のようです。沖のMSM82C55、NECのuPD71055ではマニュアルを見た限り言及されていません。
これは便利なようで出力インピーダンスの高いスイッチやセンサをつなぐときは要注意です。