マイコン独立大作戦
キーボードインターフェースの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
そして作戦その2は、やっぱりキーボードインターフェースしかありませんでしょう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第11回]
●ひとつ問題が…
[第5回]と[第6回]のテストはND80Z3.5の82C55に直接PS/2コネクタからのCLKとDATA信号を入力して、マシン語プログラムで処理をすることで行ないました。
PS/2キーボードのインターフェースといいますと、シリアル入力ですから、PICなどを使ってそのシリアルインターフェースで、などと考えるのが一般的と思います。
しかしPS/2キーボードのシリアル通信はクロック同期式で80μs/クロックですからマシン語でもなんとか処理できる速度です。
80μs/クロックはビットレートで表しますと、12500bps(bit per sec)です。
この数字をちょっと見ますと、9600bpsよりも速いので割り込みでも使わないと無理ではないか、と思われるかもしれません。
しかしそんな必要はありません。
1バイトのデータが11ビットを使って送信されますから12500/11=1136バイト/secの通信速度です。
1バイトのデータにつき0.9msほどで処理すればよいのですから、マシン語ならば問題の無い速度です。
実はそんなに「速く」処理する必要はないのです。
キーボードから出力されるデータである、というところがポイントです。
当然キーボードは人間が使うものですから、1秒間に1000回もキーを打つことなどとてもとてもできるものではありません。
いくら慣れた人がキー入力をしたとしてもたかが知れています。
キーを押し続けた場合のオートリピート出力でも0.1秒に1回の出力です([第4回])。
つまり80μsごとに入力されるデータを8ビット分シフトして入力することさえできればあとはゆっくり処理しても十分間に合います。
シリアル入力されるデータを8ビットシフトすること(シリアルパラレル変換)は難しそうに思えますがなんてことはありません。
[第5回]のサンプルプログラムにありますように、ローテイト命令(RRA)を使えば簡単にできてしまいます。
ということで、割込みを使う必要もありませんし、外部に何かのICなどでシリアルパラレル変換をさせる必要もありません…。
と、ここまでは、その通りなのですが。
実は1つだけちょっと困ることがあるのです。
普通にキー入力する分には[第5回]のプログラムの後ろにコード変換などを付け加えれば全く問題なく使えます。
問題はプログラム実行中の強制ブレーク処理です。
通常は[Ctrl]+[C]のキーを入力することで実行中のユーザープログラムを強制終了してシステムに戻す機能として使われます。
ZB3BASICでは[Ctrl]+[B]を使います。
ここに割込みを使うことも考えられますが、問題は[Ctrl]+[C](あるいは[Ctrl]+[B])の動作に入るためには、[Ctrl]キーが押されて、次に[C](あるいは[B])が押されるまで待っている必要があるという点です。
そんなことよりも、そもそも何かのキーが押されたとき、それが[Ctrl]であるか否かを判定するためには1バイト分の入力が完了するまで待っていなければなりません。
80μs×11=880μsですからわずかな時間のように思われますが、これは大問題なのです。
たとえばZB3BASICの場合1行の処理ごとにキー入力のチェックをしています。
もしも何かのキーが押されたとすると、1行の処理ごとに最低でも880μs余分な処理時間がかかってしまいます。
高速で、ある処理を繰り返し実行しているときなど、ただキーを押しただけでがくっとスピードが落ちてしまいます。
これでは困ります。
そういうことになると、やはり外部でシリアル入力をしてパラレルデータに変換して、[Ctrl]が押されているかどうか、さらにあわせて何かのキーが押されているかどうかを判定して、常時それをホスト(CPU)側から見れるような仕組みが必要になってきます。
説明の途中ですが本日は時間がなくなってしまいました。
この続きは次回にいたします。
キーボードインターフェースの製作[第11回]
2016.10.21upload
前へ
次へ
ホームページトップへ戻る