目次>5章 第2ステップ(色々な実験)>(4)スイッチでLEDの点滅パターンを変更

スイッチでLEDの点滅パターンを変更

更新日2005.10.8

今まで使っていた実験回路にプッシュボタンスイッチを一つ追加します。
このスイッチのオン/オフで、LEDの点滅パターンを変えるプログラムを作成しましょう。

実験回路を作る
実験回路は以下のようになります。

RA0にプッシュボタンスイッチを追加しました。押すとOFFになるタイプです。
そして1MΩの抵抗でプルアップします。


今回新たに購入するパーツは、プッシュボタンスイッチと、1MΩの抵抗各一つです。
色々なスイッチがありますが、ピンがブレッドボードに合って、ボタンを押した時にOFFになるタイプであれば何でもOKです。
ボタンを押した時、ONになるタイプもこの回路でそのまま使用できますが、プログラムでのRA0入力判定を逆にする必要があります。


今回は一番左のタイプを使用しました。右の2つはピンが合わないので使用できません。

ブレッドボードに組んだ状態です。

スイッチを入力として使うには
今回追加したスイッチは、PORTAのRA0に接続しました。
従って、RA0を入力モードに設定し、RA0が0か1かを判断する事でスイッチの状態を知ることができます。

フローで表すと以下のようになります。

スイッチのON/OFF判定は、このように難しくありませんが、厄介な事にスイッチにはノイズ(チャタリング)があり、 これを取り除かないと正確にON/OFF判定をする事ができません。

スイッチのノイズ(チャタリング)を取り除く
スイッチのON/OFF時に発生するチャタリングとは、どのようなものでしょうか?

通常の機械式スイッチは、接点がくっつくとONになります。
ですが、スイッチをONにして接点がついても、跳ね返って一瞬OFFになります。
この跳ね返りを、短時間(1〜20mS)繰り返すため、ONにしても安定するまでON/OFFを繰り返します。これをチャタリングと言います。

スイッチをON/OFFした時の様子を表したものが下図です。

上の例では、1回のスイッチONで3回ON/OFFを繰り返しています。
チャタリングを考慮せずにプログラムを作成すると、スイッチを1回ONにしただけなのに、4回ONにした動作をしてしまいます。

このチャタリングを取り除くには、幾つかの方法がありますが、今回はプログラムでチャタリングキャンセルを行う事にします。

その考え方は下図の通りです。

ONを検出した場合、一定時間待って再度状態を確認します。一定時間後の状態もONであればスイッチがONになったと判断します。
OFFにした場合も同様です。

先ほどのスイッチON/OFF判断フローに、チャタリングキャンセルを組み込んだフローを示します。
待ち時間は20mSとしました。

プログラムの仕様
仕様は次の通りです。
(1)電源オン直後は緑色LEDのみ点灯させる
(2)スイッチを1回押すと赤と緑のLEDを交互に点滅させる
(3)スイッチをもう一度押すと赤のLEDのみ点灯させる
(4)スイッチを更に1回押すと(1)に戻る

フローは以下のようにしました。

プログラム作成のポイントは次の通りです。

前回SW状態
前回SW状態は、スイッチがOFFからONになった時だけONの処理をするために使用します。
スイッチを押したままで、ONの状態が継続しても何もしないためです。

表示モード
表示モードは、LEDの点滅パターン選択のために使用し、1〜3の範囲です。
 1:緑色LEDを点灯させる
 2:赤と緑のLEDを交互に点滅させる
 3:赤のLEDを点灯させる
スイッチがONになる毎に+1し、4になったら1に戻します。

20mS待つ
20mSの待ちは、(1)LEDを点滅させるで作成した、0.4mS待つサブルーチンを50回呼び出す事で実現します。

赤と緑のLEDを交互に点滅
フローをよく見ると分かりますが、この処理は20mS(チャタリングキャンセルの待ち)毎に実行されます。
と言う事は、25回で500mSになります。
従って、25回実行される毎にRB0とRB1をON/OFFさせれば、0.5秒毎に赤と緑のLEDを点滅させる事ができます。

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、LED5.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。