goo blog サービス終了のお知らせ 
「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



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は薄暗くなっちゃうけど…)




コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« LM1881の出力電圧 arduinoのビデ... »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。