マイクロチップ社から無償で提供されているPICマイコン用の開発ツール、MPLABについて気付いたことなどを書いていきます。MPLABではターゲットデバイスによって動作が異なる箇所があります。私は14bitコアのものを主として使用しているので、そちらの話に偏ります。ご了承のほどを。
目次
プロジェクトを作らないでアセンブル
わざわざプロジェクトを作成する必要がない場合、ソースをとりあえずアセンブルしたい場合など、プロジェクトを作らないでデバッグをすることができます。ただしその時に設定した内容は保存されないため、何度も起動しなおしたりするときはプロジェクトを作るほうが結局時間が節約できるかもしれません。
- File→Openで対象のソースファイルを読み込みます。
- Configure→DeviceでターゲットCPUを設定。
- 対象ソースのウィンドウがアクティブな状態にして、Project→QuickBuildを選択するとアセンブルが開始されます。
- デバッガでデバッグする場合は、Debugger→Select Toolにて使用するツールを選択します。
注意事項として、アセンブラソースはリロケータブル形式で書かれているとQuickBuildはできません。たとえ1つのファイルで完結していても駄目です。この場合はプロジェクトを作成してください。
ロジックアナライザを使用する
ピンの状態を実行しながら確認することが出来ます。もちろんPORTAなどをWatchウィンドウにて見ることも出来ますが、ロジックアナライザの場合、グラフ化されますので視覚的に分かりやすいです。また印刷することもできますのでレポート提出にも役立ちます。
- View→Simulator Logic Analyserを選択。ウィンドウが開きます。
- Add Signalsボタンにて監視したい信号を選択。
- 実行するとグラフが描かれていきます。
MPLAB SIMでStimulus Controllerを使う
マイコンのデバッグでは、実行中にI/Oピンの入力の変化にきちんと対応しているかを調べる必要があります。そのための機能としてMPLAB内蔵デバッガMPLAB SIMにはStimulus Controllerが実装されています(MPLAB IDE v7.10を元にしています)。Stimulus ControllerからのメッセージはOutputウィンドウのMPLAB SIMタブに出力されます。
何ができるか?
- 指定ピンとウィンドウ上のボタンを関連付け、ボタン押下に対して、Hレベルにセット、Lレベルにセット、Hレベルパルス、Lレベルパルス、H/Lトグル切替を行なう。外部にスイッチが接続されているイメージとして利用できる。
- 時間軸に沿って指定ピンやSFR(特殊機能レジスタ)の変化を自動で行なう。固定波形パターンをプログラムしておくことができる。この機能を利用すれば、A/D変換値や、UART入力なども再現できます。
- 続く
使用方法
- Debugger→Stimulus Controllerにて、Stimulus Controllerウィンドウを開きます。最初はNew Scenarioで良いです。
- このウィンドウのチャートでは、指定ピンとボタンとの関連付けを行ないます。Pin、Action、Width(パルス時)、Unit(パルス時)、Comments(任意)を指定します。
- PinとActionはリストから選択します。Fireのセル部分を押すことでピンの状態を変化させることができます。
高度な設定
さらに高度な動作をさせる場合。
- Debugger→SCL GeneratorにてSCL Workbookウィンドウを開きます。
- このウィンドウで動作をプログラムします。
- Generate SCL From WorkbookボタンにてSCLファイルを保存します。
- Stimulus ControllerウィンドウからAttachボタンにてSCLファイルを読み込みます。Import/Mergeボタンを使用すれば、複数のSCLファイルを合成したり、以前のバージョンのファイルを取り込めます。
SCL Generatoeはあくまで変化シーケンスのプログラムのみで、実際に再生するのはStimilus Controllerウィンドウとなります。Save workbookではSCLファイルは生成されないので注意。
Pin/Register Actions
時間軸に対して、ピンやSFRの値をどのように変えていくかを設定するタブ。Time Unitsは、時間欄の数字の単位の設定。見出し行をクリックすると、対象とする信号の選択ダイアログが開くので、それで選択する。
上図は、RB0、RB4、RA4、RA5ピンについてプログラムしているところです。
Advanced Pin/Register
Pin/Register Actionsが時間に対して信号を変化させるプログラムであるのに対し、Advanced Pin/RegisterはSFRや Pinの状態をトリガにして信号を変化させます。「TMR2がある値を超えたら…」とか「EECON.WRビットが0になったら…」などの条件が設定できます。
- まず下のDifine Conditionという表に記入します。
- Condition欄は自動的にラベルが付けられます。このラベルは上の表を記入する際に使用します。
- When欄では、セルをクリックすると選択リストが表示されるので選んで行きます。例えば、Pin、RB0、=、1、と選択すれば「RB0ピンが1になった時」という意味になります。
- 次のWait欄は、Whenの状態からの経過時間を記入します。2つのセルは値と単位を表します。
- Comment欄は任意です。必要に応じて記入します。日本語は使えないようです。
- Condition定義の次は、トリガの定義を行ないます。上のDefine Triggersという表に記入していきます。
- Enable欄は、この行を有効にする場合にチェックします。いちいち削除する必要がなくなっています。
- Condition欄は、Define Condition表で定義したラベルを選択します。
- Type欄は、条件を満たしたときに発生させるトリガを1度だけにするか、それとも条件を満たす度に発生させるかを選択します。
- Type欄でContを選択した場合はRe-Arm Delay欄を入力します。トリガ発生後に入れるディレイを設定します。2つのセルは値と単位です。
- Click here to Add Signals欄は、トリガ発生時に変化させる信号を登録します。
Clock Stimulus
任意のクロック信号を作り出します(単位はCPUサイクル)。開始トリガ・終了トリガを詳細に設定できるので、刻々と周波数が変化する信号など作成できます。
- Label欄に任意のラベル名を記入します。英字からはじまる英数字のみです。
- Pin欄は、信号を変化させるピンを選択します。
- 信号の初期値を設定します。
- Low Cycles欄は、Low信号を出力する時間を記入します。
- High Cycles欄は、同様にHigh信号を出力する時間を記入します。
- Begin欄・End欄は、下のラジオボタンのリストからそれぞれ選択します。以下、意味を記します。
- At Startは、プログラムの開始。
- Neverは、永遠に。
- PC=は、プログラムが任意の箇所に来たとき。
- Cycle=は、任意のCycle経過後。
- Pin=は、任意のピンが任意の状態になったとき。
- Comment欄は必要に応じてコメントを記入します。
Register Injection
Register Injectionでは、レジスタのアクセスやPC(プログラムカウンタ)値をトリガにして、レジスタの値を変化させます。レジスタに反映させる値は別ファイルに作成する必要があります。Trigger欄がDemandならば、そのレジスタがアクセスされる度に値が設定されます。PC=ならば、PCの値でレジスタの値が変更されます。レジスタの特性によって、選択肢が変わります。A/D変換や、シリアル通信のシミュレートなどに使えると思います。
- Label欄には任意のラベル名を記入します。英字からはじまる英数字のみです。
- Register欄は、対象とするレジスタ名を選択します。
- Trigger欄は、Register欄で選択したレジスタによって選択肢が変化します。
- PC Value欄は、Trigger欄でPC=を選択した場合に入力します。
- Data Filename欄では、レジスタに反映させる値が記録されているファイルを指定します。
- Rewind欄は、ファイルの最後まで読み取った後どうするかを指定します。Yesの場合は、最初から読み直します。Noの場合は、最後の値を使い続けます。
- Format欄は、ファイルの記述形式を指定します。Hexは、ASCIIで16進表記。Rawは、バイナリデータ。SCLは、SCL形式の定義参照。Decは、ASCIIで10進表記。ASCIIの場合は、改行で区切ります。実際のサンプルは、Register Traceで出力されるファイルを参考にすると良いかもしれません。
- Comment欄は、必要に応じて記入します。
Register Trace
Regiset Traceでは、指定したレジスタの値を監視して、ファイルに出力します。監視のタイミングは、レジスタへの代入、若しくはPC値の一致より選択します。
- Label欄には任意のラベル名を記入します。
- Register欄は、追跡(トレース)する対象のレジスタを指定します。
- Trigger欄は、トレースするトリガ(タイミングと言い換えてもいいかも)を指定します。Demandなら値がセットされる度、PC=ならそのPC値のときに記録されます。
- PC Value欄は、Trigger欄でPC=を選択した場合に入力します。
- Trace Filename欄は、トレース結果を記録するファイル名を指定します。
- Format欄は、ファイルの記録形式を指定します。
- Comment欄は、必要に応じて記入します。
Watchを使いこなす
MPLAB SIMで一番お世話になっている機能のひとつにこのWatchがあります。恥ずかしながら私自身最近まで知らなかった機能があったりしたので、あらためてここでまとめておこうと思います。
ファイルレジスタを監視リストへ加える
- コンボボックスで目的のファイルレジスタを選択し、AddSFRボタンで監視リストに追加します。
- コンボボックス展開中は英字キーでその頭文字の選択肢までカーソルが移動します。
- 内蔵モジュールの動作を確認したり、ポート出力の状態を監視するのに便利です。
ユーザメモリを監視リストへ加える
- ユーザプログラムで確保したメモリを監視します。
- コンボボックスで目的のラベルを選択し、AddSymbolボタンで監視リストに追加します。
- ワークエリアの内容を確認するのに便利です。
任意のメモリを監視する
- 上記の方法だとラベル名が付けられているメモリしか監視対象とすることはできません。
- 監視リスト上で右クリックして、Addを選択すると更に細かい指定が可能になります。
- ラベル名の無いエリアは、AbsoluteAddressという枠内で指定します。ここで指定すれば、RAMだけでなくプログラムメモリも監視対象とすることができます。
- プログラムメモリのサイズで上限が切られているので0x2100としてEEPROMを監視することは出来ませんでした。
監視タブを変更する
- 監視リストは標準でWatch1〜4まで4つ用意されていますが、右クリックからAddWatchTabで追加することが出来ます。逆にRemoveWatchTabで表示中のタブを削除できます。
- また、RenameWatchTabでタブの名称を変更しておくと分かりやすくなります。日本語も使えるようです。
- よく使う監視リストなどはファイルへ書き出したり、取り込んだりできます。(LoadWatchTab/SaveWatchTab)
複数のProjectをまとめて管理
PICのような小規模CPUを使っていると複数CPUを連携させて動作させるような使い方が出てきます。その場合、CPU毎にプロジェクトを作成しますが、それらをひとまとめにすることで管理が容易になります。MPLABではそのような単位としてWorkSpaceという単位が用意されていますが、標準で「使用しない」設定になっており、1WorkSpaceに1Projectとなってしまいます。
方法は、Configure→Setting...で下図のウィンドウが出るので、Use one-to-one project-workspace modelのチェックを外します。
この状態では、新しいプロジェクトを作成したり既存のプロジェクトを読み込むと、Workspaceに追加されていきます。上記のチェックを有効にしても複数プロジェクトの管理は使えますが、新たに追加されなくなります。
(注意) この機能の弱いところは、CPUの種類がプロジェクト毎に設定できないところにあります。一つのWorkspaceで1種類のCPUしか扱えないため、877と819の親子通信みたいなものの管理は出来ません。
マイナーバージョンを管理するのに使うのが本来の用途かも知れません。