GBS-Controlで映らない場合その2
前回の「GBS-Controlで映らない場合」から、たまに思い出しては何とかならないかと試行錯誤してはいました。
LM1881を使って上手く出来ないかと実験をしていたのですが、LM1881を使ってCSyncをVSyncとCSync出力に分けてそれをGBS-Cに入力するとCSync+VSyncと認識されるらしいことが分かりました。
その入力では少し前回の手法で成功する確率が上がるようなのですが、そこまで止まりです。
設定を弄ると映るようになることから、そのうちファームウェアの更新で対応されるかと思っていましたが、昨年末あたりの確認では変わっておらず、待っていても変わらないようなので腰を据えて原因を調べてみることにしました。
といっても映像信号の知識はさわりぐらいしか知らないので、解決できるかは不明でしたが結果的には使えるものが出来ました。
CSync信号を観察する
観察するにはオシロが必要かと思いますが、持っているのは数年前に買ったDSO138という格安オシロのみ。
全く使えないわけではありませんが、調べるには色々と辛いものがあります。
そこでふと格安ロジアナも買っていたのを思い出し、同期信号はデジタル信号らしいといううろ覚えの知識からこれで調べられるのじゃないか?ということでCSyncを観察してみました。
使えそうです。実際の波形とは違うのでしょうが信号を見るには十分だと思います。複数のチャンネルが同時サンプリングできるのも大きいです。
この波形はSFCのY信号をLM1881に入力し、そこから出たCSyncを上段に、VSyncを下段に表示しています。
因みにこの信号はGBS-Cで問題なく映る信号です。
次はNESRGBの信号。波形も同じで当然問題なし。
こちらも問題なく映る基板ですが、SFCと比べて大きな違いが。
垂直同期期間中に一切パルスがありません。
手持ちの数少ない基板では、正常に映る基板は全部これでした。
LLMによると、GBS-Cではパルスが無くなると内部カウントで正しいパルスがある時のように動作できるとのこと。
ブラウン管モニタの場合もモニタ内部でパルスを生成しているので、垂直同期期間だけパルスが無くても大きくずれないということでした。
映らない基板の1つです。
こちらは真面目に垂直同期期間中もパルスが出ているようですが、SFCと比べて最初の部分が異なります。
さらにVSyncも変です。真ん中でHになっている部分があります。
これは入力されたCSyncが不正なため、LM1881が誤動作した結果というのがLLMの回答でした。
映らない基板のもう1つです。
ドッジボール部と似た波形ですが、垂直同期期間の最初のパルス幅が少し異なるようです。LM1881のVSyncが変なのも同じです。
推察とテスト
垂直同期期間中の水平パルスが、正しく出ているものや、いっそ出ていないものはGBS-Cの内部カウンタにより補完されて動くが、出ているがそれが間違っている場合、GBS-Cは惑わされて同期を合わせられなくなるのではないか、という予想を立てました。
ではどうするか。
LM1881の上位互換のようなICでH/V分離機能があるものがあり、それが使えるのではないか?と考えましたが、かなりお高い。LLMに聞くとH/V分離はAVR等のマイコンで簡単にできる。電子工作界隈ではマイコンで分離するのがスタンダードだというので、AVRは予備に持っているしプログラムはLLMに書かせてやろう、という魂胆で部品を揃え回路を作成しました。(が紆余曲折あり、結局自分で書く羽目に)
自分で書くことになった結果、とりあえずのテストとして、AVRに入力したCSyncを見て、同じ信号を別のピンに出力するだけのコードを書き、それをGBS-Cに入力しどうなるかというテストを行いました。
これでSFCであれば何の変わりも無く綺麗に映る、と思ったのですが、画面は流れはしないものの、ノイズだらけの画面になります。
ノイズ、というよりは1ラインごとに微妙に左右にブレいている感じ。
LLMによると、これはピン変化割り込みからの動作までに数クロックのジッタがあるためというので、この最小動作で間に合わないのならAVRでH/V分離は速度不足かと聞くと速度不足、あるいは限界ギリギリとの回答。
AVRで簡単にできるって言ったのにとイライラしながらも、速度不足なら無理かと諦めかけたのですが、あるアイデアを思いつきました。
アイデア
それはCSyncで垂直同期期間のパルスが不正というなら、AVRで強制的にその期間だけLにして潰してしまえば良いのではないか。H分離はする必要がない。潰さない部分の信号はAVRは全く関与しないのでジッタなどの影響も原理的に存在しない、というもの。
そこで最初はSFC等と異なる最初の1パルス目だけを潰しました。が、これは失敗。全く改善されず同期は合いません。
それならばと、パンクショットの基板のように垂直同期期間中のパルス全体を潰すとこっちは大成功。画面が乱れることは無くなりました。
1段目が信号を潰した奇々怪界のCSyncで、2段目がAVRから生成したVSync、3段目がLM1881から出力されたVSyncになっています。
AVR出力のVSyncの長さがLM1881よりも短くなっていますが未調整です。VSyncとして入力してもGBS-Cには認識されず、単にCSync入力として動作するようです。
一方、LM1881の方は変な波形でもVSyncとして認識されるようです。
この状態でも同期の問題は解決されているので、VSyncに関してはこのままで良いかなと言うところです。
回路図
動作としてはCSync、コンポジット、Y入力などをLM1881を使ってCSyncのみにします。
そのCSyncをAVRで監視し、垂直同期期間になった時PD5をHにします。
それによりトランジスタがCSyncラインをGNDに繋げるのでCSyncがその間Lに張り付くという動作になります。(最初はトランジスタのないバージョンで作りましたが、デバッグし難かったので変更しました)
有効/無効スイッチでPB1をGNDに繋げるとその処理を行いません。
※VSync選択スイッチは、AVR出力が今のところ認識されないようなのでLM1881のVSync固定、あるいはGBS-Cに入力しないでも良いかと思いますが、現状こんな感じにしております。
回路図にはLM1881のRSETがボリュームで変更できるように書いていますが、これにより映りに変化は無かったのでこちらも現状こうなっていると言うだけで、データシート通りでも問題ないと思われます。
[ATmega328P用のプログラム]
(ヒューズビットはL=0xF7,H=0xD9にしました)
実際の使用画面
動画では違いが分かるように途中から有効にしていますが、最初から有効で使用して問題ありません。
またパンクショットのように、垂直同期期間中何もパルスが出ない基板はプログラムの処理の都合上、関係ない箇所の信号をLにしてしまい映らなくなるので、機能を無効にする必要があります。