お月様まで花粉光環だったな。東京は、腐海に沈んだ。
以前から、やってみたいんだよなぁと思っていたことを
思い出す。マイコンでも、解像度落とせば、簡単な
ビデオキャプチャくらいできるんじゃね?という。
で、LM1881をちょっと探しなおす。
http://www.aitendo.com/product/1767
1個150円だな。Aliexだともっと安いんだけど、そんなに
たくさんは要らない。買い置きあったはずだけど、どこに
行ったかよくわからん。いっぱい探さないとみつからな
さそうだな。1個買っておくかな。
でそれとあわせて、最近弄ってなかったビデオ信号周り。
Arduino使ってやっちゃいたいんだよな、と。
あらためて、ArduinoのTimerOneライブラリ使って、ビデオ
出力できないかな?と。
以前、Arduinoの割り込み処理使ってゴニョゴニョした
時に、タイマ割り込み周りって、割り込み発生時のpush/pop
ですごいクロック食っちゃって、なかなかいい感じには
ならなかったと記憶してるんだよな。
で、あらためて、簡単なプログラム書いて、なんとか
ならないかなぁ?と。ちょっとぐらいタイミングずれてても
あまり気にせず、ビデオ信号っぽい信号出すことを直近の
目標に。
http://picavr.uunyan.com/making_p_ntsc.html
これと同じような処理を、Arduinoでやってみて、もろもろ
割り込み処理周りの課題を改めて洗い出したりする目論見。
TimerOneライブラリで、64us周期でタイマ割り込みを発生
させておいて、かつ、タイマ1のpwm出力もオンにして、
タイマ割り込み要因発生から、シンクロとかビデオ信号
とかの信号が実際に出力されるまでのタイミングを、
ロジアナ使って眺めてみようかなと。
Arduinoなので、シミュレータで1クロック単位で眺める
ってことが難しいので、ロジアナで直接計る方向。
インラインアセンブリもそこそこ使って、オーバーヘッド
をぎりぎりまで詰めていく。
ざっくり、プログラムを書いてみる。digitalWriteは遅い
ので、ポートを直接叩いて信号を吐き出す。まぁ、
ポート周りの操作はいいんだけど、問題は大きくは2つ。
・タイマ割り込みのpush/popのオーバーヘッド
・delayMicroseconds関数の精度
アセンブラでもC言語でも、シミュレータ掛けながら
1クロック単位で眺めながら合わせていけば、タイミング
はきっちり合うし、タイマ割り込み時のpush/popも
必要なレジスタだけに限定すれば、速度も速いはず
なんだけど、あれこれ小回りが利かないんだよな。
なんとなくそれっぽく動くスケッチが書けたので、
ロジアナで波形を眺めていく。
…なんか、微妙にタイミングが合わない。delayMicroseconds
って、やっぱ1us単位でちゃんと合うって感じじゃないなぁ。
ロジアナでタイミング調整しながら、だいたい合いそうな
数値に引数を調整していく。
なんとなくコツがわかったので、それなりの数値が得られた
んだけど、等価パルスのタイミングはともかく、垂直syncの
3ライン分が、どうしても変なタイミングで出てきちゃう。
あれこれ手を尽くしても、うまくいかない。
なんでかなぁ?と思ったら、どうやら、push/popの時間が
長すぎて、1ラインの信号を出力するのが間に合ってない
みたい。
タイマ割り込み要因の発生から、実際に信号を出力する
までに40クロックほどかかってるみたい。(約5us)
elfファイルから逆アセンブルリストを出してみると、
push命令とか、呼び出す関数の先頭アドレスを取る処理
とかで、ちょうどそのくらい掛かってる。
割り込み処理内では、そんなにたくさんのレジスタ使って
ないから、そんな全部pushしておく必要ないのにな…
そのせいで、V-sync1ラインの終了付近で信号変化させて
いるところがうまくタイミング取れなくて、次のライン
の処理まではみ出して、妙な状態になっちゃってる。
こいつを直すには、
http://d.hatena.ne.jp/pcm1723/20151202/1449061241
「ISR(TIMER1_OVF_vect, ISR_NAKED)」
みたいにして、素の割り込みルーチンになるようにする
必要があるんだけど、オリジナルのTimerOneライブラリ
だとそういう切り替えは出来ないので、改造するか、
まったくオリジナルのタイマ1割り込みライブラリを
用意するかだな。
まぁ、どう見ても既存ライブラリを改造するほうが楽
だろうな。
それにしても、インラインアセンブリだと、ちょっと
マクロ定義使ったりとか、相対ジャンプ使うとか、
ループ処理するとか、っていうときに、普通にAVRの
統合開発環境使うときと、勝手が違って不便なんだ
よな。
簡単な処理ならともかく、nopをループしてタイミング
調整するとか、簡単にいかないんだよな。
これがそこそこ動いたら、今度は逆に、LM1881から
シンクロ信号を入力して、ピンチェンジ割り込みで
タイミング計って、SRAMに信号を読み取るという
感じにして、ビデオキャプチャ処理して、それを
シリアルで吐き出す、みたいな感じにしたいところ。
横80ドット×縦50ドットとすると、1ドット1ビットで
500バイト、2ビットで1000バイトというところ。
MEGA328なら入るはず。
まぁ、UARTで吐き出している間はキャプチャも出来
ないので、その分フレームレートは少なくなるけど、
出来るか出来ないかの境目を越えたいところ。
あと気になってるのは、入力に使うビデオ信号。
普通はカラー使うだろうから、それを一旦白黒にする
必要がある。
安くて速くてユニティーで安定なオペアンプ使って、
高次フィルタで2MHz以下に絞りたい。
http://sim.okawa-denshi.jp/MultipleFB3Lowkeisan.htm
いつもの OKAWA Electric Designのページを使わせて
いただいて、チェビシェフ特性で少し急峻なフィルタ
に設定してみる。3MHzで20dB減衰するくらい。
なんとなくめどが立ったような…でも、もっといい
フィルタないかなぁ?
https://twitter.com/nawokikarasawa/status/968816302566424577
Jojoだ!
https://twitter.com/pc_watch/status/969014623734124544
PCIe/NVMe SDカード?
https://twitter.com/BEEP_akihabara/status/969046957221208065
おーーーー。PC CLUBじゃん!
https://twitter.com/nob111222333/status/968251119292923904
これ、鳴り物入りの例の法案通してもらえなかった
っていうことなんだから、このサイコパスおじさん、
引き摺り下ろせ!!って内紛始まったりしないのかな?
https://twitter.com/dLTVcQ0f9ghW3GA/status/968778242516697088
こんな副校長がいる学校で学ばされる小学生は
かわいそうだな。
「一生懸命がんばって仕事する=残業」
って思ってるもんな。スタートから間違えだろ。
https://twitter.com/Sim0000/status/969051693231910912
https://twitter.com/JQ1BWT/status/969054885076324353
こうなる。明るい近未来。
|
|
|
|
|
|