〔基本編〕 〔UART編〕 〔MPLAB X の使い方に戻る〕

--------------------------------------------------------------------- *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
}
}
---------------------------------------------------------------------



をクリックします。
のアイコンをクリックしシミュレータを起動します

D 31行目で一時停止したら"temp"変数に数値を設定します。
[Variables]ウインドウで図の様にとりあえず200でも設定して下さい。
実際は、10KΩの可変抵抗で約60〜530程の値が読み込まれると思います。
のアイコンをクリックしてプログラムを再開させます。

F画面右下側のパネル[Logic Analyzer]タブをクリックします。
グラフの横軸はサイクルクロック(Cyc=8MHz/4)です、1Cycは500nsですね。
グラフの1周期は2000Cyc(34000-32000)をカウントしています、
プログラムではPWM1の周期が1000Hzなので
2000Cyc x 500ns = 1000000ns(1ms) 1KHzの1サイクル(1ms)=1000ms/1000Hz
メモ帳等で下記の様に16進数(HEX:0xは要らない)で書き込みます。(----は書かない数字のみ、念の為) --------------------------------------------------------------------- 32 64 96 C8 FF --------------------------------------------------------------------- 作成したらプロジェクトフォルダに保存します、ここでは"ad_data.txt"としました。※

上画面の様に設定したら[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 |
このアイコン[Attach SCL file]ボタンをクリックします。
このアイコン[Detach SCL file]ボタンは動作終了です。
のアイコンを
---------------------------------------------------------------------
//
// 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;
---------------------------------------------------------------------
上記の場所をコメントにしたら上書き保存します。
アイコンをクリックします。

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

「Use MPLAB 8 Style Stimulus/SCL for ADCxBUF0」 □ にチェックを入れます。
チェックを入れたら[OK]ボタンをクリックします。
なんかぁ、MPLAB V8 のスタイルで動作させるみたいぁ、
X では動作しないのかいと突っ込みをいれたくなりますがぁ......

このアイコン[Remove a row]ボタンを

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。

このアイコン[Add a row]ボタンをクリックすれば次の行にも入力できます。
このアイコン[Attach SCL file]ボタンをクリックします。
このアイコン[Pause]ボタンをクリックし一時停止させます。
このアイコン[Remove a row]ボタンを

上画面の様に設定したら[Generate SCL file]ボタンをクリックし名前を付けて保存します。

このアイコン[Add a row]ボタンをクリックすれば次の行にも入力できます。
このアイコン[Attach SCL file]ボタンをクリックします。
このアイコン[Pause]ボタンをクリックし一時停止させます。
このアイコン[Remove a row]ボタンを

上画面の様に設定したら[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 |
このアイコン[Attach SCL file]ボタンをクリックします。
このアイコン[Pause]ボタンをクリックし一時停止させます。
また、[Generate SCL file]ボタンで保存したファイルは変更できません、作り直しです。
"MPLAB X V3.50"での注意事項の追記(*1) 2016/12/27
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.