11/25の記事を書いてからもほぼ毎日プログラムをいじっています。
一度に作るとデバッグが大変そうなので、徐々に機能を追加して動作確認しながら進めています。
11/25時点の機能
受信信号に合わせて黄色LEDが点滅し、正常な信号なら緑が光り異常なら赤が光る
それから追加した機能(追加順に記載)
◆正常時に緑が点灯するのを廃止(赤と交互に点灯するだけなので赤だけでも問題ない)。
◆黄色の点滅に合わせてブザー音が出るようにした(旧チェッカーと同様)。
◆信号の変化がある時だけ良否判定していたのを、無信号時やノイズ等で連続信号となった時も異常と判断するようにした。
◆電源スイッチ、東日本・西日本切替スイッチをタクトスイッチで装備。それに合わせて東日本は緑色、西日本は黄色で点滅するよう変更。
最も苦戦したのがスイッチの追加です。トグルやスライドスイッチでやれば切替自体をスイッチに任せてソフトは何もしなくて良いのですが、今後のために意地でもタクトスイッチで実現したかったのです。しかも先人のお手本を一切見ないで自力でやろうと・・・
電源制御は、電池をつないだらいきなりsleepで、電源スイッチが押された時にWakeUpするようにし、再度押されたらsleepに入ります。
東日本・西日本の切替は、スイッチが押されるたびに状態保存用のレジスタをXORで反転しています。そのレジスタの内容を元に表示LEDと電波時計モジュールの端子を切替えています。
これを実現するためにあれこれ考えた末、割り込みは使わず状態変化フラグだけ使い、普段のルーチン内でフラグをチェックして処理するようにしました。良否判定で割り込み処理を使ってるので、それを邪魔しないようにしたつもりです。当初うまくレジスタが反転せず、東日本と西日本の両方のLEDが同時点灯してしまい非常に悩みましたが、フラグをクリアしていないというポカミスでした(常に交互に反転して同時点灯に見えていました)。
ミス修正後は動くようになりましたが、チャタリングの影響を受けてうまく切替らないことがあります。対策として0.5秒何もしないWAITルーチンを入れて解消はしましたが、その間に他の処理ができず、表示のリズムが狂います。チェッカーとしての機能は果たしていますが精神的に嬉しくありません。
ならば、他の処理を待たせないために8bitタイマーで0.5秒をカウントして、その間のスイッチ入力を受け付けないようにすればいいのではないかと・・・
そうすると判断箇所が増えて頭の中だけで考えてると知恵熱が出そうになり、しかたなくフローチャートを書きつつ動作を整理しながら進めました。
いくら考えても私の力ではこれ以上簡単にするのは無理でした。本当はもっといいチャタリング回避法があるのでしょうが、これを元にプログラムするとうまくいったので良しとします。
書くのが面倒なので、今までフローチャートは頭の中だけに書いてましたが、今回のプログラムは限界を超えてしまいました。今までで一番長いプログラムです。
プログラムに慣れていないおっさんの作業なので、何をやるにしても時間がかかります。
もっとスマートに書きたいですが結果オーライということで・・・
お手間でなければ応援クリックいただくと嬉しいです
にほんブログ村