[トップページへ戻る]

7セグのセグメントが薄っすら光ってしまう件

2013年2月
7セグのダイナミックドライブで、消えているはずのセグメントがうっすら光ってしまう、と悩んでいませんか。それは回路が悪いのではありません。プログラムが間違っています。


何が起きているのか
7セグのダイナミックドライブの解説は↓こちらのページを参考にしてください。
今から始めるAVR #2 ATtiny2313 7セグ4桁ボード〜そこ(7セグ)んとこ、詳しく

ダイナミックドライブの仕組みが分かって、いざ自分でプログラムを組んで点灯させたら、隣の桁の数字がうっすら重なって見えている…? ダイナミックドライブが残像を利用した技術だと言っても、隣の桁に数字が残るという意味ではありません。もちろん部品や回路のせいでもありません。プログラムが間違っているのです。

参考回路図
AVR ATtiny2313に2桁組みの7セグを接続した回路です。7セグはダイナミックドライブ用の配線がされているものとします。また、7セグはカソードコモンとし、マイコンからはセグメントA〜G,DPおよびコモン(桁dig.1, dig.2)にHiを出力して点灯制御するものとします。
ATtiny2313のPORTBでセグメントA〜G,DPを、PORTDでコモン(桁)を、それぞれ制御します。
回路図ではDP(小数点)をPと記しています。

port\bit 7 6 5 4 3 2 1 0
PORTB P G F E D C B A
PORTD - - - - - - dig.2 dig.1

この回路の下で、7セグに「12」という値を表示します。今、プログラムは1桁目に字形「1」を出力し、2桁目に移動して字形「2」を出力するタイミングだったとします。7セグに文字が出力される様子を一瞬ごとに考えてみましょう。

間違ったプログラムの例1
PORTB = 0b00000110; //字形'1'
PORTD = 0b00000001; //1桁目点灯
PORTB = 0b01011011; //字形'2'
PORTD = 0b00000010; //2桁目点灯
1-2行目:セグメントに字形「1」を出力し、1桁目を点灯させます。
3行目:字形「2」を出力します。このとき桁はまだ1桁目です。
4行目:2桁目を点灯させます。

間違ったプログラムの例2
PORTD = 0b00000001; //1桁目点灯
PORTB = 0b00000110; //字形'1'
PORTD = 0b00000010; //2桁目点灯
PORTB = 0b01011011; //字形'2'
1-2行目:1桁目を点灯させ、セグメントに字形「1」を出力します。
3行目:2桁目を点灯させます。このとき字形はまだ「1」です。
4行目:字形「2」を出力します。

どちらの例も、プログラムが3行目から4行目を実行する一瞬の間、意図しない字形が7セグに出力されることになります。プログラムを1MHzないし8MHzという結構な速さで実行していても、この一瞬の点灯は見えてしまいます。

正しいプログラムの例
PORTB = 0b00000110; //字形'1'
PORTD = 0b00000001; //1桁目点灯
PORTB = 0b00000000; //字形消去
PORTD = 0b00000000; //桁を消灯
PORTB = 0b01011011; //字形'2'
PORTD = 0b00000010; //2桁目点灯
PORTB = 0b00000000; //字形消去
PORTD = 0b00000000; //桁を消灯
1-2行目:セグメントに字形「1」を出力し、1桁目を点灯させます。
3-4行目:字形と桁、ともに出力を停止します(表示を消去)。
5-6行目:セグメントに字形「2」を出力し、2桁目を点灯させます。
7-8行目:字形と桁、ともに出力を停止します(表示を消去)。

※ソース内のコメントで「消去」「消灯」と2つの言葉を使っていますが、
I/OピンからLoを出力することを指しているだけであり、言葉の違いには
特に意味はありません。なんとなく使い分けただけです。


間違ったプログラムの原因は、字形と桁の内容が一致しない瞬間ができてしまうことにありました。マイコンはPORTBとPORTDを同時に変化させることはできません。従って、どちらを先に変更するにしろ、その瞬間(字形と桁を切り替える瞬間)に文字が表示されないようにすれば問題は解決します。
上記プログラムは3-4行目,7-8行目でPORTB,PORTD両方の出力を停止していますが、PORTB,PORTDのどちらか一方だけでも構いません。※例では前後の行との対比からPORTB,PORTD両方を操作しています。
ちなみに3桁以上の7セグの場合、9行目以降に1-4行目と同様の処理が続きます。


◆ ◆ ◆
最初にダイナミックドライブのプログラムを組んだ頃、実は自分がこの件で悩みました。
消えているはずのセグメントが薄く点灯している。まず回路を疑いました。でもミスなし。
ちゃんと消えているセグメントもあります。よく見ると薄い点灯が数字の形をしていること、
隣の桁に表示している数字であることに気付きました。
ここまで分かれば次はプログラムのダイナミックドライブ制御の部分を追いかけます。
そして解決。…という経験でした。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system