arduinoとLM1881を使って、ビデオオーバーレイ表示を
やってみようという実験の続き (↓これの続き)
http://brown.ap.teacup.com/nekosan0/249.html
ひとまず、74HC125(バッファIC)を通すことで
シンク/ソース電流に余裕を持たせてみたんですが、
やはり上手く行ってません。
arduinoの代わりにTINY2313でやってみると、やはり
上手く動くところをみると、74HC125バッファ自体は
きちんと動作している様子なのですが…
なんか悔しいので、不具合の原因の切り分けをもう少し
キッチリやってみようと思いました。
事前の実験によってソフト側の不具合ではないことは
判ったつもりだったのですが、74HC125を通しても
やはり上手く割り込みがかからないところをみると、
本当にソフト側のバグは無いのか?と気になってしまって…
で、スケッチを以下のようにちょっと修正し、
ラインカウントをシリアルでPC宛に送信するという
処理を挟み込み、ブレッドボードで実験をして
みました。
(スケッチ中の不等号と&記号は全角に変換してあります)
// arduino video overlay sketch
// with interrupt 0 (v sync)
// and interrupt 1 (c sync)
// output video signal on digital pin 4
#define video_out 4
volatile int line_no;
volatile char bitmap[12] = {0b00011000,0b01111000,
0b00100100,0b01000100,
0b00100100,0b01111000,
0b00111100,0b01000100,
0b01000010,0b01000010,
0b01000010,0b01111100};
void v_sync()
{
line_no = 0;
}
void c_sync()
{
int disp_line;
int char_location;
char bitmap1;
char bitmap2;
int i;
int n;
boolean bit_out[] = {LOW,HIGH};
line_no ++;
if((line_no >= 40) && (line_no <= 87)){
disp_line = (line_no - 40) / 8; //line no now display
char_location = disp_line;
bitmap1 = bitmap[char_location * 2]; //left bitmap for display
bitmap2 = bitmap[char_location * 2 + 1]; //right bitmap for display
n = 0;
for (i=7;i>-1;i--){
n = (bitmap1 >> i) && 1; //pick up 1bit for display
digitalWrite(video_out,bit_out[n]); //display a bit
}
digitalWrite(video_out, LOW); //display black
n = 0;
for (i=7;i>-1;i--){
n = (bitmap2 >> i) && 1; //pick up 1bit for display
digitalWrite(video_out,bit_out[n]); //display a bit
}
}
digitalWrite(video_out,LOW);
}
void setup()
{
Serial.begin(9600);
pinMode(video_out, OUTPUT); // set digital pin4 for output video signal
digitalWrite(video_out, LOW);
line_no = 0;
attachInterrupt(0, v_sync, RISING);
attachInterrupt(1, c_sync, RISING);
}
void loop()
{
Serial.println(line_no);
}
int0が立ち上がる時にv_sync関数が呼び出されて
ラインカウントが0クリアされます。
int1が立ち上がる時にc_sync関数が呼び出されて
ラインカウントがインクリメントされます。
で、int0、int1ともに抵抗を介してVccに繋いでおき
(常時HIGHレベル入力)、適宜int0端子、int1端子を
手でGNDとショートさせます(LOWレベル入力)。
ショートさせてから離した瞬間が立ち上がり波形
の入力となり、割り込みが発生するはずです。
で、これで散々弄ってみたんですが、思ったとおりに
ラインカウントがアップしたり0クリアしたりと
想定どおりの動作をしてくれます。
ところが、このスケッチでLM1881を繋いでみると、
やはり上手く動きません。ラインカウントはずーーっと
0のままです。
そしてTINY2313に繋ぎ換えるとちゃんと動きます。
うーん、ソフトではない。回路設計ではない、
部品の故障でもない。とすると、やっぱりデジタル3ピン
に繋がったLED用電流制限抵抗(470Ω)による
電圧上昇と、それによる弁別閾電圧との相性としか
思えないんだけどなぁ…
74HC125を通しても上手く動かないということを考慮
すると、470Ωの抵抗ではどんなICをつないでも
LOWレベルを入力させられないのでは?と
思えてしまいます… (TへT)
ひとまず、スケッチをこのままMEGA8用にコンパイル
してみたらエラー無く通ったので、この間作った
シリアル版MEGA8のarduinoで一旦実験してみたい
と思います。
MEGA8でもMEGA168でも、CPUコア自体は殆ど変わりが
無いので、MEGA8のシリアル版で動くなら、reduino-nano
のボードの仕様(限界)ということになるのでしょうか。
場合によっては、470Ωの抵抗を1kΩ程度に換えちゃう
っていう手も有るかな…
(LEDは薄暗くなっちゃうけど…)



|