この記事でわかること
別投稿”【温度センサーIC+PICマイコンの設計】-3:温度センサーICの出力信号をマイコンに取り入れる(ソフト設計編-2)” では、“main.c”と “tmr2.c” プログラムでの編集を説明しましたが、本投稿は、“main.c”の編集だけ(”tmr2.c”編集無し)で同じ仕様に合った動作を行うプログラム編集を紹介します。
そして、本プログラムをMPLAB X IDEのシミュレーションにて検証します。
プログラムの特長:
・本投稿:main.cファイルのみの編集、全てを一つのファイルにまとめるため単独で設計する時に有利
・別投稿:main.cとtmr2.cファイルの編集は、複数ファイルを複数設計者で行う時に有利
仕様
仕様(要点):
- システムクロックは、PICマイコン内の発振器:16MHzを選択
- 2ピンをアナログ入力AN0端子名設定
- マイコン内の10ビットA/D変換モジュールを採用
- 10秒タイマーで時間管理、割り込み使用
(温度観測タイミングが、正確に10秒毎ではありません。) - 温度電圧値から温度を計算します。計算式の解説は、ここを参照。
- 温度表示は、有りません。今回はマイコン内で確認します。
前提として、上記、”仕様(要点)”項の 1~6項目を満足するプログラム作成の方法
“MPLAB X IDE”支援ソフトのMCC機能を使い、下記、5つのプログラムを生成しました。
作成の詳細は、前記事【温度センサーIC+PICマイコンの設計】-2 ソフト設計-1を参照。
簡単に前記事のおさらい
- システムクロック
- ADCモジュール
- FVRモジュール
- タイマーモジュール
- メインプログラム( main.c )
1~4までのプログラムを、MCC機能を使い生成、”Generate”ボタンを押下して、1~5のプログラムを含んだ、全体で完結したプログラムを自動生成します。後は、仕様に沿って一部のプログラムを編集します。
今回は、”main.c”の編集で本仕様に対応します。
ソフト設計(仕様に合った動作をmain.cのみの編集で対応)
下記のフローでは、MCC機能で生成したプログラム群の中で、“main.c”ファイルのみを変更します。
タイマーTMR2( tmr2.c ) は、MCC機能で生成のまま編集無しです。

図 1:main.c 編集, tmr2.c 編集無 のプログラムフローチャート
説明:
黒色:ユーザーが追加するプログラム
青色:MCC機能で生成した部分に相等
main 関数 ( MCC機能で生成+編集 )
- System_Initialize
MCC機能で生成
初期設定 - TMR2_SetInterruptHandler
TMR2_flag_set_ProcessのアドレスがTMR2モジュールに登録されます。
よって、割り込み処理プログラム中にmain.cプログラムのTMR2_flag_set_Process関数にジャンプします。 - TMR2 Interrupt enable、TMR2_stoptimer
TMR2の割り込み許可と初期化 - ADC_GetConversion、Temperature calculation、TMR2_10sec_flag “0” set、
TMR2″0″, Start-time
MCC機能で生成したADC関数を使い、A/D変換処理を実行
温度センサーIC出力電圧値から温度値を計算します。
計算式の詳細は、ここを参照。
10秒タイマーフラグを”0″に設定
TMR2タイマー”0″からスタート開始 - CMP. TMR2_10sec_flag=0
TMR2_10sec_flag値 判定
・YES(TMR2_10sec_flag=0 )⇒ TMR2 10sec count wait : 10秒達成待ち継続
・No(TMR2_10sec_flag=1)⇒ 10秒達成 ⇒ TMR2_StopTimer : TMR2カウンターストップ
⇒ ADC_GetConversionに遷移
TMR2_flag_set_Process 関数
本関数で、10秒達成時に行うプログラムを追加する事がでいます。
- TMR2_10sec_flag “1” set
タイマー2割り込み処理編集プログラム分をmain.cファイル中に追加します。
よって、tmr2.cファイルの編集が不要となります。
編集内容:10秒達成フラグ(TMR2_10sec_flag)に “1” 設定
tmr2.c ( 割り込み処理、MCC機能の生成のまま、編集不要 )
- ISR
割り込み処理 - TMR2 10msec × Interrupt count handler
10msec割り込み処理
割り込みカウンターアップ - 100 count Interrupt
10秒タイマー判定(10msec×1000回達成?)
・No(10秒未達成)⇒ 割り込み処理終了
・YES(10秒達成) ⇒ main.cファイルのTMR2_flag_set_Process関数にジャンプ⇒
割り込み処理終了
特長:複数のモジュール編集が、main.cファイルに集中します。
注意点:
割り込み機能の基本目的は、MPUが複数のモジュールを同時に実行させて、各モジュールが必要な時に割り込みを発生して、随時MPUが各モジュールの処理を効率良くする事です。
今回は、タイマーの割り込み処理プログラムを分かり易く説明するため、1つのタイマーモジュールの割り込み+ポーリング処理のプログラム(図1のフローチャート部:”CMP. TMR2_10sec_flag=0″で割り込み待ちループ)となっています。
実際にmain.cを編集したプログラムを、下記に説明します。
main.c プログラム編集
MPLAB X IDE画面の右側ウインドに、下記のmain.cプログラムを表示します。

図 2:main.c のプログラム
赤枠のプログラムを追加・編集しました。
① : 10秒フラグデータ宣言
TMR2_10sec_flag:10秒達成用フラグ宣言
ビットサイズ:32ビット、値範囲:0~4,294,967,295
②:割り込み処理関数 TMR2_flag_set_Process
10秒達成設定追加プログラム
TMR2_10sec_flagに”1″セット
③:デジタルデータ宣言
D_reg:A/D変換モジュールで変換したデジタルデータ
ビット幅:16ビット符号無し、値範囲:0~65535
A_reg:変換公式を使い、デジタルデータをアナログデータに変換
ビットサイズ:8バイト、値範囲:±1.7×10308
T_reg:アナログデータをLM61のデータシートの温度変換計算式を使っての温度に変換
ビットサイズ:8バイト、値範囲:±1.7×10308
④:割り込み処理関数指定 TMR2_SetInterruptHandler
“//” 削除、MCC機能で生成した関数を有効にしました。
TMR2_flag_set_ProcessのアドレスがTMR2モジュールに登録
⑤ : タイマー2割り込み許可
“//” 削除、MCC機能で生成した関数を有効にしました。
⑥:タイマー2停止
TMR2_StopTimer()関数設定
⑦:A/D変換実行、温度値算出、10秒カウント待ちループ
温度値計算の詳細は、ここを参照。
プログラムをシミュレーション
main.cとtmr2.cを編集するプログラム検証と同じ項目について、シミュレションをしました。
詳細の検証方法と項目は、”PICマイコンのソフト支援ツール”MPLAB X IDE”のシミュレーションの紹介とプログラム検証”を参照。
本投稿のmain.cのみを編集するプログラムの検証項目は、下記です。
( main.cとtmr2.cを編集するプログラムと同じ)
1.AN0端子に900mVを入力して、PICマイコンに取り入れた電圧値⇒温度値(30℃)
2.10秒タイマー値( TMR2_10sec_flg = “0” ⇒ “1” )10秒
シミュレーションは、”MPLAB X IDE”環境下で行います。
検証結果:
- AN0端子に900mVを入力して、PICマイコンに取り入れた電圧値⇒温度値(30℃)となることを
検証
PICマイコンの2ピン(AN0)に900mV印加設定。
(温度センサーICの温度電圧値:30℃に相等します。)

図 3:シミュレーション ・2ピン(An0)に900mV設定
ブレイクポイント設定と”Watches”機能を使い、プログラムの各変数データの値を表示させます。
AN0端子に900mV(30℃相等)印加した時に、
ADC_GetConversion関数を使いA/D変換後:
90mV⇒デジタル電圧値=D_reg=0x01C1
デジタル電圧値⇒アナログ電圧値=A_reg=898.8778
アナログ電圧値⇒アナログ温度値=T_reg=29.88778(PICマイコン内の温度値)
シミュレーション結果となりました。
実際のシミュレーションの実行結果を下記に示します。

図 4:シミュレーション ・D_reg, A_reg, T_regの値
シミュレーションの実行方法は、ここを参照(検証するプログラムは違います)。
- 10秒タイマー値( TMR2_10sec_flg = “0” ⇒ “1” )で10秒となることを検証
2度のブレイクポイント設定と”Stopwatch”機能を使い時間測定します。
“TMR2_10sec_flg=0″の次のステップに1度目のブレークポイント設定して実行、マイコン動作停止、
実行時間をストップウォッチ(下画面の赤枠押下)でクリア ”0ns” にします。
本設定のシミュレーション画面を下記に示します。

図 5:シミュレーション ・ストップウォッチ_cleared
“TMR2_10sec_flg=1″の次のステップに2度目のブレークポイント設定
[Continue]左側ボタンクリックして実行
“TMR2_10sec_flg=1″実行後マイコン停止、実行時間を表示します。
本設定のシミュレーション画面を下記に示します。

図 6:シミュレーション ・ストップウォッチ_Target halted
シミュレーションの実行方法は、ここを参照(検証するプログラムは違います)。
検証結果の比較(main.c編集 vs main.cとtmr2.c編集の検証比較)
同じ仕様ですが、編集するプログラムが違います。
main.c編集:本投稿プログラム
main.cとtmr2.c編集:ここのプログラムの検証結果
表1:検証結果の比較
| 項番 | 検証項目 | main.c 編集 | main.cとtmr2.c 編集 | 期待値 | 主な条件 |
|---|---|---|---|---|---|
| 1 | D_reg 値 | 0x01C1mV | 0x01C1mV | 0x01c2mV | AN0ピン=900mV |
| 2 | A_reg 値 | 898.8778mV | 898.8778mV | 900mV | AN0ピン=900mV |
| 3 | T_reg 値 | 29.88778℃ | 29.88778℃ | 30℃ | AN0ピン=900mV |
| 4 | TMR2_10sec_flg 0⇒1 時間 | 10.000018秒 | 10.000015秒 | 10秒 |
検証結果:
1.温度変換は、2つのプログラムで同じである事を確認しました。
2.TMR2_10sec_flgは、秒単位で考えて同じと判断しました。
よって、
本投稿 ”プログラム(mai.cのみの編集)” と ”main.cとtmr2.cの編集プログラム” では同じ動作をする事が確認出来ました。

コメント