「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



お月様まで花粉光環だったな。東京は、腐海に沈んだ。





以前から、やってみたいんだよなぁと思っていたことを
思い出す。マイコンでも、解像度落とせば、簡単な
ビデオキャプチャくらいできるんじゃね?という。

で、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

こうなる。明るい近未来。



コメント ( 0 )