ページ 1 / 1
LEDマトリックスについて
Posted: 2012年6月08日(金) 23:55
by Fimbul
マイコン : ATmega168
統合開発環境 : AVR Studio 4
LEDマトリックス : TOM-1588 BH-B
例えば、マイコンでLEDマトリックスを何かの形に光らせる場合、1フレーム中に1行ずつ光らせて行くのでしょうか。
複数行のLEDを光らせようとすると、LEDマトリックス内の導線が共通な為に思い通りに光らせる事が出来ませんでした。
図にしますと、
1フレーム中に例えば、
●●● まずここを光らせ
●●● 次にここを光らせ
●●● 最後にここを光らせる
この様な感じでよろしいのでしょうか。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 00:29
by softya(ソフト屋)
マトリクスLEDは、走査することで全体を光らせますが瞬間で光っているのは一列だけです。
なので、
Fimbul さんが書きました:
●●● まずここを光らせ
●●● 次にここを光らせ
●●● 最後にここを光らせる
と言う感じになりますね。
ただ、1フレームと言う概念がマトリクスLEDには無いので点灯周期とか単に一周とか呼びますがこれをかなり高速に行う必要がります。
大体1周で1/50~1/60秒にすれば目と脳がダマされて全体が光っているように見えるようになります。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 00:53
by Fimbul
softya(ソフト屋) さんが書きました:大体1周で1/50~1/60秒にすれば目と脳がダマされて全体が光っているように見えるようになります。
シューティングゲーム等のFPSと同じですね。
マイコンでプログラムのFPSを制御する時は、処理にかかった時間をどうやって図ればよいのでしょうか。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 06:24
by beatle
タイマー割り込みが来るたびに次の列に遷移するというやり方でいいと思います。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:02
by Fimbul
処理時間を計算してFPS調節←←←←←←←←←
メイン処理 ↑
最初の行を光らせる ↑
・ ↑
・ ↑
・ ↑
最後の行を光らせる→→→→→→→→→→→
この様な感じだと思ったのですが。
タイマー割り込みを利用すると言うのは、カウンタの値を自分で決めた値と比較して、一致した時に割り込みを発生させると言う事なのでしょうか。
単にカウンタの値を直接読んで、処理できないのでしょうか。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:10
by softya(ソフト屋)
Fimbul さんが書きました:処理時間を計算してFPS調節←←←←←←←←←
メイン処理 ↑
最初の行を光らせる ↑
・ ↑
・ ↑
・ ↑
最後の行を光らせる→→→→→→→→→→→
この様な感じだと思ったのですが。
その処理方式だと最初の行~最後の行の表示が最高速で行われてしまいます。
例えば1/50秒で1周して8行あるとすると各行は1/(50*8)秒ごとに切り替えないといけません。
この処理をメインループで行うとメイン処理自体が阻害されます。
Fimbul さんが書きました:
タイマー割り込みを利用すると言うのは、カウンタの値を自分で決めた値と比較して、一致した時に割り込みを発生させると言う事なのでしょうか。
単にカウンタの値を直接読んで、処理できないのでしょうか。
タイマー割り込みはマイコン内蔵のハードウェアの機能で周期を設定すると自動的に一定周期で割り込みが発生します。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:26
by Fimbul
図を書き直します。
処理時間を計算してFPS調節←←←←←←←←←←
↓ ↑
メイン処理 ↑
↓ ↑
最初の行を光らせる ↑
↓ ↑
次の行を光らせる ↑
↓ ↑
さらに次の行を光らせていく ↑
↓ ↑
最後の行を光らせる→→→→→→→→→→→
softya(ソフト屋) さんが書きました:
その処理方式だと最初の行~最後の行の表示が最高速で行われてしまいます。
例えば1/50秒で1周して8行あるとすると各行は1/(50*8)秒ごとに切り替えないといけません。
この処理をメインループで行うとメイン処理自体が阻害されます。
何か私が勘違いをしているかもしれません。
LEDマトリックスを光らせて行く処理は、何故最高速で行ってはいけないのでしょうか。
LEDマトリックスを光らせて行く処理と、最後の行を光らせてから最初の行に戻るまでの処理に時間がかかると点滅してしまうと思うのですが。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:34
by softya(ソフト屋)
CPUの処理で最高速で処理をするとCPUのクロックによりますが、0.01msとかで処理が終わります。
なので、
コード:
最初の行を光らせる ↑
↓ ↑
次の行を光らせる ↑
↓ ↑
さらに次の行を光らせていく ↑
↓ ↑
最後の行を光らせる→→→→→→→→→→→
が8行だと想定して0.08msで終了してしまうわけです。
周期か1/50sec=25msだとすると残りの24.92msは最後の行だけが光っていることになります。
たぶん、最後の行しか点灯していないように見えるでしょう。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:42
by Fimbul
softya(ソフト屋) さんが書きました:周期か1/50sec=25msだとすると残りの24.92msは最後の行だけが光っていることになります。
たぶん、最後の行しか点灯していないように見えるでしょう。
この周期と言うのはLEDマトリックスの最初の行から最後の行までを光らせている時間ですよね?
LEDマトリックスの点灯時間が短いと人間の目には見えないので、最初の行から最後の行まで点滅して見えない程度にLEDを光らせて、次の行への切り替えは高速に行うと言う事でしょうか。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 10:48
by softya(ソフト屋)
Fimbul さんが書きました:softya(ソフト屋) さんが書きました:周期か1/50sec=25msだとすると残りの24.92msは最後の行だけが光っていることになります。
たぶん、最後の行しか点灯していないように見えるでしょう。
この周期と言うのはLEDマトリックスの最初の行から最後の行までを光らせている時間ですよね?
LEDマトリックスの点灯時間が短いと人間の目には見えないので、最初の行から最後の行まで点滅して見えない程度にLEDを光らせて、次の行への切り替えは高速に行うと言う事でしょうか。
とりあえず面倒なのでマトリクスの行数が割り切れる5行だと想定して書くと
1行目を光らせる。5ms
2行目を光らせる。5ms
3行目を光らせる。5ms
4行目を光らせる。5ms
5行目を光らせる。5ms
の合計で25msで1周と言うことです。それぞれの行が光っている時間は同じ時間の間隔でないといけません。
>次の行への切り替えは高速に行うと言う事でしょうか。
なんてのは、IOレジスタを2つぐらい書き換えるだけなので高速です。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 11:08
by Fimbul
softya(ソフト屋) さんが書きました:
とりあえず面倒なのでマトリクスの行数が割り切れる5行だと想定して書くと
1行目を光らせる。5ms
2行目を光らせる。5ms
3行目を光らせる。5ms
4行目を光らせる。5ms
5行目を光らせる。5ms
の合計で25msで1周と言うことです。それぞれの行が光っている時間は同じ時間の間隔でないといけません。
ようやく理解しました。
切り替えの処理は速いので時間は無視し、周期を1/50 ~ 1/60にすれば全体が光って見える、と言う事ですね。
そうなると、最初のFPS調節は必要無いみたいなので、図を書き直します。
メイン処理←←←←←←←←←←←←←←←←←←←←←←←
↓ ↑
最初の行を光らせる( 1/(50 * 8) ~ 1/(60 * 8) ) ↑
↓(割り込みで遷移) ↑
↓ ↑
次の行を光らせる( 1/(50 * 8) ~ 1/(60 * 8) ) ↑
↓(割り込みで遷移) ↑
↓ ↑
さらに次の行を光らせていく( 1/(50 * 8) ~ 1/(60 * 8) ) ↑
↓(割り込みで遷移) ↑
↓ ↑
最後の行を光らせる→→→→→→→→→→→→→→→→→
最後の行を光らせてから、最初の行を光らせるまでの処理(メイン処理)に時間がかかると、LEDが点滅してしまいますか?
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 11:17
by softya(ソフト屋)
タイマカウンターを使うだけならメイン処理に時間が掛かると点滅周期が乱れます。
タイマカウンターの割り込み側でLEDマトリクスを独立処理すればメインで時間がかかろうとLEDマトリクスは点滅の乱れもなしに整然と処理できます。
なので、まず割り込みは何なのかを勉強して下さい。
「ハードウェアの仕組みとソフトウェア処理 ―― マイコンの動作を理解する|Tech Village (テックビレッジ) / CQ出版株式会社」
http://www.kumikomi.net/archives/2009/1 ... php?page=5
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 12:28
by Fimbul
softya(ソフト屋) さんが書きました:
タイマカウンターの割り込み側でLEDマトリクスを独立処理すればメインで時間がかかろうとLEDマトリクスは点滅の乱れもなしに整然と処理できます。
通常の処理はメイン処理だけにして、メイン処理を行っている間に、タイマー割り込みで強制的にLEDを光らせる訳ですね。
所で、割り込みサービス・ルーチンの処理中に、通常の関数(ライブラリの関数や自作関数)を呼び出せるのでしょうか。
また、先程のサイトに
「また,マイコンの持つタイマ機能を,割り込みと組み合わせて利用することができます.ほとんどのマイコンには,I/O機能の一つとしてパルス数を数えるカウンタ回路が装備されています.このカウンタ回路にクロックを入力して,一定値に達するまでクロック数をカウントすれば,所定の時間幅を作り出すタイマとして利用できます.」
とありました。
カウンタはTCNT1を使うとして、クロックの入力はどの様にすればよいのでしょうか。
Re: LEDマトリックスについて
Posted: 2012年6月09日(土) 12:57
by softya(ソフト屋)
Fimbul さんが書きました:softya(ソフト屋) さんが書きました:
タイマカウンターの割り込み側でLEDマトリクスを独立処理すればメインで時間がかかろうとLEDマトリクスは点滅の乱れもなしに整然と処理できます。
通常の処理はメイン処理だけにして、メイン処理を行っている間に、タイマー割り込みで強制的にLEDを光らせる訳ですね。
所で、割り込みサービス・ルーチンの処理中に、通常の関数(ライブラリの関数や自作関数)を呼び出せるのでしょうか。
呼び出せますが、パソコンのスレッドセーフと同じ問題は生じます。
メインと割り込みの両方から同じ変数を変更する場合は細心の注意が必要です。
Fimbul さんが書きました:
また、先程のサイトに
「また,マイコンの持つタイマ機能を,割り込みと組み合わせて利用することができます.ほとんどのマイコンには,I/O機能の一つとしてパルス数を数えるカウンタ回路が装備されています.このカウンタ回路にクロックを入力して,一定値に達するまでクロック数をカウントすれば,所定の時間幅を作り出すタイマとして利用できます.」
とありました。
カウンタはTCNT1を使うとして、クロックの入力はどの様にすればよいのでしょうか。
クロックはCPUのクロックが利用できます。
マイコンの入門書を買うべきだと思いますが買えないのなら前に御教えしたハードウェアマニュアルを読めるようになりましょう。
「Amazon.co.jp: AVRマイコン・プログラミング入門─ATmega48/88/168の主要な機能を豊富な図解と実例でわかりやすく解説 マイコン活用シリーズ: 廣田 修一: 本」
この本が評判が悪いんで微妙ですが。あとCじゃないみたいだし。
ここで説明するのは大変ですし私も全部調べている時間がないので出来るだけ自分で試してみてください。
AVR STUDIOにはシミュレータもあるので色々と実験できると思います。
TCNT2の例ですが。
「タイマーを使う - びんずめ堂」
http://www.binzume.net/library/robo/avr08.html
Re: LEDマトリックスについて
Posted: 2012年7月01日(日) 20:49
by Fimbul
返信が遅れました。
無事にLEDを光らせる事が出来ました。
タイマー割り込みを使うには、マスクレジスタとsei関数で割り込みを許可する必要があるようです。
softyaさんから紹介されたサイトや参考にしたサイトをまとめておきます。
「ハードウェアの仕組みとソフトウェア処理 ―― マイコンの動作を理解する|Tech Village (テックビレッジ) / CQ出版株式会社」
http://www.kumikomi.net/archives/2009/1 ... php?page=5
「タイマーを使う - びんずめ堂」
http://www.binzume.net/library/robo/avr08.html
「AVRでタイマー割り込み」
http://blog.goo.ne.jp/sim00/e/1ab8d1564 ... c059042c30