第30回 MPLAB Code Configurator(6)〜生成されたプログラム解読〜

今回は自動生成されたプログラムの内容を解読します。

目次

MCC生成プログラムファイルの構成

最初に、MCCが生成したプログラムファイルの構成を確認します。

MPLAB X IDEのプロジェクトフォルダを開くと、MCCが生成したファイルが確認できます。

MCCが生成したファイルは「MCC Generated Files」フォルダに格納されていて、大きく分けて次のように2種類のファイルが生成されています。

Header Files」フォルダの「MCC Generated Files」フォルダにはヘッダファイル、「Source FIles」の「MCC Generated Files」フォルダにはプログラムファイルが格納されています。

それぞれの「MCC Generated Files」フォルダはさらにサブフォルダがあり、次のように機能ごとにファイルがまとめられています。

フォルダ中身
system基本設定関連のファイルが格納されます。
例えば、クロック設定やコンフィグレーション設定、ピン設定などのファイルです。
adc機能追加したADコンバータ関連のファイルが格納されます。
今回はADコンバータ機能のみ追加したので「adcフォルダしかありませんが、他の機能を追加するとそれに対応したフォルダが作成されます。

ファイル概要

もしお時間に余裕があるようでしたら、実際にファイルを開いて中身を確認していただくと理解が深まると思います。

systemフォルダのファイル概要

最初は「system」のファイルです。これらのファイルはヘッダファイルとプログラムファイルが1対1対応していますので、まとめて説明します。

ファイル内容
clock.h
clock.c
__delay_ms関数に必要な_XTAL_FREQの定義や、OSCCONなどのクロック関連のレジスタ設定を行っています。設定値はMCC上で設定した内容が反映されています。
config_bits.h
config_bits.c
通常のプログラム先頭で設定する#pragma configの設定を行っています。設定値はMCC上で設定した内容が反映されています。
interrupt.h
interrupt.c
割り込み処理関連の定数定義や、処理関数が用意されています。割り込みを使用しない場合はこれらのファイルは無視して構いません。
pins.h
pins.c
ピンの機能設定(入出力設定やプルアップ設定など)と、ピンを制御する関数が用意されています。設定値はMCC上で設定した内容が反映されています。
ピンを制御する関数については、このあとのセクションで詳しく説明します。
system.h
system.c
基本設定や追加機能のヘッダファイルの読み込みと、それぞれの基本設定関数の呼び出しを行います。
このファイルにある関数についてはこのあと説明します。

adcフォルダのファイル概要

「adc」フォルダのファイルは、ヘッダファイルが2つ、プログラムファイルが1つで、次のような内容になっています。

ファイル内容
adc_types.h主にADコンバータ機能で使用する変数型などの定義を行っています。
例えば、ADコンバータの結果は16ビットですが、次のようにuint16_t型をADコンバータ機能用に使用する型名として定義しています。
typedef uint16_t adc_result_t;
adc.h
adc.c
ADコンバータ機能を利用するための関数が用意されています。例えば、ADコンバータ関連のレジスタ設定を行うADC_Initialize()関数やADコンバータで読み取りを開始するADC_ConversionStart()関数などです。
これらの関数については、このあとのセクションで詳しく説明します。

生成されたコードの処理の流れ

MCCではいろいろなファイルが生成されますので、処理の流れがわかりづらいところもあります。

そこで、main関数の最初の動作から処理の流れを追っていきたいと思います。

なお、説明は要点のみとしていますので、できれば実際に生成されたファイルの中身も確認していただけると理解が深まるかな、と思います。

STEP
main関数処理開始

プログラム処理はmain関数から開始します。

main関数は、「Source Files」フォルダ直下に「main.c」というファイル名で生成されています。

main関数の処理は次のような流れになっています。

int main(void)
{
    SYSTEM_Initialize();

    while(1)
    {
    }
}

SYSTEM_Initialize()関数は、MCCで指定した基本設定やADC設定などを呼び出す関数です。次のステップで中身を確認します。

また、プログラム処理はwhile文の処理の中に書くことになります。

STEP
SYSTEM_Initialize関数の処理

SYSTEM_Initialize()関数は、「system.c」ファイルの中に書かれています。

この関数の中身は次のようになっています。

void SYSTEM_Initialize(void)
{
    CLOCK_Initialize();
    PIN_MANAGER_Initialize();
    ADC_Initialize();
    INTERRUPT_Initialize();
}

関数名から分かるように、クロック関連の設定、ピンの設定、ADコンバータの設定、割り込みの設定を順番に行っていきます。

それぞれの関数は次のファイルにあります。

関数関数があるファイル
CLOCK_Initialize()clock.c
PIN_MANAgEr_Initialize()pins.c
ADC_Initialize()adc.c
INTERRUPT_Initialize()interrupt.c

それぞれの関数内では、関連するレジスタの設定を行っています。詳細説明は省略いたします。

STEP
プログラム処理の開始

SYSTEM_Initialize()関数で一通りの設定が終わりましたので、このあとwhile文の処理に入ります。

処理はこのwhile文の中に書くことになります。

今回はこの中に「押されたスイッチに応じて、LEDをONOFF制御する」という処理を書くことになります。

作成するプログラムで利用できる関数

次回の記事では「押されたスイッチに応じて、LEDをONOFF制御する」という処理を行うプログラムを、main関数のwhile文の中に書いてきいきますが、その処理で利用できる関数をMCCが生成してくれています。

プログラムでは、ADコンバータでピンの電圧を読み取り、その結果に応じてピンの出力を制御します。

そこで、これらの処理ができる関数についてまとめておきます。


ピンの出力制御など、ピンのハードウェア制御する関数はpins.h/pins.cで用意されています。

また、ADコンバータ関連の関数はadc.h/adc.cで用意されています。

それぞれのファイルで用意されている関数や、関連する変数型を説明します。

「pins.h」と「pins.c」

主な定数

ピンのハードウェアをする際に引数として指定できるように、次の定数が定義されています。

定数名
HIGH1
LOW0

LATA5レジスタなどを使用してピンの制御をする場合は、LATA5 = 1;と書くより、LATA5 = HIGH;と書いた方がわかりやすくなりますね。

ただ、ピンのハードウェア制御は関数が用意されていますので、関数を使う方がよりわかりやすいと思います。

主な関数

ピンのハードウェア制御する関数は、関数名の先頭にMCCで設定したピンのカスタム名がついています

例えばMCCで基本設定を行ったとき、次のようにRA5ピンのカスタム名を「Led」としました。

ピンの出力を1にするカスタム名_SetHigh()という関数が用意されていますが、RA5ピン用の関数としてLed_SetHigh()という関数が生成されています。

プログラムでは、LATA5 = HIGH;と書くより、LedSetHigh();と書いた方がよりわかりやすくなりますね。

このように、ピンを制御する関数はピンごと(ピンのカスタム名ごと)に用意されています。

主な関数に次のようなものがあります。

関数名処理内容
カスタム名_SetHigh()ピンの出力を1にする
カスタム名_SetLow()ピンの出力を0にする
カスタム名_Toggle()現在の出力が1であれば0、
0であれば1にする
カスタム名_GetValue()ピンの状態を読み取る
(1か0で読み取る)

今回は、これらの関数を使用してLEDの制御をします。

「adc.h」と「adc.c」

ADコンバータ関連の主な定数や型、関数には次のようなものがあります。

主な定数や型

定数名意味定義値
ADC_RESOLUTIONADコンバータの解像度10U
adc_result_tADコンバータ読み取り値の型uint16_t

主な関数

関数処理内容
ADC_ConversionStart()ADコンバータ読取りを開始する関数。
引数なし、戻り値なし。
bool ADC_IsConversionDone()ADコンバータの読み取りが終わったかどうか調べる関数。
引数なし。
戻り値はbool型で、読み取り中はfalse、読み取り完了はtrue
adc_result_t ADC_ConversionResultGet()ADコンバータの読み取り結果を取得する関数。
引数なし。
戻り値はadc_result_t
uint16_t型)

以上で、自動生成されたプログラムについて、必要な部分の確認ができましたので、次回はこれらを利用して実際にプログラムを作成、動作確認してみます。

更新履歴

日付内容
2017.12.24新規投稿
2025.6.10MCC Melody対応
通知の設定
通知タイミング
guest
4 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
xhashi84x
xhashi84x
2 年 前

詳細且つ丁寧な解説サイトをご提供頂き有難う御座います。

MCC 5.x では mcc.h/mcc.c の configuration 部分が分離され、
device_config.h/device_config.c で定義/実装されるようになったようです。

三浦秀信
三浦秀信
4 年 前

いつも素晴らしい解説ありがとうございます。

さて30回の説明の中で「ピンの制御ですが、「LATA5 = 1;」などと書いて出力制御することができますがピンのカスタム名をつけました。この設定は「pin_manager.h」で定義されています。多くの設定がありますので、ここではLEDを接続しているRA5ピンの記述を確認します。」とあります。
まず、①pin_manager.cと表記されますがこれでよいのでしょうか?
②カスタム名を付けてもpin manegerに#define部分が生成されていません。どうすれば生成されますか?

ご教授いただければ幸いです。

管理者
管理者
返信  三浦秀信
4 年 前

ご質問どうもありがとうございます。

私の説明が悪かったです。申し訳ございません。カスタム名をつけると、記事に書きましたようにいろいろな定義をしてくれるのですが、そのファイルは、

プロジェクト名の下の
 「Header Files」の下の
   「MCC Generated Files」の下の
     「pin_manager.h」

になります。「pin_manager.c」ファイルはプロジェクト名の下の「Source Files」の下の「MCC Generated Files」の下にありますが、カスタム名をつけた時の#defineは「Header Files」の方に格納されています。

すみません、文字だけでわかりづらいと思いますので、不明点ありましたらお手数ですが再度ご質問いただければと思います。

目次