FC2ブログ
2018-06-15 18:28 | カテゴリ:PIC応用回路

スロー点滅をやるぞー!
と、ぶち上げてしまい、ちょっと怖気づいています。

まずは、SWで処理する為の論理を考えていきます。
可能であれば、以下のような処理フローで実現できると思います。

1)TRR0の割り込み設定で、例えば100usec毎に割り込みをかけ、

2)その割り込み処理ルーチン内で、各LEDの点灯・消灯のDutyや点滅のカウントを取り、

3)それに応じて対応するLEDをON・OFFすれば行けるはずです。

続きは、、、、


処理の概要がなんとなく見えてきましたので、それをタイムチャートとして整理してみるところから始めました。

(LEDM01)
LEDM01.jpg

大きな流れは決まったのですが、まずはLEDをソフトでPWMを変化させるために、どの様なカウンターやフラグがいるか考えてみると、これが結構多いことに気づきました。
Dutyサイクルの最大カウント(分解能)、現時点でどの程度のDutyで点灯させているか、Dutyを変化させる際の変化速度を記憶させる変数、対象となるLEDを指定する変数、点滅の方法(一定、ランダム、順次点滅など)、、、
結構な変数になります。
まずは、それらの変数を順次定義して、そこからフローチャートに組んでいきました。
これがなかなかどうして、一筋縄ではいきません。

まずは、フローチャートを色々書いては消し、書いては消し、で作成していきました。
(LEDM02)
LEDM02.jpg

(LEDM03)
LEDM03.jpg

(LEDM04)
LEDM04.jpg

そうして、とりあえず3個のLEDをソフトPWMで点滅するプログラムを製作し、テストしました。

(Video)




mainプログラム中で、LOOPをかけての処理では、うまく動作しているように見えます。
最初の点滅部分は、通常のON/OFFでの表示です。
その後はスロー点滅です。

LEDの輝度変化にデジカメの絞りが反応して、ちょっとわかりにくいですが、明るいLEDだとはっきりスロー点滅が確認できました。
後半は、LEDバーの場合ですが、仕込んだ抵抗値が大きくて明るさが不足ぎみですが、これも一応スローがわかります。


しかし、この処理をタイマー割り込みで処理する様に、TMR0割り込みに組み込むと正常に動作しません。
TMR0ルーチンの初期化などは、いつもの様に「MCC」で半自動作成していますので、問題はない様に思うのですが、動作しないのでは使いようがありませんので、今回はTMR0割り込みを使用する事を断念し、すべてmainプログラムの中で、大きなLoopを作成して処理する方法としました。

ソフトの動作そのものは、スロー点滅の良い感じが表現できていると思うのですが、、、

なかなか思うようにはいきません。
原因を検討してみますが、、、

関連記事

管理者のみに表示する