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の時は次のデータは無視するっていう安直回避をしてなんとか出力が出ました。
というわけで、終了終了。撤収撤収
 

完璧さに慄(おのの)いて、撤収