MPLAB X のシミュレータを動かして見る(刺激編)
〔基本編〕
〔UART編〕
〔MPLAB X の使い方に戻る〕
前頁の〔基本編〕ではシミュレータの基本操作を書きました、
なので、ここでは基本操作の事は省いて書きますので基本操作は前の頁を見て下さい。
この頁では〔刺激編〕と題して[stimulus:スティミュラス=刺激]機能をもう少し詳しく書こうと思います。
[stimulus]機能を使いこなす事がシミュレータ操作の要の様な気がします。
尚、前頁ではPIC12F1822を使いましたが、以下のシミュレーションが上手く行かずPIC12F1501を
使いました。
( 最新の"MPLAB X V3.50"等では上手く動作するかもですが実験していません *1) )
《シミュレータのサンプルプログラム2》

左がサンプルの参考回路です、12F675となっていますが12F1501ですよ。
サンプル回路は、
可変抵抗は3番AN3(RA4)に接続しアナログ入力です。
LEDは5番PWM1(RA2)に接続し、PWM出力です。
可変抵抗のアナログ値でLEDの明るさを可変する回路です。
下記がサンプルプログラムです。(実際に動作します)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
プロジェクトを作成して新規ファイルにコピーペーストして貼付けて下さい。
この回路とプログラムはこちらの
「可変抵抗のツマミを回してLEDの明るさを可変します」
からの物を若干アレンジしました。
--------------------------------------------------------------------- *1)
// シミュレータ機能のテスト2(アナログ入出力)
#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 BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
// コンフィギュレーション2の設定
#pragma config LPBOR = OFF // 低消費電力ブラウンアウトリセット(OFF)
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
// アナログ値の入力処理
unsigned int adconv()
{
unsigned int temp;
GO_nDONE = 1 ; // PICにアナログ値読取り開始を指示
while(GO_nDONE) ; // PICが読取り完了するまで待つ
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です
return temp ;
}
// メインの処理
void main()
{
unsigned int num ;
OSCCON = 0b01110000 ; // 内部クロックは8MHzとする
ANSELA = 0b00010000 ; // アナログはAN3を使用し、残りをすべてデジタルI/Oに割当
TRISA = 0b00010000 ; // AN3(RA4)だけ入力その他のピンは出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// A/Dの設定
ADCON1 = 0b10010000 ; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスに
ADCON0 = 0b00001101 ; // アナログ変換情報設定(AN3から読込む)
__delay_us(5) ; // アナログ変換情報が設定されるまでとりあえず待つ
// PWM1の設定
PWM1CON = 0b11000000 ; // PWM1機能を使用する(output is active-high)
PWM1DCH = 0 ; // デューティ値は0で初期化
PWM1DCL = 0 ;
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 124 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
while(1) {
num = adconv() ; // 3番ピン(AN3)から半固定抵抗の値を読み込む
PWM1DCH = num/4 ; // アナログ値からのデータでデューティ値を設定
__delay_ms(10) ; // この行はシミュレーション用で入れている、実際は無くてもOK
}
}
---------------------------------------------------------------------
《シミュレーション2》

PWM1の出力を[Analyzer]で波形表示させて見ます。
@IDEメニューバーの「Windows」→「Simulator」→
「Analyzer」を順番にクリックします。
画面右下側のパネルに下図の様に表示されます。


A上図からこのアイコン
をクリックします。
左の選択画面が表示されます。
今回はPWM1から出力するので、
Aの場所で"PWM1"を選びます。
Bのボタンをクリックします。
Cの場所に"PWM1"が表示されます。
Dの[OK]ボタンをクリックすれば完了です。
他のピンを見たければ同様に操作します。
Cで"PWM1"を選択しBの[←]ボタンを
クリックすれば"PWM1"を消す事が出来ます。

Bプログラムの31行目にブレークポイントを設置します
C
のアイコンをクリックしシミュレータを起動します
起動すると、左の様に31行目でプログラムが一時停止
するはずです。

D 31行目で一時停止したら"temp"変数に数値を設定します。
[Variables]ウインドウで図の様にとりあえず200でも設定して下さい。
実際は、10KΩの可変抵抗で約60〜530程の値が読み込まれると思います。
E
のアイコンをクリックしてプログラムを再開させます。
再開後、再び31行目のブレークポイントでプログラムが一時停止を行うでしょう。
波形がLOWのままの時は、シミュレーションを1,2秒程動作させれば良いと思います。
(1サイクル以内でプログラムが動作し、一時停止する場合は波形は作成されない)

F画面右下側のパネル[Logic Analyzer]タブをクリックします。
グラフの横軸はサイクルクロック(Cyc=8MHz/4)です、1Cycは500nsですね。
グラフの1周期は2000Cyc(34000-32000)をカウントしています、
プログラムではPWM1の周期が1000Hzなので
2000Cyc x 500ns = 1000000ns(1ms) 1KHzの1サイクル(1ms)=1000ms/1000Hz
G変数"temp"に数値を色々設定して動かして見て下さい、PWMのデューティー比が変わる事が
観測できるでしょう。
[Logic Analyzer]画面は、プログラムを一時停止状態にしないと表示更新は行わない所に注意
《Register Injection》
この機能はレジスタに模擬データを設定する機能です。
プログラムでレジスタ値が参照される度にデータファイルの値が読み込まれ設定されます。
上記の記事では、変数"temp"に数値を色々設定して動作させましたが、
[stimulus]の[Register Injection]機能を使用するともう少しスマートにA/D変換模擬入力が出来ます、
その方法を書いて置きます。
但し、この方法でMPLAB IDE V8.84では動作しましたが、MPLAB X v2.15では動作しませんでした、
"SCL file"を読み出して"Attach"するとエラーが出る、不具合かもね。
(PS.後日色々さわって動作するようにはなったので下に記述して置きます)
"MPLAB X V3.50"では修正され動作する様になりました。 *1)
@A/D変換模擬入力用のデータファイルを作成する
A/Dは10ビットの分解能でADRESH/ADRESLレジスターに読み込まれますよね、
ここではADRESLにデータをセットするファイルを作成します、
なので 0〜255までの数値しかセット出来ません。
メモ帳等で下記の様に16進数(HEX:0xは要らない)で書き込みます。(----は書かない数字のみ、念の為)
---------------------------------------------------------------------
32
64
96
C8
FF
---------------------------------------------------------------------
作成したらプロジェクトフォルダに保存します、ここでは"ad_data.txt"としました。
※ちなみに、"HELP"にはADRESH/ADRESLレジスター両方にデータがセットされるみたいなぁ事が
書いて有るのでぇデータファイルを"012C"とか記述したのですがぁ、
ADRESHは0x00(0x01を期待したが)のまま、ADRESLは0x2Cがセットされただけでした。
下記記事の"Periph:ADC1"を設定すれば"MPLAB X"でもADRESH/ADRESLに設定出来ます。 *1)
AIDEメニューバーの「Windows」→「Simulator」→ 「stimulus」を順番にクリックします。
起動しているなら[stimulus]画面の[Register Injection]タブをクリックします。

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。
ADRESHは設定しなくてもファイルに"012C"とか書けばOKです。
Label |
英字からはじまる英数字で任意にラベル名を設定します。 |
Reg/Var |
空欄をクリックするとメニューが表示されます、レジスター名を選択します。 |
Trigger |
データをセットする時のタイミングを指定します。
Demand:レジスターが読込まれる度にデータファイルから順番にセットされます。
PC= :指定したプログラムの場所(PC Value値)に来た時にデータをセット。
Message:USARTをシミュレートする時に使用します。
※但し MPLAB IDE V8.84 では"Demand"のみです。
※MPLAB X V3.50 では"PC= "は無いです。 *1) |
PC Value |
プログラムの行番号か関数名を入力します。(但し、上項目が"PC= "の時) |
Width |
"PC= "の時使用するみたいだが使い方不明? |
Data Filename |
クリックすると[開く]ウインドウが表示されるので、@のデータファイル名を 指定します。 |
Wap |
Yes:データファイルを最後まで読出すと、最初から繰り返してデータをセット。
No :繰り返さないで最後のデータを使い続けます。 |
Format |
ここの型式に応じてデータファイルの数値を書きます。
Decならば10進数で書く事が出来ます。 |
Comments |
適当に説明用のコメントを入力する、しなくてもOK |
B"SCL file"を作成(Generate)したら動作させます。
このアイコン[Attach SCL file]ボタンをクリックします。
"SCL file"を選択する画面が出るのでAで保存したファイル名を選び動作させます。
このアイコン[Detach SCL file]ボタンは動作終了です。
C後は、シミュレータを起動させ、1,2秒後にプログラムを一時停止させれば、
[Logic Analyzer]タブの画面で"PWM1"を表示させれば波形が表示されるでしょう。
31行目にブレークポイントを置いて[Logic Analyzer]画面を表示させ、
のアイコンを
操作すればアイコンを押す毎に波形が表示されるので解りやすいでしょう。
MPLAB X でも動作したがぁ.....(MPLAB Xでは以下の操作を行います)
@まず、"SCL file"を変更します。(通常はこんな直接ファイルを変更する操作は行いません)
上記Aで作成されたファイルを[メモ帳]あたりで開きます。
---------------------------------------------------------------------
//
// C:\Users\user\Documents\Electrical circuit\PIC\12F1501\12F1501_Test.X\ADRESL.scl
// Generated by Stimulus MPLAB X
// Wed Jul 16 14:35:05 JST 2014
//
configuration for "pic12f1501" is
// shared variable ADRESL; ← この行をコメントにする。
end configuration;
testbench for "pic12f1501" is
begin
// Register Injection
process is
begin
accessin("C:\Users\user\Documents\Electrical circuit\PIC\12F1501\12F1501_Test.X\ad_data.txt", hex_mode, ADRESL, true);
wait;
end process;
end testbench;
---------------------------------------------------------------------
上記の場所をコメントにしたら上書き保存します。
"MPLAB X V3.50"では上記ファイルが修正されたので@の操作は必要ありません、
最新版を使いましょう。 *1)
AIDEメニューバーの「File」 → 「Project Properties (xxxx)」をマウスで順番にクリックします。
または、「Dashboard」パネルのこの
アイコンをクリックします。

「Categories:」のパネル内で"Simulator"を選択します。
右のパネルの「Option categories:」で"Periph:ADC1"を選択します。

「Use MPLAB 8 Style Stimulus/SCL for ADCxBUF0」 □ にチェックを入れます。
チェックを入れたら[OK]ボタンをクリックします。
なんかぁ、MPLAB V8 のスタイルで動作させるみたいぁ、
X では動作しないのかいと突っ込みをいれたくなりますがぁ......
BこれでMPLAB Xでも動作する様になります。
また、ADRESH/ADRESLレジスター両方にデータがセットされる様にもなります、
データファイルを"012C"とか書ば、ADRESH=0x01でADRESL=0x2Cとなります。
《Pin/Register Actions》
この機能でピンに入力されるデータパターンを模擬出来るでしょう。
ピンやレジスタに経過時間のタイミングでデータを設定します。
ピンから規則的なパルスパターン(10KHz等)を模擬する場合は下記の[Clock Stimulus]機能が
良いでしょう。
今度は、A/D変換模擬入力を[stimulus]の[Pin/Register Actions]機能を使って行って見たいと
思います。(ここの記事はピンではなくレジスタを使います)
@ソースファイルの準備
1. ブレークポイントを全部外します。
2. 下図の様に26/27行目をコメント行にします。
これはBからの操作でADRESH/ADRESLレジスターにデータをセットしても、
26/27行のプログラムでADRESH/ADRESLに0をセットしてしまうのでコメントにします。

A上記の[Register Injection]タブで設定した内容は、
このアイコン[Remove a row]ボタンを
クリックして削除して置きましょう。
[Register Injection]タブと[Pin/Register Actions]タブの設定が有ると両方が起動される為です。
BIDEメニューバーの「Windows」→「Simulator」→「stimulus」を順番にクリックします。
起動しているなら[stimulus]画面の[Pin/Register Actions]タブをクリックします。

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。
※ ソースプログラムはAN3が可変抵抗の値を読むので、ADRESH/ADRESLでなくAN3にデータを
セットする様に記述を行って見たがAN3はビット(0/1)しか設定出来なく上手く行きませんでした。
RA3とかならともかくAN3なら数値を入力出来る様にして欲しいぞぉ。
1. 「Time Units」の項で、データのセットを実行するタイミングの時間単位を選択(ms)します。
2. 「Click here to add/remove signals」の文字をクリックし、下画面を表示させます。

まず、Aの場所で"ADRESH"を選び、Bのボタンをクリック、Cの場所に"ADRESH"が表示される。
次に、Aの場所で"ADRESL"を選び、Bのボタンをクリック、Cの場所に"ADRESL"が表示される。
そして、Dの[OK]ボタンをクリックすれば完了です。
3. まず1行目を作成します。
Time: プログラム開始からのデータをセットする実行時間を入力します。
尚、今回の設定で100ms間隔でデータがセットされます。
ADRESH/ADRESL:セットするデータ値を16進数で入力します、0x00〜0xffの範囲です。
(A/D変換は10ビットの分解能なので0〜1023の範囲が良いでしょう)
4.
このアイコン[Add a row]ボタンをクリックすれば次の行にも入力できます。
5. 100/200/300と3行実行が終了した後に繰り返したい場合は以下の設定も行います。
・ 「Repeat from action」の項で、□にチェックをいれます。
・ 右のプルダウンでどの位置から繰り返すかを選びます、"100"で最初の行から繰り返す。
・ 「Wait between repeats」の項で、ここの設定数値(例は"100"ms)だけ待ってから繰り返します。
C"SCL file"を作成(Generate)したら動作させます。
このアイコン[Attach SCL file]ボタンをクリックします。
"SCL file"を選択する画面が出るのでBで保存したファイル名を選び動作させます。
D後は、シミュレータを起動させます、今じゃんじゃん動作中です。
適当な所(2秒程)で
このアイコン[Pause]ボタンをクリックし一時停止させます。
[Variables]で"PWM1DCH"の内容を表示させたり、
[Logic Analyzer]タブの画面で"PWM1"を表示させれば波形が表示されるでしょう。
《Advanced Pin/Register》
次のは、A/D変換模擬入力を[stimulus]の[Advanced Pin/Register]機能を使って行って見ます。
上記の[Pin/Register Actions]機能は時間のタイミングによるシミュレートでしたが、
これは実行のタイミングをレジスターやピンにデータがセットされた時で行われます。

@ 26/27行目をコメントにしていた場合は
外します。
ブレークポイントも全部外します。
26-27行目にかけて、"GO_nDONE=0"がPIC内部で行われます。
なので、このタイミングで ADRESH/ADRESL にシミュレーションのデータ(0x12c)をセットする様に
設定を行って見ます。
A上記の[Pin/Register Actions]タブで設定した内容は、
このアイコン[Remove a row]ボタンを
クリックして削除して置きましょう。
BIDEメニューバーの「Windows」→「Simulator」→「stimulus」を順番にクリックします。
起動しているなら[stimulus]画面の[Advanced Pin/Register]タブをクリックします。

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。
1. 先に下側の[Define Conditions]を設定します、"GO_nDONE=0"が起動条件ですね。
condition name:条件の定義に対するラベル名です、自動的に割り振られます。
When: Whenの空欄をクリックすると SFR/Bit/Pin の中から選択します。
因みに今回は、GO_nDONEはビット(0/1)なので"Bit"です。
また、"SFR"を選択すれば"TMR2 > 0x30"等と条件付け可能です。
When Changed:空欄をクリックするとレジスタのビット名が表示されるので選択します。
今回は"ADCON0.GO_nDONE = 0"を選んでいます。
Wait: "GO_nDONE=0"が成立してから何秒後にアクションを起こすか待ち時間を設定。
Comments: 適当に説明用のコメントを入力する、しなくてもOK
2. 次に上側の[Define Triggers]を設定します。
「Click here to add/remove signals」の文字をクリックし、下画面を表示させます。

まず、Aの場所で"ADRESH"を選び、Bのボタンをクリック、Cの場所に"ADRESH"が表示される。
次に、Aの場所で"ADRESL"を選び、Bのボタンをクリック、Cの場所に"ADRESL"が表示される。
そして、Dの[OK]ボタンをクリックすれば完了です。
3. [Define Triggers]の各項目を設定します。
Enable: アクションが起きた時にチェックが有れば実行されます。
Condition: 使用する条件定義のラベル名(condition name)を選びます。
Type: "1x"は最初のアクション時のみ実行、"Cont"はアクションの度に実行されます。
Re-Arm Delay:次に再度実行させるまでの待ち時間を設定します。
この待ち時間の間はアクションが起きても実行されません。
ADRESH/L: セットするデータ値を16進数で入力します、0x00〜0xffの範囲です。
※例えば"COND1"で複数行入力した場合は、アクションが起これば複数行全部実行されます。
4.
このアイコン[Add a row]ボタンをクリックすれば次の行にも入力できます。
次の行が出来たら、「When」の項目を入力すれば"COND2"が入力できます。
C"SCL file"を作成(Generate)したら動作させます。
このアイコン[Attach SCL file]ボタンをクリックします。
"SCL file"を選択する画面が出るのでBで保存したファイル名を選び動作させます。
D後は、シミュレータを起動させます、今じゃんじゃん動作中です。
適当な所(2秒程)で
このアイコン[Pause]ボタンをクリックし一時停止させます。
[Variables]で"PWM1DCH"の内容を表示させたり、
[Logic Analyzer]タブの画面で"PWM1"を表示させれば波形が表示されるでしょう。
《Clock Stimulus》
この機能は指定したピンから規則的な波形(パルス)を発生させられます。
ここではRA0ピンから10KHzの信号を作成して見ます。
(尚、信号を発生させてもソースプログラムでは利用はしていません、悪しからずでぅ)
@ソースファイルの準備
1. ブレークポイントを全部外します。
2. 下図の様に"RA0"を入力にします。
今回"RA0"ピンからパルスを入力するので"TRISA"でピンを入力設定にしないとダメです。

A[stimulus]画面の他のタブで設定した内容は、
このアイコン[Remove a row]ボタンを
クリックして全部削除して置きましょう。
BIDEメニューバーの「Windows」→「Simulator」→「stimulus」を順番にクリックします。
起動しているなら[stimulus]画面の[Clock Stimulus]タブをクリックします。

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。
複数行作成すれば行ごとに異なる周波数を発生させたり出来るでしょう。
Label |
英字からはじまる英数字で任意にラベル名を設定します。 |
Pin |
信号を入力するピンを一覧から選択します。 |
Initial |
パルスの初期はLow又はHighから始めるのかを指定します。 |
Low Cycles |
Lowの出力時間をサイクルクロック(Cyc=8MHz/4)で指定します。1Cycは500ns |
High Cycles |
Highの出力時間をサイクルクロックで指定します。
今回は10KHzなら1周期は1000000000ns/10000Hz=100000ns
100000ns/500ns(1Cyc)=200Cyc(Low=100Cyc High=100Cyc) |
Begin |
パルスの発生開始を行う条件を指定します、デフォルトは"AT Start"です。

「AT Start」プログラムの開始から出力します。
「PC=」 指定したプログラムの場所(関数等)に来た時に動作します。
「Cycle」 出力開始の時間をサイクルクロックで指定します。
"absolute time"プログラム開始からの絶対時間
"after last clock"前回終了した時間からの相対時間
「Pin」 指定したピンが変化(0か1)した時に動作します。
|
End |
パルスの発生終了を行う条件を指定します、デフォルトは"Never"です。
「Never」ずっと出力を続けます、永遠にパソコンが壊れるまで電気が有る限り...。
「Cycle」 出力終了の時間をサイクルクロックで指定します。
"absolute time"プログラム開始からの絶対時間
"from clock start"出力を開始した時間からの相対時間
|
Comments |
適当に説明用のコメントを入力する、しなくてもOK |
C"SCL file"を作成(Generate)したら動作させます。
このアイコン[Attach SCL file]ボタンをクリックします。
"SCL file"を選択する画面が出るのでBで保存したファイル名を選び動作させます。
D後は、シミュレータを起動させます、今じゃんじゃんもぉ激しく動作中です。
適当な所(2秒程)で
このアイコン[Pause]ボタンをクリックし一時停止させます。
[Logic Analyzer]タブの画面で"RA0"を表示させれば波形が下記の様に表示されるでしょう。

《その他》
[stimulus]画面の各タブに色々設定を行っていた場合で、
[Generate SCL file]ボタンで保存し、[Attach SCL file]ボタンで実行を行うと、
同じレジスターに他のタブでも設定した場合は出力がダブりますので注意が必要でしょう。
また、[Generate SCL file]ボタンで保存したファイルは変更できません、作り直しです。
ちょこちょこ変更して実行させたい場合は、左のボタンを操作して設定値を保存して置けば
後で編集出来ます。
あとぉ、ピンを選択する時で"RA0"とかはビットなので良いのですがぁ、
"AN0"とかもビット扱いになっているなぜだぁ数値を入力したいぞぉ...!
次ページで、”UART編”と言う事で、USARTのシミュレーションを行って見ようかなと思います。
"MPLAB X V3.50"での注意事項の追記(*1) 2016/12/27
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.