投稿

4月, 2025の投稿を表示しています

スーパーファミコン コントローラーの無線化プロジェクト:バグ有だが、一応動きはする ここまでまとめ

イメージ
  SFCに接続された側のESPはSFCの5Vから電源を供給(このSFC、USB typeCに改造済みなんで電力的に余裕がある・・ACアダプターの時に動くかは不明だがおそらく問題ないかと) 動画見ていただくとわかるように、時よりボタンを操作していないのにも関わらずドンキーコングがジャンプ(Bボタンを押した挙動)をしてしまう。 SFCに接続する側のESPのスケッチ #include <ESP8266WiFi.h> // WiFi #include <WiFiUDP.h>     // UDP #define PS_READ_PIN 5 #define DAT_OUTPIN 4 #define DAT_OUTPIN_BIT (1<<4) int button_status; // SSIDとパスワード const char *ssid = "esp8266" ; const char *password = "12345678" ; //create UDP instance static WiFiUDP udp; #define LOCAL_PORT   5000  // port number for local #define REMOTE_PORT 5000  // port number for remote // IPアドレス IPAddress localIP; //local IP address IPAddress remoteIP;  // remote address void onRising () {   noInterrupts ();   //B Y SELECT  START 上 下 左 右 A X L R HHH   //button_status = 0b1010101010101011; // for test   delayMicroseconds ( 9 );   for ( int j = 0 ; j < 16 ; j++) {     WRITE_PERI_REG (PERIPHS_G...

スーパーファミコン コントローラーの無線化プロジェクト:attachinterrupt後のバラつき問題

イメージ
スーパーファミコン コントローラーの無線化プロジェクトの続き (今回で結論として今のアプローチでは無線化は形の上では動かせた(ドンキーコングの1面がクリアできるぐらい)。しかし、バグ(時折Bボタンが押されてしまう)が取り切れないとないという結論。) デジアナでキャプチャーした二つを見比べる。比べるのは、赤のESPで生成しているDAT信号。テストで101010.....と送っているが、立ち上がり開始時間が異なる! アルゴリズム的には、P/Sのパルスが入ってくるのを検出、その検出を基準にして、SFC側にコントローラーの信号をESPで生成して送り込むという事で対処してきた。 ほとんどの場合、2.5usecぐらいP/Sから遅れてDATのデータが始まる。以前のテストは5usecだったが、今回、ESPのCPUのクロックを80MHzから160MHzに処理速度をあげて.2.5usecの検出時間を得ている 上のグラフの二つを見比べると、最初のパルスの開始時期が異なる。 ただこのP/Sの立ち上がり検出して、DATをHIGHにするまでの時間がばらつく。 上の場合14.5usecになっている。数usecとかなら、吸収できるが、14.5usecはCLKの周期の12usecより長く意図した動作にならない! 毎回14.5usecなら修正のやりようもあるが・・・・10usecだったりと、それもランダムに事象が起こる・・ 【対処】 Bボタンの所だけどうしても他より長い処理をするので、if文で最初なら・・・と条件分岐していた。他のelse以降は、12usecで一定に出力できるのに、立ち上がりにあわせて異なるではないか!!という事から・・・ まずは最初作ったソース void onRising () {   noInterrupts ();   //B Y SELECT  START 上 下 左 右 A X L R HHH   button_status = 0b 1010101010101011 ; //ボタンが押されていたら1   for ( int j = 0 ; j < 16 ; j++) {     if ( bitRead (button_status, 15 - j) == 0B 00 ) {  ...