1.I/Oのシミュレート
プログラムのデバッグをシミュレータで行う場合やっかいなのが、
入出力 を伴う時です。
外部から信号を入れることが出来ないため実際を模擬できない
からです。
しかし、MPLABでは賢い方法を使っています。
(1) 出力の場合
これは単純で、前項でも説明した"File Register Window"で
確認することが出来ます。
ここでは、出力だけでなく、入力されたデータの状態も表し
ています。
つまり、
アドレス ポート
05 PORT A
06 PORT B
となります。
(2) 入力の場合(2002/9/6)
入力のシミュレートには、「Asyncronous Stimulus」を使います。
まず、Debug → Simulator Stimulus → Asyncronous Stimulus
下図の窓を開きます。ここでどれかのボタンを左クリックしてボタンに
ポートを登録します。動作モードとしては、High、Lowの他に
Toggle(交互)とパルスがありますので適当に選択します。
ここで指定した内容でボタンを押す毎に模擬動作をします。
設定が完了したら、プログラムをRunさせブレークポイントで停止した
時点で、Stimulusの指定ボタンを押せば、ボタンに設定した擬似入力
動作をします。
PORT Aは RA0 〜 RA7
PORT Bは RB0 〜 RB7
2.割込みのシミュレート
入出力よりシミュレートが厄介なのは割込みです。
ここでもMPLABは賢い方法を提供しています。
つまり、作ったプログラムが割込みを受け付ける様に作成
されていれば、下記割込みについては、条件が成立すれば、
割込みが入ったのと同様にプログラムカウンターをスタック
に保存し、4番地にジャンプします。
当然その時の「INTCON」レジスタも正しくシミュレートされて
います。
従って、下記の様に割込みが入る条件をセットしてやれば
良いことになります。
割込みの種類 割込みが発生する条件
---------------- ------------------------------------
(1) 外部 INTピン RB0が外部INTを入力するポートですから
への入力 立ち上がりエッジが立ち下がりエッジかの
条件が合えば割込みます。
従って、1項のI/Oシミュレートのやり方
で入力信号を入れます。
(2) TMR0の これはタイマーを正しく動くように設定
オーバーフロー されていれば、自動的にタイマー動作が
シミュレートされているので、タイマー
のオーバーフローとなれば割込みが発生
します。
タイマー動作は命令実行サイクルでシミ
ュレートされています。従って、プログ
ラムのシミュレーション実行(Run)をしな
いとタイマーはカウントアップしません。
(3) PORT RB4〜RB7 割込みが入るようにポート設定が正しく
の変化 されていれば、ポートへの入力のシミュ
レートつまりModifyでRB4〜RB7のいずれ
かのポートに入力変化を与えれば割込み
動作をします。
(4) データEEPROM これは正しくEEPROMへの書き込み動作を
への書き込み終了 行い、かつ割込み発生を許可していれば
動作シミュレートが終了時点で自動的に
割込み動作をします。
書き込み動作に要する時間(約10msec)も
きちんとシミュレートされています。
【注意】
・上記の割込み条件を設定すれば直ぐ割込みが入るというと
そうではなく、その前に割込みが受け付けられる様にプログラ
ムが作られていることが必要です。その条件とは下記です。
・INTCONレジスタの必要な割込みイネーブルビットをセット
・4番地から割込みを受け付けた時の処理ルーチンがあること。
そしてどの割り込みかをINTCONレジスタのフラグで確認し
それぞれの処理をしたあと、そのフラグのみをクリアする。
・割込み処理ルーチンの最後に「RETFIE」命令でRETURNする
ようになっていること。(そうしないと次の割込みが入らない)
・メインルーチンで割込みが受け付け可能になった所で(普通は
初期化が終わった後)、INTCONレジスタの「GIEビット」を
イネーブルにする。
・そして肝心なことは、シミュレートする時には、プログラムが「RUN]
中でないとだめだということです。つまりブレークなどで途中停止
させている間は割込みは入りません。
3.ウォッチドッグタイマ
ウォッチドッグタイマのシミュレーションもきちんと対応されています。
まずウォッチドッグタイマをする/しないを設定します。
これには、Options → Processor Setup → Hardware を実行すると
下図の設定画面が開きます。ここでWDT Reset Enableを指定すれば、
命令のクロックをベースに時間がシミュレートされタイムアウトすると
リセットが発生しCPUが再スタートします。