Pi:Co Classic3 製作記(移行中)

マイクロマウス研修 Part8(岩本)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
岩本ブログ一覧
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんにちは岩本です。
今回はサンプルプログラムSTEP3の中身を確認していきたいと思います。

まずは、メインプログラムの確認からです。
STEP3_Switchのメインプログラムは下図のような感じです。
33~36行目は、状態を表すための変数の宣言及び代入。
38行目でPart6でも行った各機能の初期化。
41行目while(1)で42~82行目までを無限ループさせています。
43行目のwhileで44行目から56行目をループさせています。()の中身はループを抜け出す条件です。
()内の”&”は、ビット演算子の一つでビットANDと言い、ビットで計算させる方法です。例えば、0&0の答えは0、0&1は0、1&1の時のみ1となります。
プログラムだけ見ていると少しわかりにくいのですが、SWの値はスイッチを押していないときは1(3.3V)、押しているときは0(0V)が出力されます。(教科書14P・20P参考
このような抵抗の使い方をプルアップ抵抗といいます。
そのため、スイッチを押していないときはWhileの中は1(true)となり、無限ループが発生します。しかも、実行文が無いため、何もしなければ43行目から抜け出せません。
逆にスイッチを押した場合は0(false)となり43行目から抜け出すことが出来ます。
ループから抜け出せたら、どれかのSWが押されたことになりますので、45行目・58行目・71行目の対応するif文が読み込まれます。
例えば、45行目のif文でSW_Rが押された場合の動きとしては、47行目でstate_rに1を足しています。”++”はインクリメント演算子と呼ばれ、変数の値に1を足します。
48行目でstate_rが1より大きくなっていた場合0に戻す処理を行っています。
50行目・53行目でstate_rの値が0か1で、LEDを光らせるかどうかを決めています。
84行目・88行目はチャタリングを除去しています。(教科書20P
これは、スイッチを押した瞬間に瞬間的にoffになり、その後再度ONになった場合、2回スイッチが押された判定になってしまいLEDが光らなくならないようにするための処置です。
86行目は、43行目のwhile文と似ていますが、()内の最初に”!”が付いています。これは論理演算子の一つで、”~ではない”という意味になります。
スイッチを押し続けている間は(SW_R & SW_C & SW_L)の値は0となりますが”!”があるため、”0(false)ではない”(=”1(true)”)という答えになります。つまり、SWを離すまで無限ループになります。

 

ちなみに、 SW_ R・SW_ C・SW_ Lは、portdef.hの中で定義されています。

 

最後に、このプログラムの動作は以下のようになります。

 

以上、STEP3はこれで終わりです。

 

 

 

タイトルとURLをコピーしました