今回は自動生成されたプログラムの内容を解読します。
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関数の最初の動作から処理の流れを追っていきたいと思います。
なお、説明は要点のみとしていますので、できれば実際に生成されたファイルの中身も確認していただけると理解が深まるかな、と思います。
プログラム処理はmain関数から開始します。
main関数は、「Source Files」フォルダ直下に「main.c」というファイル名で生成されています。
main関数の処理は次のような流れになっています。
int main(void)
{
SYSTEM_Initialize();
while(1)
{
}
}
SYSTEM_Initialize()
関数は、MCCで指定した基本設定やADC設定などを呼び出す関数です。次のステップで中身を確認します。
また、プログラム処理はwhile
文の処理の中に書くことになります。
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 |
それぞれの関数内では、関連するレジスタの設定を行っています。詳細説明は省略いたします。
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」
主な定数
ピンのハードウェアをする際に引数として指定できるように、次の定数が定義されています。
定数名 | 値 |
---|---|
HIGH | 1 |
LOW | 0 |
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_RESOLUTION | ADコンバータの解像度 | 10U |
adc_result_t | ADコンバータ読み取り値の型 | 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.10 | MCC Melody対応 |
詳細且つ丁寧な解説サイトをご提供頂き有難う御座います。
MCC 5.x では mcc.h/mcc.c の configuration 部分が分離され、
device_config.h/device_config.c で定義/実装されるようになったようです。
コメントいただきどうもありがとうございます。
mcc.h/.cのconfig部分が分離されたんですね。すみません、最近はウォッチしておりませんでした。
このシリーズ記事については「基礎編」と「応用編」合わせて新しいシリーズ記事を書こうと考えております。その際はご指摘いただきました部分も含めて最新の情報に更新しようと思います。
最近はYouTubeで検索する方も多いようなので、このサイトと合わせて動画での説明もしてみようかと考え中です…
いつも素晴らしい解説ありがとうございます。
さて30回の説明の中で「ピンの制御ですが、「LATA5 = 1;」などと書いて出力制御することができますがピンのカスタム名をつけました。この設定は「pin_manager.h」で定義されています。多くの設定がありますので、ここではLEDを接続しているRA5ピンの記述を確認します。」とあります。
まず、①pin_manager.cと表記されますがこれでよいのでしょうか?
②カスタム名を付けてもpin manegerに#define部分が生成されていません。どうすれば生成されますか?
ご教授いただければ幸いです。
ご質問どうもありがとうございます。
私の説明が悪かったです。申し訳ございません。カスタム名をつけると、記事に書きましたようにいろいろな定義をしてくれるのですが、そのファイルは、
プロジェクト名の下の
「Header Files」の下の
「MCC Generated Files」の下の
「pin_manager.h」
になります。「pin_manager.c」ファイルはプロジェクト名の下の「Source Files」の下の「MCC Generated Files」の下にありますが、カスタム名をつけた時の#defineは「Header Files」の方に格納されています。
すみません、文字だけでわかりづらいと思いますので、不明点ありましたらお手数ですが再度ご質問いただければと思います。