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


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

こんにちは岩本です。
今回はサンプルプログラムSTEP4の中身を確認していきたいと思います。
まずは、取り敢えずメインプログラムの全体像を確認します。

 

37~43行目の_LED関数の定義は下図の様になっています。
led_dataの値によってLEDの点灯条件を制御しています。
LED0は、led_dataと1を&で比較していますので、led_dataの値が2進数で1桁目が1になった時、点灯します。
LED1は、led_dataを1つ右ビットシフトした後、1と比較していますので、led_dataの値が2進数で2桁目が1になった時、点灯します。
LED2は、led_dataを2つ右ビットシフトした後、1と比較していますので、led_dataの値が2進数で3桁目が1になった時、点灯します。
LED3は、led_dataを3つ右ビットシフトした後、1と比較していますので、led_dataの値が2進数で4桁目が1になった時、点灯します。

 

なお、”>>”はビット演算子の一つで、”右ビットシフト”と呼ばれます。
右辺の値分だけ右にビットをずらします。また、右側の枠からはみ出た値は消えます。(オーバーフロー)

 

led_dataの中に入る値は、64行目で_LED(mode)と呼び出されています。そして、modeの値は53行目で初期値を1と決めています。
そのため、led_dataの値は最初1となり、”LED0=1&1”となりますので、電源を入れたらLED0のみ値が1となり点灯します。
次に55行目からの無限ループの中身ですが、まず57行目では、関数wait_msを使って待ち時間を作っています。
CHATTERING_WAITの中身は、static_parameters.hファイルで10と定義されていますのでwait_ms(30)が引数となります。
58行目、DISABLE_BUZZERの中身は、macro.hでブザーを止めに行っているだけです。
60行目は、Part8でも紹介したので、そちらを見てください。

 

wait_msはmisc.cファイルで定義されています。
先ほど定義された引数wait_ms(30)を例にとるとwtimeは30となります。start_timeはtimerの値を代入しており、timerの中身はextemで別のフォルダで宣言されています。
このプログラムを読まれた瞬間からtimerが30カウントしたら値がfalseとなりますので、whileから抜け出せることが出来ます。

 

timerの定義は下記ですが、int_cmt0が読み込まれるタイミングはcmt(コンペアマッチタイマ)で制御されています。
cmtは、設定したカウント数に達した時、何らかのアクションを割り込ませる為の機能です。
割り込みされたプログラムは、メインプログラムを中断して優先的に処理されます。

 

なお、関数をcmtで割り込ませるには、intprg.cの59行目のように動かしたい関数を記載します。(59行目以外は自動生成されています。)

 

cmtは、init.cで初期設定をしています。(init_allで設定しているものです。)
99行目は、クロック選択ビットで1/32に分周しています。
100行目は、コンペアマッチ割り込みを許可しています。
101行目は、カウンタのリセットを行います。
102行目は、コンペアマッチを行う周期を決めています。なお、1499カウントが丁度1msになります。
104~6行目は、コメント通りの設定を行っており、iodefine.hで定義されています。iodefine.hの定義の仕方が今までと違い少し読みにくいですが、構造体と同じ表記になるようになっています。(参考※38行目と39行目は同じ表記になります。)
118行目からカウントがスタートします。

 

再びPiCoClassic3.cに戻ってきました。
ここからは、SW_L及びSW_Rのスイッチが押されるたびにmodeの値を増減させブザーを鳴らす動作と、SW_Cのスイッチが押されたときに選択されているモードの音を鳴動させます。

 

ブザーの音はmacro.hで定義されており、fの値を変えることで音程を設定しています。
3行目で、MTU(マルチファンクションタイマーパルスユニット)の機能を使って、PWMの設定を行っています。(ユーザーマニュアル参考
MTUは、CMTと同じで割り込みを行うための機能です。しかし、CMTよりMTUの方が多機能で、PWM等を行う時は、MTUを使用します。

 

PWMの設定は周波数の下図の部分の設定を行っています。

 

モード増減時の音はstatic_parameters.hで設定されています。

 

モード毎の音は、105行目以降に記載されています。今はドレミまでしかありませんが、追加してあげれば、他の音程も出すことが出来ます。

 

今回は、ここまでです。


Posted in Pi:Co Classic3 製作記