SFCコントローラの解析(シリアルパラレル変換) 2010/08/05
1.はじめに
SFCコントローラの解析資料は検索すればたくさん出てきます。 PICマイコンの勉強ということで信号をシリアルからパラレルに変換しようと思います。
2.SFCコントローラ概要
SFCコントローラには4021というICが2個、または4021が2個と同等の機能をするICが搭載されています。 下の写真がSFCコネクタのピンアサインです。
3.SFCコントローラ信号の読み取り
SFCコントローラはボタン信号をシリアルに変換して通信しています。
変化の順序は
- P/SとCLKがHになる。
- P/SとCLKがLになる。
- Bボタンが押されてなければDAT1がHに、押されていればDAT1がLになる。
- CLKがHになる。
- CLKがLになる。
- Yボタンが押されてなければDAT1がHに、押されていればDAT1がLになる。
- CLKがHになる。
- これらをすべてのボタンで繰り返していきCLKが17回目Hになる時、P/SもHになる。
という風に通信しています。これらの信号をPICで制御しパラレルに戻してみようと思います。
CLKの回数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
対応するボタン | B | Y | SELECT | START | 上 | 下 | 左 | 右 | A | X | L | R | 識別符 |
となっています。これをC言語で記述します。
#define PS ポート番号(出力) #define CLK ポート番号(出力) #define DAT1 ポート番号(入力) char data1[16]; //1P // data[(CLKの回数)-1]=CLKの回数の時の対応するボタンの状態,押していると0,話していると1 void main(void){ int i,j; while(1){ //読み込み開始 PS = 1; CLK = 1; // 1.PSとCLKをHに 読み取り開始の信号 PS = 0; CLK = 0; // 2.PSとCLKをLに data1[0] = DAT1; // 3.Bボタンが押されてなければDAT1がH //押されていればDAT1がL for(i=1; i<16; i++) { CLK = 1; // 4.CLKをHに CLK = 0; // 5.CLKをLに data1[i] = DAT1; // 6.DAT1の論理をdata1[i]に代入 //7.8.以降14回ループする } //読み込み終了 //以下にボタンに対応させたポートをHかLか制御してパラレルに変換終わり } }
となります。
*注意 ポート番号の設定やポートの初期化はしていません。
ファミコンの場合は読み取りをCLK8回で良さそうですので、また実験してみます。 次は、マルチタップに挑戦してみます。 マルチタップの信号を読み取り、4個のコントローラが使えるUSB変換機を目標にしてみます。
参考文献
「明日の(ん)予定は仮定の未定で決定。(略して「あんかけ」)」 たんま様