今回は自動生成されたプログラムの内容を確認します。
MCC生成コードの構成
それでは再度MCCが生成したプログラムコードの構成を確認しておきましょう。
それぞれのファイルの概略は以下になります。
ファイル名 | 内容 |
---|---|
main.c | メインファイルで、このファイルに自分のプログラムを書いていきます。 |
mcc.h / mcc.c | マイコンの初期化関数などが記述されています。またマイコンのコンフィグレーション設定(#pragma config)もこのファイルに記述されています。 |
pin_manager.h / pin_manager.c | 各ピンのデジタル/アナログ設定、入出力設定などが記述されています。またピン名称のマクロも定義されています。このマクロについても後ほど詳細を説明します。 |
adc.h / adc.h | ADコンバータの関数が記述されています。 |
それでは、最初はメインとなるmain.cファイルから説明します。
main.c
main.cはシンプルな構成になっています。
マイコンの初期化設定などは「SYSTEM_Initialize()」にまとめられています。この関数では、マイコンのピン設定や動作周波数設定などが行われます。実体は「mcc.c」にありますので、あとで詳しく見てみます。
また割り込み処理を行う場合は、今はコメントアウトされていますが、必要に応じてコメントを外します。今回は割込み処理は実装しませんので説明は省略します。
プログラムは最後のwhile()ブロックに書くことになります。
基礎編や応用編のプログラムでは、マイコンの設定などはmain関数内に書いてきましたが、MCCではSYSTEM_Initialize関数にまとめられていますので、この内容をもう少し詳しくみてみます。
SYSTEM_Initialize関数
先ほどの「SYSTEM_Initialize()」関数はmcc.cに書かれています。
ということで、「SYSTEM_Initialize()」の中身は、関数4個で構成されています。なんとなくこの先、どんどん深みに入っていきそうな雰囲気が出てきていますが、この先の関数の中では見慣れたコードが書かれていますので、それほど複雑ではありません。
ところで、これら4個の関数を説明する前に、コンフィグレーション設定の場所を確認しておきましょう。コンフィグレーション設定は、「SYSTEM_Initialize()」の前に以下のように書かれています。
この記述は、今まで基礎編で使用してきた内容と同じになります。
それでは、SYSTEM_Initializeから呼ばれる4個の関数の中身を確認します。
最初はPIN_MANAGER_Initialize関数です。
この関数で、MCC設定画面で設定した内容に応じて、TRISA(入出力設定)、ANSELA(アナログ/デジタル設定)が記述されています。また各ピンの出力の初期値としてLATAの設定があります。基礎編と応用編では説明していませんが、内部プルアップ抵抗の設定(WPUA)、ピンの機能割り当て設定(APFCON)も記述されています。
次に、同じmcc.cファイル内にあるOSCILLATOR_Initialize関数とWDT_Initialize関数の中身を確認します。
OSCILLATOR_Initialize関数内では、基礎編、応用編で使用してきた動作周波数設定レジスタOSCCONの設定がされています。また、今までの説明に出てきていませんが、動作周波数の微調整を行うOSCTUNEレジスタ、ブラウンアウトリセットの制御を行うBORCONレジスタの設定がされています。
MCCで設定する場合、見慣れないレジスタの設定もされていますが、そのままで特に問題ありません。
SYSTEM_Initializeから呼ばれる最後の関数はADC_Initialize関数です。
この関数では、MCCで設定した内容にしたがって、ADコンバータ設定のレジスタ、ADCON0とADCON1の設定がされています。また、ADコンバータの結果が格納されるADRESレジスタにデフォルト値として0が設定されています。
ADコンバータ機能の利用
以上が初期設定の中身で、これらはMCCで設定した内容に応じて自動的に生成されたものですので、特に理由がない限り変更する必要はありません。
今回、ADコンバータの機能を利用して、スイッチの状態を調べて、その状態に応じてLEDをON/OFFします。
これらを実装する場合にどのように自動生成されたコードを利用すればよいか、これからADコンバータ機能、ピン出力設定についてそれぞれ説明します。
ADコンバータ機能に関するプログラムは、adc.h / adc.cにあります。今回はRA2ピンのADコンバータで電圧値を読み取ります。adc.h / adc.cではこの関数が用意されています。
「ADC_GetConversion()」という関数で、これは引数にADコンバータ値を取得したいピンを指定すると、ADコンバータの値が返ってきます。なお、返り値の型は「adc_result_t」ですが、これは符号なし16ビットです。
また引数のピン指定ですが、数値で指定しても問題ありませんが、MCCでRA2ピンに対して「SWITCH」というカスタム名をつけました。この設定は、adc.hに定義されています。
ということで、ADコンバータで値を読み取りたい場合は、
ADC_GetConversion(SWITCH);
と書くと、ADコンバータの値が取得できます。
ピンの制御
ピンの制御ですが、「LATA5 = 1;」などと書いて出力制御することができますが、MCCでピンのカスタム名をつけました。この設定は「pin_manager.h」で定義されています。多くの設定がありますので、ここではLEDを接続しているRA5ピンの記述を確認します。
132行目を見ると、LATA5は「LED_LAT」として定義されていますので、LEDをONする場合「LATA5 = 1;」ではなく、「LED_LAT = 1;」と書くことができます。
また、ONかOFFの設定は、135行目、136行目にも定義があり、LEDをONする場合は「LED_SetHigh();」、OFFにする場合は「LED_SetLow();」と記述することができます。
以上で、自動生成されたプログラムについて、必要な部分の確認ができましたので、次回はこれらを利用して実際にプログラムを作成、動作確認してみます。
更新履歴
日付 | 内容 |
---|---|
2017.12.24 | 新規投稿 |
詳細且つ丁寧な解説サイトをご提供頂き有難う御座います。
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」の方に格納されています。
すみません、文字だけでわかりづらいと思いますので、不明点ありましたらお手数ですが再度ご質問いただければと思います。