【付録】ICEを使おう・・・

これまではFlash PICを使用してPICのプログラムを動かしていましたが、ここからは本格的に実物のICEを使用した開発方法をご紹介します。

 ICE(アイス)とは、あまり聴き慣れない言葉ですが、インサーキットエミュレーターの略で、簡単に説明しますとプログラム開発のお手伝いをしてくれる便利なツールのことです。デジタル降魔録に置いてある〝Flash PIC〟も、実はこのICEを再現しようというところから始めました。

 PICのプログラム開発を行うには、パソコンとPICの書き込み器があれば可能です。これだけでプログラムを作って、PICを走らせることができますが、やってみるとこれがなかなか難しいことが解ります。理由は、正しく走ってくれないからです。あるいは、走ることは走るが、何かおかしい・・・という状況になります。こうなってくると、ハードが悪いのかソフトが悪いのか、別方向にも意識を向けなければダメで、たいへん疲れます。ハードの方は配線図と照らし合わせて検証できますが、ソフトとなるとまったくの目隠し状態で、にっちもさっちもいかなくなり・・・ハイ降参、となります。

 プログラムが目隠し状態というのはどういうことでしょうか・・・。プログラム言語はパソコン上に自分で書いていますので、見えていないわけではありません。しかしこの状態はただの単語の羅列で、プログラムとして走らなければ何の意味もありません。で、実際に走らせると、このプログラムがPICの中でどのような変化を起こしていて、何をやっているのかは絶対に見えません。コレが目隠し状態です。そこで少しでも動きを目で追いかようと、外部にLEDなどを取り付けて対処しますが、やはり目隠し状態に変わりはありません。

 MPLAB IDEを使用されている方には、強い味方のデバッグ・シミュレーターが付いていますが、タダでさえややこしいプログラムのデバッグなのに、このシミュレーターは操作が難しくて、さらにややこしい結果を招きます。

 そこで登場、インサーキットエミュレーター(以後 ICE と書きます)です。
 ICEは、製作したボードに実際のPICを差し込んで走らせるのではなく、パソコンとボードのあいだに入り、ボードから見ると、あたかもPICが差し込まれているのと同じように振る舞います。そして、パソコンに接続されていますので、その時々に変化するPICの状態をパソコン画面にレポートしてくれます。いま、プログラムメモリのどこを走っていたか、その直前の命令でレジスタファイルがどう変化した、などを1命令ずつ報告させることもできます。まさに自分の作ったプログラムが手にとって見えるようにしてくれる魔法のツールです。

 そんな便利なものがなぜ知られてないのか・・・。理由は簡単。お高いのです。マイクロチップテクノロジー社のお墨付きのICE2000は本体とデバイスユニット合わせて40万円以上。ICE4000にいたっては50万円以上します。て、手が出せません。
ICE2000/ICE4000
 そのなかでも、DataAction社のRICE3000は本体とデバイスユニット合わせて22~23万円と約半額になっています。取扱店は(有)データダイナミクスさんです。
 RICE3000以外にも、もっと低価格なMPLAB-ICD2というICEもありますが、ターゲットPIC内のメモリを使用したり、ポートを一部使用したり、さらに実行速度が遅いので、完全なリアルタイムICEとはいえません。そのような意味では完全なリアルタイムICEで、この価格は魅力的です。ちなみに、わたしはメーカーさんからは一銭も貰ってませんので・・・(笑)

それでは、いつかは持ちたいICEの基本的な操作方法を説明します。上がRICE3000の全体写真です。

 ICEはそれ自身を動かすソフトウエアと、エミュレーション・ポッドと呼ばれる、金属ケースに入ったユニット、その先端にはデバイス・アダプターというPICの代わりに製作ボードに差し込むケーブル、パソコンとポッドを接続するケーブル(USBかプリンタケーブル)などから構成されます。上の写真では、手前にパソコンのプリンターケーブルを差し込むコネクターが見えています。そしてデバイスアダプターがターゲットボード(基板)に差し込まれています。パソコンとの接続はプリンター以外にUSB接続も可能です。(パラレル・USB変換ユニットが必要です)

 最初はRICE3000付属のソフトウエアをインストールします。インストール自体は難しくはないのですが、日本語マニュアルに誤解しやすい説明がありますので、ここで補足しておきます。
インストール説明
説明は日本語なのですが、項目は英語のままですので、実際にデバイスマネージャーへ行って見ると、異なる項目が出てくるので悩んでしまいます。そこで、私は下記のように解釈しました。

_________________________________________________________________________
コントロールパネルをクラッシック表示で立ち上げて「システム」のアイコンをクリックするか、そのままで
「パフォーマンスとメンテナンス」をクリックして「システム」を見つけてください。

システム → ハードウエア → デバイスマネージャー と押してデバイスマネージャーを開きます。
開いたら・・・。 

表示 → 非表示のデバイスの表示 → プラグアンドプレイではないドライバ と進みます。

「プラグアンドプレイではないドライバ」の中に〝parice〟が無い場合は
「プラグアンドプレイではないドライバ」の上で右クリックで
「ハードウエア変更のスキャン」を行うと出てきます。

そして〝parice〟を右クリック→プロパティ を開き。次のことを確認します。

「デバイスの使用状況」を「このディバイスを使う(有効)」になっていること、
「ドライバ」の項目を開き、「現在の状態」が「開始」
「スタートアップ」が「自動」

・・・と、なっていることを確認します。
これで、項目1~6の終了です。
_________________________________________________________________________

 インストールが無事完了しましたら、プリンターケーブルをRICE3000に接続して、付属の電源アダプターを差込んで電源を供給します。正しければ電源コネクタ上のLEDが点滅して、最終的に点灯状態になります。
 次に、インストールしたソフトウエア〝RICE3000 PIC Emulator IDE〟を立ち上げます。

 正常でしたら、次のような画面になります。
最初の画面
 エラーも無く立ち上がった画面はこのように何も出ていない状態です。まだ、エミュレーションする準備ができていないからです。これから、自分用にカスタマイズしていくことになります。と、その前に・・・。エミュレーションを動かすには何かサンプルになるプログラムが必要ですの、PIC16F877Aをターゲットデバイスにして、簡単なプログラムを書いてみました。


	LIST	P=PI C16F877		;16F877を使用

COUNT	equ	0x20			;テスト的なカウンター

	goto	INIT			;プログラム先頭へジャンプ


	org	0x100
INIT:
		clrw
		clrwdt
		incf	COUNT,F		;カウンターをincする
	goto	INIT

 END

 これ以上簡単なプログラムは無いというぐらに短いプログラムです(ほとんど意味が無いともいえますが・・・)。リセット直後にアドレス0x100番地へ飛んで、Wレジスタとウォッチドッグタイマーをクリアにして、COUNTというメモリを+1するという処理を永遠と行うプログラムです。ファイル名を〝test.asm〟として適当なテキストエディッタで打ち込みます。それを〝MPASMWIN.exe〟でアセンブルします。アセンブルが終了すると〝test.asm〟の置かれていたフォルダー内に、〝test.LST〟〝test.COD〟〝test.HEX〟〝test.ERR〟というファイルが作られます。この中でエミュレーションに必要なのは、〝test.COD〟というファイルです。〝test.HEX〟というのは、PICライターへ送る純粋なプログラムデータです。

 では、エミュレーションテストを行ってみます。他のソースプログラムでもやることは同じです。参考にしてください。

 何も出ていない立ち上げ画面で、左上端の〝File〟から〝load Debugged File〟を押して、エミュレーションする〝.COD〟ファイルをロードします。
 このときになぜ〝Open Source〟でソースファイルを開かないか・・・ですよね。
コードをロードする
 ソースファイルを開いてもいいのですが、コメント文に日本語を使っているとすべて文字化けします。私はコメントも重要なプログラムの一部だと思っていますので、日本語表示ができないツールは使用しません。そこでプログラムをいつでも修正できるように、テキストエディッタは常に開いたままにしておき、RICE3000上ではソースファイルは使用せず、アセンブルされた〝.COD〟ファイルを使用しています。それから、アセンブルしてくれる〝MPASMWIN.exe〟も、このRICE3000から起動するようにしています。その方法は、後で詳しく説明します。

 【ツールウィンドウを出す】

 最初は画面のカスタマイズの方法を説明します。これは私の方法ですので、好みでイロイロ変えてください。
 まずはアセンブラでアセンブルした時にできる〝.COD〟ファイルをロードします。ここでは〝test.COD〟をロードしますが、初めての時はロードが完了しても何も表示されませんので、これからデバッグに必要なツールウインドウを開いてきます。
 私はソースプログラムを開きませんので、逆アセンブラウインドウをメインに持ってきます。
逆アセンブルウィンドウを出す
〝View〟→〝Disassembled Code〟と押して表示させて、画面の左端から3分の1ほどのエリアに置きます。次に〝Watch〟と〝Special File Registers〟を開き、続けて〝Data Memory〟を開きます。そして最後に使用しませんが〝File〟→〝Open Source〟と押してソースファイルである〝test.asm〟も開いておきます。この場合、外部テキストエディッタの方で、先にソースファイルをオープンしておく必要があります。そして、RICE3000上で開いたソースファイルは使用しませんので、最低限の大きさに縮めて、隅の方に置いておきます。このあたりの理由は後ほど説明します。

 全体の配置はこんな感じになります。
ワークエリア


 開いたウィンドウの大きさや配置場所は、次回も同じようにオープンさせるために、 ワークスペースを記憶させておく必要があります。
そのためのコマンドが、左の写真の、〝File〟→〝Save Workspace〟です。ウィンドウの大きさや位置を変更したら、そのつどセーブすることをお奨めします。





 それでは、開いた各ツールウインドウの説明を順にします。

 最初は〝Disassembled Code〟ウィンドウです。
逆アセンブルコード 上の写真はプログラムで決めたラベル名〝INIT〟の場所を表示させたところです。指定ラベルから表示させるには〝Disassembled Code〟ウィンドウをクリックしてから、CTRL+〝G〟キーを押して〝INIT〟と入力します。また、マウスでスクロールしても同じです。
 このウィンドウに表示されているのが、実際のPICのプログラムエリアに並んでいる機械語を逆にアセンブルコードに変換して表示したものです。いわばPICに書き込むプログラムの内容を見ていることになります。
 上の写真では〝test.asm〟が実際にアセンブルされて、擬似命令で指定した通りプログラムアドレス0x100番地から命令が展開されているのが分ります。


 次は〝Special File Registers〟ウィンドウです。
Special Function Registers なぜか、ここでも〝Special File Registers〟と〝Special Function Register〟の両方の表記があります。昔は〝Special File Registers〟と呼んでましたが最近では〝Special Function Registers〟と呼ぶようになったのでしょうか? ここでは〝SFR〟と書きます。

 ここにはPIC16F877で使用される各種レジスタ(ファイルレジスタ)の一覧と現在の内容が表示されています。
 Flash PICでは10個しかレジスタはありませんでしたが、16F877は4バンクに渡って数多くのレジスタが存在します。レジスタの内容は、走らせているプログラムを停止させた時に最新の状態に更新されます。このあたりはFlash PICのWatchウィンドウと同じです。

 Flash PICでは〝SFR〟も同じWatchウィンドウで表示させていましたが、RICE3000では〝SFR〟の一覧表示は〝SFR〟ウィンドウで、ユーザーメモリーは〝Watch〟ウィンドウに表示します。






 次が〝Watch〟ウィンドウです。
ウォッチウィンドウ まだ何も指定していませんので〝Watch〟ウィンドウは空の状態です。ここにプログラムで使用しているメモリーの一覧表示をさせます。どのメモリーを表示させるかの指定をするのが〝Debug〟→〝add Watch〟コマンドです。




〝Debug〟→〝add Watch〟と押すと、〝Watch〟ウィンドウに表示させるメモリーを指定する〝Add Watch〟ウィンドウが開きます。
ウォッチに指定する 〝test.asm〟では、〝COUNT〟というメモリーしか使用していませんので、〝COUNT〟が出てきます。
 左の〝Symbols〟欄から〝COUNT〟を選択して、真ん中上段の〝Add〟ボタンを押すと右の〝Watch Variables〟欄に登録されます。〝Close〟ボタンを押すまでは何個でも追加できます。最後に〝Close〟ボタンを押して終了させると・・。

ウォッチに指定する 先ほどまで空白だった〝Watch〟ウインドウに〝COUNT〟値が表示されています。
〝Symbols〟はメモリー名、〝Addr〟は割り当てられているアドレス(ソースでequ 0x20と指定しているのでアドレスが0x20になっています)〝Hex〟はその内容の16進表記、〝Dec〟は同じく10進表記です。
 〝Watch〟ウインドウに新しい項目を追加しましたので、〝File〟→〝Save Workspace〟で内容を更新しておきましよう。次回から楽になります。




データメモリ一覧
上の写真が〝Data Memory〟ウィンドウです。これはPICが持っているすべてのRAMエリアを16進表示します。
〝SFR〟や、ユーザーメモリー(test.asmではアドレス0x20番地のCOUNT)も含めて一覧表示されます。全体が瞬時に見渡せるで意外と便利です。




ソースファイルウインドウ
 そして最後が〝Source〟ウィンドウです。(上写真)

 使いもしないソースファイルをオープンしている理由は、RICE3000から外部アセンブラを起動させるためです。私はなるべくマウスを使用しないで作業ができるように、ほとんどをショートカットキーだけで行うようにしています。マウスに持ち替える手間が非常にロスタイムになるからです。

 RICE3000から、MPASMWIN.exeを起動させる方法を説明します。
コンパイラオプション
 RICE3000で、外部アセンブラを起動させるようにするには、上のように、
〝Tool〟→〝Complier Options〟と進み。〝Browse〟ボタンを押して、〝C:\Program Files\Microchip\MPASM Suite\〟フォルダに入っている〝MPASMWIN.exe〟を選択します。
アセンブラを指定
 コレ以降、RICE3000を立ち上げて、〝.COD〟ファイルをロードした後からは〝F12〟を押すだけでアセンブラが起動して、アセンブルしてくれます。



ソースファイルがアクティブではない
 また、〝F12〟を押すと上の写真のようなエラーメッセージが出た場合は、ソースファイルウインドウをマウスクリックして、一度だけ選択状態にしてやると、それ以降から出なくなります。


 ただし、別のテキストエディッタでソースファイルを先に開いていますので、〝ソースファイルが開けない〟という、下記のようなメッセージが出ますが、〝OK〟を押して無視しても問題ありません。
ソースファイルが開けない
 頻繁にソースファイルの修正を行わない場合は、このような面倒な設定をせずに、そのつど〝MPASMWIN.exe〟を立ち上げてアセンブルさせて、〝.COD〟ファイルを作っても問題はありません。
 RICE3000で〝MPASMWIN.exe〟を起動させる方法は、面倒そうですが、慣れるとキーボードだけで操作ができて、そのつど〝.COD〟ファイルを読み込む手間も省け、さらにソースファイルにエラーがあるとエラー表示も出ますので、やってみると意外と便利です。


 【エミュレーションの設定】


 エミュレーションを行うために便利なツールウィンドウの説明をして来ましたが、次は実際にエミュレーションを始めるための各種設定について説明します。

 RICE3000はPICのエミュレーションを行うためにイロイロな設定ができるようになっています。ターゲットボードのクロック周波数や、ウォッチドッグタイマーの設定を初めに行っておかないと、正確なエミュレーションはできません。
 この中でも、何MHzのクロックでPICを走らせるのかという設定はたいへん重要です。4MHzと20MHzでは処理速度に雲泥の差があります。ターゲットボードに10MHzのオシレーターが搭載されているのに、4MHzでエミュレーションしていたのでは、高価なICEを使用している意味がありません。

 それらの設定を行うのが、〝Config〟→〝Device Configuration〟ウィンドウです。
ディバイス設定
 〝PIC Processor〟の項目では使用するターゲットデバイスを選択します。(上の写真では16F877Aが選択されています)
 ICEでは〝PIC Processor〟で選択されたデバイスに合ったエミュレーションチップ類が必要で、それらのことがその下、〝Emulator Chip〟〝Probe Card〟〝Bondout Chip〟に表示されています。
 〝Watchdog Timer〟を〝Enable〟にするとウォッチドッグタイマー機能が働き、タイムアウトになるとリセットが掛かるようなります。慣れるまでは〝Disable〟でいいと思います。

 重要なのは一番最終の項目です。
 〝Enable External Osscillator〟(外部クロック)

 〝Enable Internal Osscillator〟(内部クロック)

 〝Enable Customized Synthesizer(48.8KHz - 50MHz)with0.1% accuracy〟(任意クロック 48.8KHz ~ 50MHz)

 正確なエミュレーションを行うために、通常は〝外部クロック〟を選択します。しかし、ターゲットボードのオシレーターからのクロック信号を長いエミュレーションコードを通して拾うため、たいへんシビアーになっています。PIC専用のオシレーターを使用しませんと、ICEが途中で停止したり、リセットが掛かったりします。
 もしこのようなことになった場合は、設定を〝内部クロック〟にして、ターゲットボードと同じ周波数を選びますが、16MHzから二分の一ずつの選択しかできません。自分のクロックが無い場合は、〝任意クロック〟設定を選択して、入力欄に周波数を書き込みます。
 ただし、〝任意クロック〟の場合非常に不安定な状態になるようで、ちょっとしたことでRICE3000がフリーズしたりしますので、できる限り〝外部クロック〟指定にすることをお奨めします。

 ※この〝Device Configuration〟ウィンドウでクロック設定を忘れると、デフォルトの〝内部クロック〟設定の4MHzになりますので、思ったとおりの動きをしてくれず、慌てることになります。また、ここで設定を行った後は〝File〟→〝Save Workspace〟で内容を更新しておきましよう。


【電源を入れる】


 これでICEの設定が終わりました。いよいよ動かしてみます。
 ICE本体の電源は入ったままで大丈夫です。
 まず、製作したボード(ターゲットボード)の電源が入っていないことを確認後、PICを抜き去り、ICEのデバイスアダプターソケットを差し込みます。
 ソケットの方向は間違っていませんか? 後でターゲットボードの電源を入れますので、電源の極性や方向が間違っていると高価なICEを一瞬で破壊する可能性もありますので、細心の注意をしてください。回路図が間違っていて、PICのポートに高電圧が掛かっていた・・・なんて洒落になりませんよ。よくチェックして下さい。

 次に、〝Disassembled Code〟ウィンドウにプログラムが表示されていることを確認。〝Watch〟ウインドウにもメモリー一覧が表示されていますでしょうか、〝SFR〟ウィンドウも大丈夫ですか? 

 すべてOKならターゲットボードの電源を入れてから〝Shift〟+〝F7〟キーを押します(リセット後、連続実行)。

ディバイス設定
上写真のように、右下端のステータスバーに〝RUN〟と表示が出たら、現在エミュレーションが実行されています。

 〝F4〟を押す(実行停止)と停止して、〝Disassembled Code〟ウィンドウには停止した場所がカーソル位置になり、黒く塗られた表示になります。そして〝SFR〟ウィンドウや〝Watch〟ウィンドウ内、すべてのデータが最新の状態に更新されます。数値に変化があった部分は赤色になります。このあたりはFlash PICと同じです。

 〝F8〟を押す(シングルステップ)と〝Disassembled Code〟ウィンドウのカーソルがひとつ進みます。これはシングルステップモードを行ったことを意味します。1個の命令だけを処理して、すべてのレジスタやメモリ内容を更新します。

 〝F2〟を押す(カーソル位置にブレークポイント設定)と、〝Disassembled Code〟ウィンドウのカーソル位置に〝B〟マークが付き、そこにブレークポイントが設定されたことを意味します。Flash PICのブレークポイントと機能的には同じですが、ブレークポイントの数に制限がありません。いくつでも置くことができます。

 RICE3000は割り込みを使用したプログラムでも正確にエミュレートしてくれます。〝F8〟のシングルステップモードでプログラムを進めている時に割り込みが掛かると、割り込みアドレスへジャンプするのが見えます。これはこれで便利なのですが、頻繁に割り込みのかかるプログラムの場合、〝F8〟のシングルステップモードでは、何度も割り込み処理に入ってしまいますので、肝心のメイン処理のステップが旨くできません。このような場合は、〝F3(カーソル行まで実行)〟を行います。ただしカーソルの指定をせずにそのまま〝F3〟を押すだけです。〝Disassembled Code〟ウィンドウのカーソル位置は次の実行先を常に指して停止しますので、〝F3〟を押すだけで、シングルステップを行います。〝F8〟と異なるのは、途中で割り込みが掛かってもその部分は実速度で実行され、次の命令で停止します。注意としては、〝F3〟を使用する時は〝Disassembled Code〟ウィンドウがアクティブ状態でないと実行されません。


 このようにシングルステップ動作や、ブレークポイント停止などを駆使して、そのつど〝SFR〟ウィンドウや〝Wacth〟ウィンドウを見ているとプログラムの挙動が手に取るように解ります。

 ICE以外に開発支援器としてよく使用されるものにロジックアナライザーがありますが、RICE3000では、このロジアナのスタートトリガー信号を出すことができます。

 〝Debug〟→〝Add Trigger Point〟で、トリガー信号を出すアドレスを指定しておくと、プログラムの任意の位置から任意の位置まで、どれぐらいの速度で処理したかをシミュレーションの計算値ではなく実測値として計ることができます。このペアーの使い方は天下無敵の開発支援器になります。オシレーターの微妙な周波数の狂いから来る、PIC内蔵のタイマー値の誤差やスイッチのチャタリング対策処理が、どこでスイッチONを認識して、どこでOFFを認識したのか、ごく瞬間の世界を見ることができるようになります。







 【付録】ICEを使おう・・・----------(ここまで)