PICAXEでパワーLEDをPWM調光 3:プログラムの検討

    PICAXE
    11 /21 2014
    プログラムの概要を検討した。
    まだ、動かしていないので最終的には変わる可能性があります。
    基本的な考え方です。

    マルチタスクにする。
     0.4~1秒の時間が掛かるフラッシュ(点滅)とEEPROMへ書き込みは別タスクにする。
    追記
    マルチタスクにするとCPUクロックは16MHz固定になる。
     これに伴いPWMの設定も変わる。
     PWM 250Hz 100%の命令は pwmout pwmdiv64, C.2, 249, 1000
    追記終わり

    ・タスク0
    メインルーチン。
    キー・スキャン(チャタリングとノイズのキャンセルも含む)、明るさ値(2~15の変数)の管理、明るさ値2~13の時のPWM dutyの設定を行う。

    ・タスク1
    明るさ値14、15の時のPWM dutyの設定と400~500ms周期のフラッシュ(点滅)動作。
    簡単そうだが実は厄介。 例えば 
     明るさ変数14か15の確認 点灯 200ms待ち 消灯 300ms (要はLチカ)を繰り返すと約500ms周期でしか明るさ値の確認ができない。 その結果、
     スイッチを押してから反応するまで最大0.5秒かかる
     メインルーチンの明るさ値と不整合も起きる。
     連続してスイッチを押すとすっぽ抜ける恐れがある(最終的には問題ない。)

    対策は待ちの時間中に明るさ変数を再度確認し、
     変わっていなかったら待ちを続行させる
     変わっていたらプログラムの先頭に戻る
    ようにする。
    待ちの部分を例えば
     50ms待ち  変数確認  50ms待ち  変数確認 ・・・・
    細かく分割するということ。
    実際には 50ms待ち 変数確認 はサブルーチンにしてプログラム容量減らす。
    サブルーチンのコール、リターンは時間が掛るようなので速度的には不利だが50ms待ちを少なめにして調整すればよい。
    但し、タスク0はタスク1が読み取れる時間分(例では50ms)以上明るさ値(変数)を保たなくてならない。
    1秒間に5回までのSWの連打を許すとすると200msなので、この位の周期でキー・スキャンさせれば問題はない。
     1秒間にSWを最大3回押されたとしても333ms周期なので現実的には問題ない。

    ・タスク2
    明るさ値をチェックしており変化があった時にEEPROMに記憶する。
    スイッチが押される度に記憶するとEEPROMの寿命を縮めるので連打された場合は押され終わってから書き込むようにする。
    といっても、終わったことを知ることは不可能なので、明るさ値が変化しないのが1秒続いたら書き込むことにする。
     ただ、これは本質的には明るさを変化させてから電源スイッチを
     切るまでの間に記憶できればよいということである。
    明るさ値が変わったら、1秒待ち、明るさ値がそのままなら、EEPROMに記憶する。
    このタスクは他のタスク、明るさに影響しないのでタスク1のように「待ち」を細かく刻んで変数を確認する必要はない。

    続 く
    関連記事

    コメント

    非公開コメント

    Friendship 7

    浅く広くのハード屋です。
    コメントへの返信には過大な期待をしないで下さい。 非公開コメントは停止しております。 不適切なコメントはFC2で自動的にはじかれます。
    リンクフリーですが盗作は禁止です。
    本ブログの内容を参考にされる場合はあくまで自己責任でお願い致します。