前回、ArduinoNanoをつかってATmega328のピン変化割り込みによるMSXキーボードスキャン信号キャッチが成功しましたので、そのプログラムをベースにPS/2キーボードMSXアダプタのAVRマイコン(ATnega328)用にモディファイして書き込んでみたいと思います。
準備 : 内蔵CR発振器用ブートローダー書き込み
内蔵CR発振器用ブートローダーをダウンロード
まず、PS/2キーボードMSXアダプタのAVRマイコンは内蔵CR発振器(8MHz)で稼働させたいので、以下のページにある「breadboard-1-6-x.zip」をブートローダーとして書き込みます。
参考にさせていただいたのは以下のサイトです。
ブートローダーの展開、配置
ダウンロードしたzipファイルを展開して出てきた “breadboard”フォルダを、Macだと ホームディレクトリ/書類/Arduino
、Windowsだと C:\Program Files (x86)\Arduino\
にある”hardware”フォルダにおいてください。なければ”hardware”フォルダを作りましょう。
ArduinoIDEを起動して ツール > ボードを選ぶと “ATmega328 on breadboard (8MHz internal clock)”がメニューに出てくるはずなので選択します。
書き込みツールの準備
上記サイトでは、書き込み用のツールとしてArduinoUNOにArduinoISPスケッチを書き込んで使用していますが、今回私は以下のリンクのようにUSBASP互換ツールをAmazonで安くゲットしていたのでそれを使用します。最近は、AliExpressで売っていたようなこの手のツールがAmazon倉庫発送でゲットできたりするので重宝しています。(私が買ったときは3個セットだった気がします。)
あと、こちらのような10pin→6pin変換があると便利です。PS/2キーボードMSXアダプタでは6ピンのICSP端子を装備しています。(ジャンパ線でつないでもOKですが…)
ArduinoIDEを使って書き込み
つぎに、書き込み装置を選択してください。私とおなじ USBaspを使用する場合は、ツール>書き込み装置で それを選択してください。
その後、PS/2キーボードMSXアダプタにATmega328を装着しUSBaspの6ピンコネクタを接続した後 ArduinoIDEの ツール > ブートローダを書き込む でブートローダーを書き込んでください。
この際、差し込む向きに注意してください。下の写真が参考です。
PS/2キーボードMSXアダプタ用にスケッチの改良/書き込み
ブートローダーの書き込みが済んだら、つぎにPS/2キーボード用MSXアダプタ用スケッチを書き込みます。スケッチ類はgithubにUPしてあります。
スケッチ改良ポイント
ArduinoNano版のスケッチからの改良点は以下の通りです。
- PS/2キーボードMSXアダプタでは前述のとおり8MHz内蔵CRクロックを使用するため水晶振動子用ピン2本をI/Oピンとして使用します。これでポートBが8ビット分まるまる使用できます。
- MSXのキースキャン波形をAnalogDiscovery2で観測した結果を、割り込みルーチンに反映
MSXキースキャン波形について
以前から悩んでいた8255PPIのCポート4本のMSXキーボードスキャン信号について、AnalogDiscovery2のロジアナで観測してみたところ以下のような波形となっていました。
0→1→2→3→…→9とスキャン信号が来るところは想定通りでしたが、前後に0xAとか0x8という信号も来ています。MSX HobbyさんのスケッチではArduinoMEGAに割り込みがかかったタイミングでキースキャンの「次のバッファ」を出力するコードとなっていますが 上記の波形を見ると0x8を検知するタイミングが2回あります。これが数字キー0〜7を入力時に2文字入力される原因のようです。ちょっと回りくどいコードですが、以下のようにしてみました。(とりあえず、マイクロ秒単位のWAITは排除できました。)
ISR(PCINT1_vect)
{
byte wk_c = PINC;
if ((prev_keyscan == 10)&&(wk_c == 8)){
keyscan_f = true;
} else if (wk_c >= 10){
prev_keyscan = wk_c;
keyscan_f = false;
}
if (!keyscan_f){return;}
if ( wk_c == 8) {
if (prev_keyscan == 10){
PORTB = keyboard.MSX_KB_Matrix(0);
}else{
PORTB = keyboard.MSX_KB_Matrix(wk_c+1);
}
}else{
PORTB = keyboard.MSX_KB_Matrix(wk_c+1);
}
prev_keyscan = wk_c;
}
スケッチの書き込み
スケッチの書き込みもArduinoIDEを使用します。私はブートローダーと同様にICSP端子を使って書き込みを実施しましたので、いつもスケッチをシリアル経由で書き込むときに使う「→」アイコンではなく スケッチ > 書き込み装置を使って書き込む のメニューからATmega328Pへ書き込みを実施しました。
無事稼働!
キーボードを使うソフトというと、「信長の野望 全国版」です。キーボードの制御が正しくないと、起動時の「HIT ANY KEY」が正しく出ずメニューが先に進んでしまって詰むという状況になってしまうのですが、正しく表示されました!
コメント