この記事でわかること
本記事は【温度センサーIC+PICマイコンの設計】-1 の続編です。
本編は、ソフト設計の解説です。
具体的な内容は、以下です。
- ソフト設計仕様決め
- ソフト設計の初期段階(プロジェクトフォルダー作成)からMCC機能を使ったモジュールのプログラム生成を具体的に説明します。
ソフト設計
PICマイコンのソフト開発用として、”MPLAB X IDE”支援ソフトがマイクロチップ・テクノロジー(Microchip Technology)社から無料で提供されています。
本記事で使用する ”MPLAB X IDE” は、バージョン6.05です。
”MPLAB X IDE”支援ソフトの詳細は、ここを参照。
仕様
仕様:
- システムクロックは、PICマイコン内の発振器:16MHzを選択
- 2ピンをアナログ入力AN0設定
- マイコン内蔵の10ビットA/D変換を使用
- Vref( 基準電圧 )は、マイコン内部の基準電圧を使用するため、FVRの設定が必要
- 10秒タイマーで時間管理、割り込み使用
(温度観測タイミングが、正確に10秒毎ではありません。) - 電圧値から温度を計算します。計算式の解説は、ここを参照
- 温度表示は、有りません。マイコン内で確認します。(温度表示は、別途記事予定です。)
上記、仕様を考慮して、ソフト設計をしました。
”MPLAB X IDE”の支援ソフトを使ったソフト設計
”MPLAB X IDE”支援ソフトは、ソフト設計に関する PICマイコンやC言語について詳細に理解していなくても、プログラム作成、ソフト上の検証、プログラムのコンパイル、マイコンへの書き込み、実機の検証ができます。
今回のソフト設計の作業フローチャート図を、下記に示します。
本記事では、青色枠の記事となります。

図1:ソフト設計の作業フローチャート
フローチャートの説明:
- Create Project name
全プログラムを格納するフォルダーの作成
”MPLAB X IDE”支援ソフトを開始する1歩目 - Using MCC function
”MPLAB X IDE”支援ソフトの中にあるMCC(MPLAB Code Configurator)機能を使用して、PICマイコン内蔵のモジュールを自動生成します。
本仕様では、下記を自動生成します。
・システムクロック
・A/D変換モジュール(割り込み無し)
・FVRモジュール(内蔵のVref使用の為)
・タイマー2モジュール(割り込み使用) - “Generate”を実行
上流フローで生成した各モジュールプログラムと”main.c”(自動生成)をまとめて、
1つのプログラムを生成します。 - Edit Specification
仕様に合わせて、プログラムの編集を直接行います。
・本仕様では、”main.c”と”timer2.c”プログラムが編集対象となります。
No error:編集中に問題ある記述の場合は、逐次エラーコメントが表示されるため、この工程でエラーが無くなれば、基本プログラムは動作します。 - ・Compile
PICマイコンに書き込むために、C言語プログラムをアドレッシングと命令16進数(Hex)
に置き換えます。
・”Debug Main Project” の実行
本ソフトシステム上(実機無し)で、プログラムの検証が出来ます。 - Write to PIC (Flash)
PICマイコンのフラッシュメモリーにプログラムを書き込みます。 - On-target debugging
実機を使い検証を行います。 - Judge
検証で、プログラム変更が有る場合は、Edit Specification で本記事では”main.c”か”timer2.c”の変更。又は
Using MCC functionにて、再プログラム生成します。
注意:Using MCC function工程のプログラム生成後にユーザーが、自動生成したプログラムを
直接編集した場合、プログラムが新しく再生成されるため、ユーザーが編集したプログラムは
残っていません。(必要に応じて、再編集が必要となります。)
以下、ソフト設計の作業フローチャートの青枠の工程を具体的に説明します。
”プロジェクト:TMPRTR_get” ディレクトリー を新規作成 (Create Project name)
具体的な作成方法は、”MPLAB X IDEを起動して、プログラムを作成”を参照。
(画面表示有り、プロジェクト名は、違います。)
要約として、下記参照。
“MPLAB X IDE”を起動
ウィンドウ 左上側の”File”→”New Project”を左側ボタンクリックで、下記、ウィンドウ表示
[Choose Project]
- [Categories]:”Microchip Embedded”を選択(デフォルト)
- [Projects]:”Standalone Project”を選択(デフォルト)
基本デフォルトのまま、”Next”左側ボタンクリック
[Select Device]
- [Family]:”All Families”を選択
- [Device]:”PIC16F1938″を選択。採用するPICマイコンの型式
- [Tool] :[Show All]に “レ” 点して、”PIC kit 4″を選択。
PICマイコンをPICkit-4経由してPC接続。
最新版は、”PICkit-5″が有ります。(2026.01.14現在)
“Next”左側ボタンクリック
[Select Header]
- “None”
“Next”左側ボタンクリック
[Select Compiler]
- XC8(v2.41):左側ボタンクリック
“Next”左側ボタンクリック
[Select Project Name and Folder]
- [Project Name]:”TMPRTR_get“(プロジェクト名)入力
- [Encoding]:”ISO-2022-JP”(コメントで日本語入力可)入力
“Finish”左側ボタンクリック
以上で、”プロジェクト:TMPRTR_get”が作成出来ます。
MCC機能を使用 (Using MCC function)
MCCのインストールは、ここを参照。
本機能を使い、下記、4つのプログラムを生成します。
- システムクロック
- ADCモジュール
- FVRモジュール
- タイマーモジュール
以下では、1~4のプログラム生成方法を具体的に説明します。
1.システムクロックの指定
システムクロックは、内部オシレータの16MHzを設定しました。
システムクロック16MHzの設定の詳細は、ここを参照。
2.ADCモジュールプログラム生成
ADCモジュールの設定:
PIC16F1938には、”Peripherals”として10ビットA/D変換モジュールを内蔵しているので、これを使います。
・アナログ入力ピン:2Pin(AN0)
・基準電圧Vref:
測定温度範囲:0℃~80℃からの温度センサーIC(LM61)Voutの出力範囲を考慮して
内部リフェレンス 2.048Vを使用のため、”FVR”を設定します。
Vref+電圧は、下記 表1の情報を元にして決めました。
”測定温度範囲”の”Voutアナログ電圧”範囲140mV(Max側)< Vref+ : 2048mV
固定電圧リファレンスを使用します。(FVRの設定が必要)
vref-:0 設定
10ビットA/D変換の分解能は、2mVとなります。
表1:Vrefの決定
| 測定温度範囲 | 0℃~80℃ |
| Voutアナログ電圧 | 60mV~140mV |
| 基準電圧:Vref | 2048mV |
| 分解能(LSB) | 2048mV/210(A/D10ビット)=2mV |
・変換クロックを設定 (下の表11-1参照)

A/D変換の変換時間:
TAD=2.0usに設定、10ビット全体の変換には”11.5×TAD”の時間:23us
マイコロチップ社製:PIC16F1938のデータシートから引用
MCC機能を使い、ADCモジュールプログラム生成
①:”Peripherals”を左側ボタンダブルクリック
②:”ADC”の”+”を左側ボタンクリック

図2:ADCモジュール プログラム生成1
③:”ADC”が[Project Resources]側に追加されます。

図3:ADCモジュール プログラム生成2
上記(”ADCモジュールの設定”)で決めたADCモジュール設定値を、下記のGUIの表示に沿って入力します。
④:[Enable ADC] “レ” 点、[Clock Source]は、”FOSC/32″を選択。
TAD=2.0us, [Conversion Time] 23.0us (表11-1・-2と同じとします。)
[Result Alignment]は、”right”を選択。デジタルデータの格納位置を右詰め指定
[Positive Reference]は、”FVR”を選択。FVRモジュールを使い、内部リフェレンス 2.048V設定を行います。下記の”MCC機能を使い、FVRモジュールプログラム生成“を参照。
[Negative Reference]は、”VSS”選択。=0V。( Vref- )
⑤:アナログ入力ピンを2Pinに指定、左側ボタンクリック。

図4:ADCモジュール プログラム生成3
3.FVRモジュールのプログラム生成
内部リフェレンス 2.048Vを使用するため、”FVR”を設定します。
MCC機能を使い、FVRモジュールプログラム生成
⑥:”Peripherals”を左側ボタンダブルクリック
[FVR]を左側ボタンクリック

図5:FVRモジュール プログラム生成1
⑦:[FVR]の”+”を左側ボタンクリック
”FVR”が[Project Resources]側に追加されます。

図6:FVRモジュール プログラム生成2
⑧:[Enable FVR] “レ” 点、[FVR_buffer1 Gain] “2x” (2.048V)を選択

図7:FVRモジュール プログラム生成3
以上のADCとFVRモジュールの設定により、ADCモジュールプログラムを作成する事が出来ます。
4.Timer2モジュールのプログラム生成
PIC16F1938には、Timer0.1.2.4,6と5個のタイマーを内蔵しています。
今回は、Timer2のタイマースタート/ストップ、カウント書き込みと割り込みの機能を使いました。
以前、割り込み無しのタイマー関数を使ったプログラムは、ここを参照。
Timer2のブロック図を下記に示します。
10秒タイマーを実現するため、
ハードでFOSC:16MHz ⇒ 0.1kHz(10ms)、次に ソフトで0.1kHz(10ms)⇒ 0.1Hz(10s)の
構成を考えました。
ハード部は、図17-1のブロック図の赤字の設定にして、0.1kHz(10ms)を出力させます。
MCC機能を使った設定は、下記の”MCC機能を使い、TMR2モジュールプログラム生成”を参照。
ブロック内の”x”=2です。(例えば、TxCKPS<1:0>⇒T2CKPS<1:0>です。)

PIC16F1938のデータシートから引用
Fosc/4:システムクロック/4=16MHz/4=4MHz
Prescaler: 1:16 は、入力した周期 4MHz/16 = 0.25MHzなり周期を長くします。
Comparator:0.25MHzのカウンター値とPRx(249)を比較 同じになるとEQ信号が
アクティブになります。次にTMRxカウンターを”0”に戻すために毎回1クロック分使います。
よって周期の計算では、
“(PRx+1)”の値が、周期計算式となります。
(MCC機能では、直接”PRxレジスタ”に書き込みはしませんが、 “PRxレジスタ”の設定値は、
“0xF9″です。)
周期計算式は、以下の式で求めます。
Sets Flag bit TMxIFの周期=1/ ( FOSC/4 ) × Prescaler × ( PRx+1 ) × Postscaler
上記を考慮して、MCC機能のGUIに入力します。
MCC機能を使い、TMR2モジュールプログラム生成
⑨:[Timer]を左側ボタンダブルクリック、 [TMR2]の “+”を左側ボタンクリック
”TMR2″が [Project Resources] 側に追加されます。

図8:TMR2モジュール プログラム生成1
⑩:[Enable Timer] タイマー許可 “レ”点、[Timer Clock] の [Postscaler] “1:10″選択、
[Prescaler] “1:16″選択、[Timer Period] “10ms” 入力、[Enable Timer Interrupt] 割り込み許可 “レ”点。図17-1のTIMER2/4/6のブロック図参照。ここまでは、ハード部の設定。
⑪:[Software Settings] “1000”入力、10ms × 1000回の割り込みをソフト生成して10sにします。
本TMR2モジュールは、ハード設定による割り込み(10ms 毎)と この割り込みを1000回処理するプログラム(10sタイマー)を ”Software Settings” 設定により自動で生成します。

図9:TMR2モジュール プログラム生成2
注意:図17-1の “PRxレジスタ” の値は、⑩ 設定から分るので、”PRxレジスタ”設定は、システム側で入力します。よってユーザー設定は省いています。
“Generate“を実行
MCC機能を使い、1~4までの各モジュール生成ができました。これらをまとめる”main.c”(幹プログラム)を生成するために”Generate”を左側ボタンクリック、実行。
“Output”ウインドウに ”Generation complete” 表示で正常終了 確認。

図10:”Generate” の画面
次回は
上記、ソフト仕様 に合わせるために、今回生成したプログラムを編集する記事を投稿予定です。

コメント