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


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

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

 

__cplusplusですが、ファイルの中を全部探しても、定義がどこでされているのか見つかりません。
これは、もともとコンパイラに定義されているマクロであり、C++のコンパイラから読まれたときは有効になり、Cコンパイラから読まれたときはスルーされます。
もう一つextem ”C”もどこにも定義されていません。これは、extem ”C”{} 内に書かれた内容をCでコンパイルするための設定です。
なぜ、こんなにめんどくさい処理をするのかと言うと、C++では、同じ名称でも型などを変えると、違う関数を作ることが出来るため、関数をコンパイルすると内部では関数が修飾されて、名前が変わってしまうためです。(このことをマングルという。)
最後にabortですが、これは、プログラムに何らかの異常が発生した場合、プログラムを終了終了させるための関数です。
この関数は、Cでコンパイルする必要があるため、extem ”C”{}を使っています。

 

今回のメインプログラムは、init_all()とview_adc()です。
なんか見た目、すごく少なく見えますが、関数の中で結構いっぱい処理があります。

 

init_all()の中身はinit.hに記載されていますが、新たにinit_adcが追加されています。

 

init_adcは、init.cの中で定義されています。
183・185行目でいつものようにプロテクト解除・保護をやってます。
184行目は電力の供給を行っています。(参考
187行目はAD変換の書き方を右詰にしています。なお、ルネサスのマイコンは、初期設定は右詰になっていますので書く必要はないのですが、分かりやすくするため記載されています。(参考
ちなみに何故、右詰の必要があるのかと言うと、右側に予約ビットがあると、値を読みに行くときに、値をシフトさせなくてはならなくて、少し分かりにくいため右詰めにしています。
188行目はPCLK(周辺クロック)の分周しない設定にしています。(参考

 

メインプログラムにあったview_adcは、adjust.cファイルで定義されています。
センサーの値を読み取って電圧表示しています。
USB_PRINTFは、USB通信でprintfするための関数です。
18~21行目は、センサーの値を表示させています。
22行目は、ADDR8に入っている値を㎷の値になるように計算して、表示させています。

 

上図18~21行目のsen_r.value等の値は、interrupt.cで定義されています。
4つのセンサーを1ずつ読み込みに行っていいます。
58行目フォトトランジスタの応答待ちループをさせているのは、フォトトランジスタは、受光後電圧が立ち上がるまで少し時間がかかるためです。
59行目は、A/D変換のチャンネルを選択しています。(参考
60・61行目は、AD変換を開始して、AD変換が終了するとADSTの値は0になるため、whileから抜け出します。(参考
最終的にsen_r.p_valueに過去の値を入力して、sen_r.valueに現在の値が入っています。
70行目以降はセンサーが違うだけで同じです。stateの値が115行目で1ずつ増えていくので、1回読み込むたびに次のセンサーを読みに行きます。
CMT1は、initi.cで0.25ms毎に割り込みが発生するように設定されています。(参考

 

電圧の値はinterrupt.cでA/D変換した値が格納されています。
returnでgetBatteryVoltに値を返していますが、getBatteryVolt自体は、電圧監視用に使われています。

 

電圧監視は、interrupt.cで定義されています。(ちなみに、バッテリー監視はSTEP0のサンプルコードからずっと入っています。)
getBatteryVoltは最終的にv_valueに値が入りますので、28行目で、バッテリーが無くなっていくとLEDの色が青⇒紫⇒赤に徐々に変わります。
2色のLEDを同時に光らせていないのに、紫は何処から出てきたと思う人もいると思いますが、bled_cntで高速で青色と赤色を変化させて紫色に見えるようにしています。
bled_cntが0-10まで変化するため、バッテリー残量に応じて青色の時間と赤色の時間の割合いが変わり、バッテリー残量が減るとだんたんと赤色に近づいていきます。
そして、36行目で、現在のバッテリー残量がBATT_MIN(10V)より小さくなったら、ブザーを発振して、モーター・LEDを停止するようになっています。
BATT_MAXとBATT_MINの値は、static_parameters.hで与えられています。ちなみに、staticは、”静的な”という意味で、関数としてのstaticは、『メモリを確保して保持し続ける』または『別のファイルから使用するのを防ぐ』ために使用します。今回の場合ですと、21行目のbled_cnt++で値に1が加えられますが、2回目読み込んだ際に、再度18行目を読み込むため、staticが付いていなかった場合、初期化されて0になってしまいます。
なお、cmt0は以前紹介しましたが、0.1ms毎に割り込みが入るように設定されています。

 

今回は、これで終わりです。


Posted in Pi:Co Classic3 製作記