PICマイコンを使って測定ツールを作ってみよう(2) ―― クロック周波数やモータの回転数を測れるカウンタを作る(後編)

中西 紫朗

 このCOMM_USB()はmain.cに登録したタスク(task)の一つで,主にソフトウェアの検出や液晶パネルへの表示を担当しています.USBの処理はポーリング(polling)といって,グルグル回るループの中で毎回USB割り込みフラグがたったかどうかをチェックしています.

 ホスト・パソコンのUSBからは,1ms(ミリ秒)ごとに"生きているかどうか"の問い合わせがあります.毎回きちんと答えてやらないと,ホスト・パソコンの画面の下のほうに「USBから応答がありません」というメッセージがでて,通信不能になります.ですから,どんなに長いタスクでも1ms以内に処理が終了するようにプログラムを作らないといけません.

 それを可能にするのが,割り込みとステート・マシンです.処理を細かい単位に分け,識別番号をふり,1回のループごとに順番に細かい処理を実行していくのがステート・マシンです.今回はまだ実装していませんが,割り込み処理ルーチンの中のI2Cなどの処理はステート・マシンで記述しています.これは,本連載の後半で実際に使われます.ここではスレーブ処理しかありませんが,今後マスタ処理が追加され,どちらかのデバイスとして実行できるようになります.

 割り込み処理ルーチンはISR(Interrupt Service Routine)と呼びます.これは,たいていのコンピュータで使われている便利な機能です.図6に,ここでの割り込み処理の内容を示します.user.cではISRを最後に配置しています.最初に書く人も多いのですが,筆者はすぐに探せるように最後に持ってきています.C言語の関数では,main.c以外はプロトタイプ宣言を行っておかないとコンパイル・エラーが出ます.ただしISRだけは別の扱いで,プロトタイプ宣言を行う必要はありません.


図6 割り込み処理の流れ

 


 さて話を戻して,メニューに自分の名前を追加する方法を説明しましょう.リスト2でメニューの設定を行っています.ここのどれかを変えることにより,自分の名前を表示できます.ためしに4番目のメニューを初期値の「4 SPI」から「xxxxxx(xxxxxxはあなたの名前.アルファベットでも半角カタカナでもOK)」に変えてみましょう.プログラムの先頭部でいろいろな変数と定数の設定を行っており,ここを変える方法もあるのですが,せっかく表示部分を探し出しているのでそこを変更しましょう.

リスト2 メニュー設定の記述(user.cの263~306行目)

              if(menu_change){
                  switch(menu){
                                          case 1 : LCDstring(mn1,8); break;
                                          case 2 : LCDstring(mn2,8); break;
                                          case 3 : LCDstring(mn3,8); break;
                                          case 4 : LCDstring(mn4,8); break;
                                          case 5 : LCDstring(mn5,8); break;
                                          case 6 : LCDstring(mn6,8); break;
                                          case 7 : LCDstring(mn7,8); break;
                            }
                            LCDlocate(0x40);
              }
 
              if(menu_change){
 
                            PORTAbits.RA0= 0;
                            LCDmenu2();                   
                            LCDlocate(0);
              }
              if((menu_selected)&&(dsp_on)){
                            switch(menu){
                                          case 0 :
                                          case 1 :
                                                        dsp_on=0;
                                                        LCDlocate (0x40);
                                                        LCDstring("        ",8);
                                                        freq=(cnt01*0x10000+TMR0H1*0x100+TMR0L1)*256/100;
                                                        sprintf(va1,"%8ld",freq);
                                                        LCDlocate(0x46-strlen(va1));
                                                        LCDstring(va1,strlen(va1));
//                                                      LCDwrite(0x30);
//                                                      LCDwrite(0x4B);
                                                        break;
                                          case 2 :
                                          case 3 :
                                          case 4 :
                                          case 5 :
                                          case 6 :
                                          case 7 :
                                                        LCDlocate(0x40);
                                                        LCDstring(mn0,8);
                                                        break;
                            }
              }
             

 


 switch文の上に mn4="xxxxxx"; という文を追加するだけです.これでProjectメニューの下の「Build」を選択すると,コンパイル・リンクが始まります.PICマイコンに書き込んで基板にUSBケーブルをつなぐと,最初のメニューが液晶パネルに表示されます.表示スイッチのUPーを押し続けると,4番目にあなたの名前がでてきます.簡単でしょう.

 全体の制御を変更するには,まだまだ覚えることがたくさんありますが,プログラムの修正・書き込みはこんなに簡単だということを実感してください.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日