「ボコスカハンマー」を作ってと依頼がありました。
・10秒ゲーム
ベースはArduino UNO R3ですが、ブートローダーを
書いたATmega328Pチップ(28pin DIP)をユニバーサル基板
に乗っけて製作します。
配線を終えて、チップにスケッチを書いたら・・・
ありゃま。 テレビに出る画像に異常がぁ!
このタイトル画面が
これ↓に
スタート待機画面が
これに
現在のところ、原因不明。
現用しているビコピコやシャカシャカからチップ抜いて、
今回作った手組み回路に突っ込んだらちゃんと動くので、
配線や使った部品に起因するものではありません。
原因の推定
・Arduinoのコンパイル環境が変わって最適化などの
状態が前と変わってしまったのか。
・今回使ったATmega328P、その内部が前のと
違うのか。(まさか)
※パチモンの可能性
ジャギジャギになっている表示そのものは安定して
いるのです。
チラチラはしてません。
Arduinoの環境を昔のに戻すのはちょっとかなわんし。
sleepさせてH-SYNCサイクルでの割り込みを待って
表示という処理を流しています。
チラチラしないということは、どこかで安定した
時間待ちが出ているもよう。
はてさて・・・困ったぞ。
※わかったぞ!
やっぱりコンパイル環境による最適化の違いでした。
水平走査、1ラインを描画出力しているのはこんな処理です。
void v1line(void)
{
byte i;
uint32_t d; // 32bitデータにコピー
d = sft_bff.sft; // シフトデータ
for(i = 0; i < 32; i++){ // 32bit
if(d & 0x80000000){ // MSB 0/1 ?
VSIG_H; // H出力
nop(); nop(); nop(); // wait
nop(); nop(); nop(); ★1
nop();
}
else{
VSIG_L; // L出力
nop(); nop(); nop(); // wait
nop(); nop(); nop(); ★2
nop();
nop();
}
d <<= 1; // 左シフト ★3
}
nop(); nop(); nop(); nop(); // wait
VSIG_L; // L出力で終わる
}
画面を光らせるのはVSIG_H。
消すのはVSIG_L。
SBI、CBI命令でポートを直接叩いています。
そして、タイミングの調整に「nop」命令を並べています。
H出力の時【★1】はnopを7個実行して、32bit描画データの
左シフト処理【★3】に飛びます。
そしてそして・・・
コンパイラの最適化がすごいのがL出力の時。
VSIG_Lの実行後、その下に記してあるnop命令8個【★2】
は、数を合わせればVSIG_Hのところにあるnopを使ったら
エエやんということで、VSIG_H直後のnopの場所に飛んで
いるのです。
※この飛ぶためのjmp命令の分、L処理時間が
延びてしまった。
【★2】のnop命令は1つだけを残して実行プログラムの中から
抜いてしまっていて、存在していませんでした。
それでもシフト処理に来ますんで、流れは間違っていません。
絵がおかしくなってしまったのは、nopの数合わせはした
けど、描画のタイミングが白黒でズレてしまったというのが
原因でした。
※バックアップがわりにスケッチと回路図
・ダウンロード - piko_boko1c.zip
最近のコメント