PS/2キーボードを繋いでみては?

【抵抗は】MorphyOne102【無意味だ】 http://pc3.2ch.net/test/read.cgi/mobile/1038497456/- 219 名前:某スレの400番台の何か 投稿日:02/11/29 15:52 ID:???
- >>211
ご苦労さまでつ。 次は、あっという間に漏貧が3年掛かって今だにできてないキーボード
繋ぐのに挑戦してみてはどうでちょ!
CPUでタイミング取りながらポートからシリアルデータ読み込んでもいいし、74LS322A
(既にディスコン)が入手できれば、ちょっと回路組めばパラレルデータとして読む
ことも可。
ソフトでシリアル−パラレル変換しながら読むなら、H8の外部割込端子にキーボード
クロック繋いで、キーボードデータは双方向なんで、オープンドレインで駆動してちょ。
もちろん、キーボードからのデータ読むだけなら入力でOKっす。 念のためクロック
とデータは10kΩくらいのプルアップ入れておいた方がいいかも。 H8基板が壊れるのが
心配だったら、HC125あたりかました方がいいね。
そうすりゃ、クロック信号で割込みかけれるんで、割込処理に入ったら、割込マスク
してクロックのH->L変化でデータを取り込みながらシフトして、8bit分揃ったら、
キーコード1つ分。 データは...
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
| START | D0 | D1 | D2 | D3 | D4 |
D5 | D6 | D7 | PARITY | STOP |
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
の順で、スタートは常に'0'、 パリティは奇数、ストップは常に'1'でつ。 GCCあたり
使ってんなら、キー取り込み用のCのソース書いてもいいけど?
-
- なんか話を聞くだけだと簡単そうだ(か?)
-
- まず、キーボード延長ケーブルをこのネタの為に500円で買ってきて途中の被服を剥き、PCとキーボードの間に繋いで電圧とかを測ってみる。安定して5Vが出ているのが電源ペアで、あとが信号線だから、多分こんな感じだろう。
- PS/2用メス(ジャック)の信号図
-
http://www.mickey.ai.kyutech.ac.jp/~tsato/cosmos/alumni/yusuke/keyboard.html
も参考にさせていただきました。
-
- というわけで、上のアドバイスと
- http://www.mars.dti.ne.jp/~tokoya/contest/PS2KB/readme.html
- あたりを参考に繋いで見る。
-
- (コネクタとキーボードを結線。上側にあるIC:74HC14については後述)
-
-
で、ClockとDataを測定すると、、、、こんなんでいいんかぁ?なんかヒゲ出まくっているし〜。
- これは直繋がずに、バッファ入れたほうがいいですかね。
- (ひょっとしてジャンクなキーボード使っているからか?といってもPS/2なキーボードは他にないし)
- 場合によっては、クロックで割り込みかけた後、再度クロックラインを見てLになってなかったらヤンペっていう、チャタリング防止ルーチンを入れたほうがいいかも。
-
- というわけで、Aを押すとスキャンコードは0x1Cと観測される。
- このあたりは
http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/keyboard/scancodes2.html
によると、、、おぉ確かにAのスキャンコードは0x1C (0001 1100) ですね。
(念のため:上図ではスタートビット0が始まり、次にLSBから出力されるので00011100を反対にした00111000が出力され、ここまでで1は奇数個あるから、パリティビットを0にして、ここまでの1のビット数を奇数に保ち。最後にStopBit0を出力して全11ビットが出力されています)
-
というわけで、実際の回路:Dataにシュミットを入れて少しでもマシな波形にする。
- (クロックにシュミット入れたら、電位のせいでかえって変になってやんの)
- (電解コンデンサ100uF:一応いれてみました。効果全然無いけど。あと74HC14の電源に104ね。)
-
- シュミット(74HC14)を入れる前と後のDataラインの比較
-
-
- う〜ん、まぁこんな程度でいいか。あんまり欲張ってもアレだし。
-
- テストプログラムとしては、
- CPU-CCR:割り込み禁止:
- ポートP14をIRQ0として使用宣言
- IRQ0のエッジ方向を立ち下がりに。
- IRQ0をイネーブルに
- キーボードバッファ初期化
- CPU-CCR:割り込み許可
- (ここから割り込みを待ちつつループ)
- キーボードバッファにデータがあれば、テーブルと比較して、該当コードを液晶へ。
- キーボードバッファを空にする。
- (ループぐるぐる)
-
- IRQ0割り込みでの処理
- スタートビットが0でなければデータ破棄:やりなおし
- ポートP11をリード
- シフトしつつ、バッファにストア
- パリティまで達してなければ割り込みから復帰
- パリティならパリティチェック:奇数パリティ違反ならデータ破棄:やりなおし。
- ストップビットなら1をチェック:違っていればデータ破棄:やりなおし
- ビットが揃ったところでバッファをキーボードバッファへ転送
- 割り込み正常終了:復帰
-
- ってするんだろうかね?どうせテストなんだからスタート、ストップ、パリティビットのチェックは省略しちゃえ〜
- 11ビットのうちの8ビットだけ切り離せばよろし。
- んでもってスキャンコードは、なんていうか、キーボードの左下から右上へ増えてゆくので、テーブルを用意しなきゃならんのだけど、面倒なので'A'(0x1C)
と'Z'(0x1A) だけ用意する。さて、キーボードからAZと打つと、、、、
-

-
- おぉおぉぉ。出た出た。実は、最初AAZZってダブって出るのでなんぢゃ〜と思っていたのですが、キーボードを押して離すと0x** 0xF0 0x** と出るので、コードが2回出るんだな。この0xF0が出たら次のコードは無視しないとダブルというわけで、データがF0の時は次のデータは無視するっていう安直回避をしてなんとか出力が出ました。
- というわけで、終了終了。撤収撤収
-
完璧さに慄(おのの)いて、撤収