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