MPLAB X のシミュレータを動かして見る(基本編)

〔デバッグ編〕 〔刺激編〕 〔UART編〕 〔MPLAB X の使い方に戻る〕


シミュレータはPICにプログラムを書き込んで動作確認をしなくても、
PIC無しでパソコンのMPLAB X IDE上でPICの動作をシミュレーションさせる事が出来ます、
なので作成したプログラムをPICに書き込む事無くデバッグが可能となります。
って事は、予めある程度IDE上で机上デバッグを行い、PICに書き込んで確認を行えば、
動作確認の為に何度も書き込んでは確認を繰り返す事も無くなるのでは無いでしょうか?
尚、ここではPIC12F1822を使ったシミュレーション内容です。

《シミュレータのサンプルプログラム1》

シミュレータ起動3
 左がサンプルの参考回路です、12F675となっていますが12F1822ですよ。

 サンプル回路は、
 スイッチは3番(RA4)に接続し内部プルアップ有りです。
 LEDは5番(RA2)に接続し、スイッチが押された時だけ点灯する回路です。


 下記がサンプルプログラムです。(実際に動作します)
 MPLAB(R) XC8 C Compiler Version 1.40コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼付けて下さい。

この回路とプログラムはこちらの「スイッチの入/切でLEDを点灯させます」 からの物を若干アレンジしました。

--------------------------------------------------------------------- *3)
// シミュレータ機能のテスト1(デジタル入出力)
#include <xc.h>

#define _XTAL_FREQ 8000000    //  delay用に必要(クロック8MHzを指定)

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config CPD      = OFF      // データメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO     = OFF      // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)

// コンフィギュレーション2の設定
#pragma config WRT    = OFF        // Flashメモリーを保護しない(OFF)
#pragma config PLLEN  = ON         // 動作クロックを32MHzでは動作させる(ON)
#pragma config STVREN = ON         // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV   = HI         // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP    = OFF        // 低電圧プログラミング機能使用しない(OFF)

/*******************************************************************************
*  メインの処理                                                                *
*******************************************************************************/
void main()
{
     int i , x ;

     OSCCON     = 0b01110010 ; // 内部クロックは8MHzとする
     OPTION_REG = 0b00000000 ; // デジタルI/Oに内部プルアップ抵抗を使用する
     ANSELA     = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISA      = 0b00011000 ; // RA4だけ入力その他のピンは出力に割当てる(RA3は入力専用)
     WPUA       = 0b00010000 ; // RA4は内部プルアップ抵抗を指定する
     PORTA      = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)

     i = 0 ;

     while(1) {
          if (RA4 == 0) {      // 3番ピンのスイッチが押されたか?
               i = i + 1 ;
               RA2 = 1 ;       // 5番ピンにHIGHを出力する(LED ON)
          } else {
               RA2 = 0 ;       // 5番ピンにLOWを出力する(LED OFF)
          }
          x = i ;
    }
}
---------------------------------------------------------------------

《シミュレータの起動》

@IDEメニューバーの「File」 → 「Project Properties (xxxx)」をマウスで順番にクリックします。
 または、「Dashboard」パネルのこのプロジェクトプロパティのアイコンアイコンをクリックします。

シミュレータ起動1
Hardware Tool:」のパネル内で、"PICkit3"とかが選択されています、
これを"Simulator"を選択して[OK]ボタンをクリックします。
尚、シミュレータ操作が終了したら必ず"PICkit3"とかに切り替えて下さい。
また、"Simulator"文字左側で印ですが、
これは一応周辺モジュール関連もシミュレート出来るがベータ版サポートらしい。


A再び「Project Properties」の画面を開きます。

シミュレータ起動2
Categories:」のパネル内で"Simulator"を選択します。
右のパネルの「Option categories:」は"Oscillator Options"になっていると思います、
"RC Oscillator frequency"にPICのシステムクロック(今回は8MHz)を設定します、
"Instruction frequency(Fcys)"にPICのサイクルクロック(8MHz/4)を設定します。
設定したら[OK]ボタンをクリックします。


シミュレータ起動3a  Bとりあえずシミュレータを起動させましょう。
   左画面の赤枠をクリックします。

シミュレータ起動3b
 Cシミュレータが起動したら左画面の赤枠内ボタンが表示されます。
 D次に、ここは一旦シミュレータを終了させて下さい。

《ブレークポイント》

ブレークポイントはプログラムソース内の行に複数設置出来ます、
プログラムをシミュレーション起動させその行にプログラムの実行が来れば、
その行で一旦プログラム実行が一時停止を行います。
これにより変数の内容確認や記述通りのプログラム実行が出来ているのかを確認出来ます。

シミュレータ起動4
@図の赤丸の行番号39をマウスでクリックします。
すると図の様に39行目が赤く反転します、これがブレークポイントの設置です。
再び39の所をクリックするとブレークポイントは消えます。

Aシミュレータを起動させて見ましょう。
シミュレータ起動5a   プログラムが実行され、左図の様になります、
  これはこの行で一旦プログラムの実行が停止している状態
  です、38行目までは実行されています。

一時停止したプログラムを再開させるには[Continue(下図)]ボタン(又はF5キー)を使います。

《ステップ実行》

ステップ実行はプログラムを1行ずつ実行させる事が出来ます。

シミュレータ起動3c  [Reset]ボタン:
  プログラムを最初から実行させます。
 [Continue]ボタン(又はF5キー):
  プログラムを再開します、再びブレークポイントが有ればそこで停止。

[Step Over]ボタン(又はF8キー):関数の行は飛ばして次の行で停止。(関数の中は実行されます)

シミュレータ起動3d  [Step Into]ボタン(又はF7キー):プログラムを1行ずつ実行させます。 *1)


シミュレータ起動5b B今、39行目で一時停止していますね、
  [Step Into]ボタンを数回クリックして見て下さい、
  プログラムが1行ずつ実行され再び42行に戻って来る事が
  確認出来たと思います。


シミュレータ起動5c Cマウスカーソルを変数 の上に移動させ
  そのまましばらくすると変数の現在の内容を
  表示します。 レジスター等も表示します。

但し、RA2/RA4はPORTAの内容を表示するみたいですね、ビット表示では無い。
もし、表示されない場合は変数をクリックして見ましょう!

"MPLAB X V3.50"では、RA2/RA4にカーソルを乗せて表示される内容は0しか表示されないので
  下記の[Variables]ウインドウ画面で"PORTA"を表示させれば、読書きはOKです。
 *3)

《変数内容の確認と設定》

上の方法でも変数を表示可能ですが、今度は[Variables]ウインドウ画面を使って見ましょう。
(IDEのメニューバー「Window」→「Debugging」→「Variables」と順番にクリックで画面が追加されます)

シミュレータ起動6
DIDE画面の右側下の方に有るウインドウパネルの[Variables]タブをクリックします。
[Step over]ボタンをクリックしてステップ実行を行ってみて下さい、
上の画面に変数の内容が表示されると思います。

変数の表示型式を替える場合

シミュレータ起動7a
 例えば"PORTA"とするなら
 PORTAを右クリックします。
 左図の様に
 [Display Value Column AS]
 → [Binary] と順番に
 クリックします。

下図の様に16進数から2進数の表示に替わります。

シミュレータ起動7b


表示する変数の追加を行う場合

シミュレータ起動8  左図の@〜Bの順番に操作します。

 @[Create new watch]ボタンをクリック
   します。
 ANwe Watch」ウインドウで追加したい
   変数名を入力する。
 B[OK]ボタンをクリックします。

 "SFR'S"をチェックすれば
 レジスター(PORTA等)を表示し選択も
 出来ます。

 追加した変数は表示されたままとなります。

シミュレータ起動8a
PORTAを表示させるとRA2/RA4等のビット表示も展開可能です。 *3)



変数に値を設定する場合

シミュレータ起動9
設定を行いたい変数の[Value]列の数値をマウスでクリックすれば設定が出来ます。
例では"x"変数に値を設定しています。
100 とか入力した場合は、表示型式が16進数なので0x0064と表示されます。
(もちろん、プログラム中で値が代入されればその値に替わりますよ)



ウインドウ画面を切り離す場合

ウインドウパネルの[Variables]を切り離して置くと常に表示された状態になり、何かと見易くなります。

シミュレータ起動10a  [Variables]タブで右クリック
 [Undock Window]をクリック
 画面が切り離されます。

 下図の様な感じになります、
 後は好きな場所に移動させます。

シミュレータ起動11


シミュレータ起動10b
 元に戻す場合は、[Variables]タブで右クリックします。
 [Dock Window]をクリックすれば元の場所に戻ります。


《スイッチの入力をシミュレートする》

通常は回路でスイッチが接続されていますが、シミュレータの場合は接続されていないので
その代りを行わないとダメです、その代りを行う機能として[stimulus]ウインドウ画面を利用します。

通常回路はスイッチはRA4に接続され内部プルアップなので、スイッチが押されていない時High(1)で、
押されたらLow(0)となりますが、シミュレータの場合はこのままではRA4は0のままです。

"MPLAB X V3.50"では、プログラムでWPUAレジスタにてプルアップを記述するとそのピンは"1"と
  設定されたままになります。
 *3)

なのでステップ動作を行ってもソースプログラムの46行は実行されないままですね。
46行を実行させるにはRA4を1にしますが、上記の方法で変数を変更しても良いのですが、
ここは[stimulus]ウインドウで行って見ます。

※ "MPLAB X V3.50"では、WPUAでプルアップしているのでRA4=1状態ですのでこの場合は
  46行目のみしか実行されません、43/44行目を実行させるにはRA4を0にします。 *3)

シミュレータ起動12
 @IDEのメニューバー「Window」→「Simulator」→
   「Stimulus」と順番にクリックします。

 下記の様に「Stimulus」画面が表示されます。
 [Asynchronous]タブをクリックします。

 シミュレータ起動14a A点をクリックし"RA4"を選択

 シミュレータ起動14b B点をクリックし"Toggle"を選択

シミュレータ起動13

シミュレータ起動14c
 こんな感じに設定します。


Actionの種類
[Set High]    :操作を行うとRA4がHigh(1)にセットされたままとなります。
[Set Low]    :操作を行うとRA4がLow(1)にセットされたままとなります。
[Toggle]       :操作を行う度にHighとLowが交互にセットされます。
[Pulse High]  :操作を行うと指定の長さだけHighとなります。
[Pulse Low]  :操作を行うと指定の長さだけLowとなります。

シミュレータ起動14d
 "Pulse High/Low"を選択した場合はパルスの長さを指定します。
 「Width(Value)」に長さの数値を入力します。
 「Units」に数値の単位を選択します。
 "Cyc"はサイクルで"システムクロック/4"、今回は8MHz/4です。
 (1 Cyc は 500ns)


シミュレータ起動15
 Aでは、動作をさせてみましょう。
   左の様にプログラムの41行目でステップ動作停止
   行って置きます。

RA4の変数を確認して下さい。RA=0x04だと思います。
"0b00000100"これは右からRA0/1/2/3/4/5の順での表示なのでRA2=1/RA4=0となります。
(PORTAで確認して下さい)

シミュレータ起動14e   B41行目で停止していますね、
    (現在はRA4=0と仮定した動作です)
    次に左赤枠内の⇒ボタンをクリックします。

このボタンを押した時にRA4=1(4bit目)になるのではなく、
ステップ動作を1行実行した後にRA4=1にセットされる事に注意が必要です。
(だから42行目で止めて操作しても遅いと言う事ですよ!)

シミュレータ起動16
  Cステップ動作を行って見て下さい。
    左の様に46行目が実行されると思います。

  再び41行目で実行を止めてRA4を確認して見て下さい、
  RA4=0x14でRA4がON(4bit目)したままです、
  (PORTAで確認して下さい)

ここでAから再度繰り返せばこんどはRA4=0となります、これが"Toggle"動作です。

《Stopwatch》  *2)

この機能を使うとプログラムの実行速度や、ステップ実行サイクル数のカウントを行う事が出来ます。

@IDEのメニューバー「Window」→「Debugging」→「Stopwatch」と順番にクリックします。
  画面右下側のパネルに下図の様に追加表示されます。

シミュレータ起動17

この画面の(A)(B)までのサイクル数のカウントを行う場合での例です。

A(A)(B)の場所にブレークポイントを設置し、シミュレータを起動させます。

B起動したら(A)の場所で停止し、[Stopwatch]画面に起動時からこの場所までの時間が表示
  されます。

C次に[Continue]ボタンをクリックし、(B)の場所まで進めます。
  [Stopwatch]画面に(A)(B)までの実行時間(ステップサイクル数:1000553)が表示されます。

《周辺機器のシミュレートがサポートされているのか確認》  *4)

シミュレータ起動18
 [Dashboard]画面内の「Debug Tool」項の部分で、
 "Click for Simulated Peripherals"の所をクリックすれば、
 シミュレート可能な周辺機器一覧が表示されます。
 なのでぇ、表示されない周辺機器はシミュレーション出来ない
 という事になります。


《その他》

プログラムの修正は一旦シミュレータを終了させてから変更しないとはんえいされません。

スイッチやLEDや可変抵抗などのブロックボタンが有りそれを操作するとシミュレータにデータをセット
する様な事が出来ないのかな?、その方がもっとシミュレーションし易いと思うのだけれどもね....

次ページでは、”刺激編”と言う事で、もう少し[stimulus]の使い方を突っ込んで見ようかなと思います。



一部追記(*4) 2018/06/06
"MPLAB X V3.50"での注意事項の追記(*3) 2016/12/26
追記(*2) 2015/02/15
追記&変更(*1) 2015/02/04


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.