« 『部室からCQ ham radio 創刊号を発掘した話』 | トップページ | 「電池あれこれ」、グラフのまとめを更新 »

2023年12月 7日 (木)

Arduinoで「ボコスカハンマー」 あれれれれっ?!

ボコスカハンマー」を作ってと依頼がありました。
   ・10秒ゲーム
ベースはArduino UNO R3ですが、ブートローダーを
書いたATmega328Pチップ(28pin DIP)をユニバーサル基板
に乗っけて製作します。
配線を終えて、チップにスケッチを書いたら・・・
ありゃま。 テレビに出る画像に異常がぁ!

このタイトル画面が
Bk21
これ↓に
Bk11

スタート待機画面が
Bk22
これに
Bk12

現在のところ、原因不明。
現用しているビコピコやシャカシャカからチップ抜いて、
今回作った手組み回路に突っ込んだらちゃんと動くので、
配線や使った部品に起因するものではありません。

原因の推定
 ・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

 

|

« 『部室からCQ ham radio 創刊号を発掘した話』 | トップページ | 「電池あれこれ」、グラフのまとめを更新 »

トラブル遭遇」カテゴリの記事

Arduino」カテゴリの記事

10秒ゲーム」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 『部室からCQ ham radio 創刊号を発掘した話』 | トップページ | 「電池あれこれ」、グラフのまとめを更新 »