第32回(最終回)MCC(8)〜MCC設定変更〜

今回の記事は応用編の最終回です。最後にMCCで設定を変更する手順を説明します。

目次

MCC設定変更する際の2つのケース

プログラムを作成するときにMCCを使用した場合、プログラムを完成させるまでの間にMCCの設定を変更したくなることがあると思います。

例えば、最初はテスト的に動作確認したあと、制御するピンの数を増やしたり、機能を追加することがあります。


このようなケースでは、基本的には「MCCで設定変更や追加を行う」▶︎「再度Generateボタンをクリックしてコードを生成」という手順になります。

ただ、状況によってはこの手順とは異なるケースが出てきます。

そこで、この記事では次の2つのケースについて、MCCの設定変更からコード生成までの手順を解説します。

  • MCCが生成したファイルを編集していない場合
  • MCCが生成したファイルを編集した場合

MCCが生成したファイルを編集する」というケースはあまりないと思いますが、MCCが生成したコードが不具合原因になるケースなど、どうしてもファイルを編集したいこともあるかもしれません。

そこで、上の2つのケースについてMCC設定変更〜コード生成までの手順を解説します。

MCCが生成したファイルを編集していない場合のMCC設定変更手順

変更内容

MCCの設定変更は大きく分けて次の2種類があります。

  • MCCで新規に設定を追加する
    例えば今まで使用していなかったピンを、新規にデジタル出力のピンに設定するなどのように、今まで設定になかった設定を追加するケースです
  • MCCで設定済みの内容を変更する
    例えばすでにデジタル出力に設定しているピンを、回路変更に伴いデジタル入力ピンに設定を変更するケースです

そこで、前回までに作成したプロジェクトに対して、次の変更を加えることにします。

変更するピン変更種類変更内容
RA5ピン設定済みの内容を変更RA5ピンはLED制御のため「デジタル出力」ピンに設定していました。
LEDをスイッチに変更することを仮定して、次の2点の変更を行います。
・「デジタル入力」ピンに変更
・ピンのカスタム名を「Switch」に変更
RA1ピン新規に設定RA1ピンは使用していませんでしたが、このピンをモーターON/OFFの制御ピンに使用することを仮定して、次の新規の設定を行います。
・「デジタル出力」ピンに設定
・ピンのカスタム名を「Motor」に設定

この2項目についてむ、MCC上で設定変更を行い、コード生成します。

MCC設定変更

MCCを起動していない場合は、最初にMCCアイコンをクリックして起動します。

次に、「Pin Package View」でRA5ピンを入力に変更し、RA1ピンを新規に出力に設定します。

次に、右側の設定領域で、ピンの詳細設定を行います。

これでMCCの設定完了です!

コード再生成

次にコードを再生成します。

左側の「Project Resource」を開いて、「Generate」ボタンをクリックすると、コードが再生成されます。

結果の確認

Generateボタンをクリックしても特に反応がないので、本当に再生成されたのかちょっと心配ですよね。

Generateボタンをクリックすると作業内容記録(ログ)が出力されますので、その記録内容を確認し、さらに実際にコードが正しく生成されたか確認してみたいと思います。

作業内容記録(ログ)の確認

最初にMCCの作業内容を確認します。

MCC画面の下の方にいくつかボタンが並んでいますが、その中の「User Output」ボタンをクリックします。

クリックすると、上のように今回の作業内容が表示されます。

上の画像は見づらいので、作業内容をテキストで抜き出しました。

 10:52:13.721  INFO :  ***************************************************** 
 10:52:13.722  INFO :   Generation Results                                   
 10:52:13.722  INFO :  ***************************************************** 
 10:52:13.722  INFO :  main.c                                       Success. 
 10:52:13.722  INFO :  mcc_generated_files/adc/adc.h                Success. 
 10:52:13.722  INFO :  mcc_generated_files/adc/adc_types.h          Success. 
 10:52:13.723  INFO :  mcc_generated_files/adc/src/adc.c            Success. 
 10:52:13.723  INFO :  mcc_generated_files/system/clock.h           Success. 
 10:52:13.723  INFO :  mcc_generated_files/system/config_bits.h     Success. 
 10:52:13.723  INFO :  mcc_generated_files/system/interrupt.h       Success. 
 10:52:13.723  INFO :  mcc_generated_files/system/pins.h            Success. Auto-merged. 
 10:52:13.723  INFO :  mcc_generated_files/system/src/clock.c       Success. 
 10:52:13.723  INFO :  mcc_generated_files/system/src/config_bits.c Success. 
 10:52:13.724  INFO :  mcc_generated_files/system/src/interrupt.c   Success. 
 10:52:13.724  INFO :  mcc_generated_files/system/src/pins.c        Success. Auto-merged. 
 10:52:13.724  INFO :  mcc_generated_files/system/src/system.c      Success. 
 10:52:13.724  INFO :  mcc_generated_files/system/system.h          Success. 
 10:52:13.742  INFO :  ***************************************************** 
 10:52:13.743  INFO :   Generation complete (total time: 110 milliseconds) 
 10:52:13.743  INFO :  ***************************************************** 
 10:52:13.743  INFO :  Generation complete. 

この作業内容は、作業時刻と、生成したファイル名とその作業結果が書かれています。「Sucess」と表示されていますので、全てのファイル生成は成功しています。

今回はピンの設定を変更しましたので、MCC生成ファイルのうち、「pins.h」(11行目)と「pins.c」(15行目)が変更になっています。

それぞれの行を見ると、右端に「Auto-merged」と表示されています。

Auto-merge」は「今回の変更を、(MCCが)自動的に元のソースコードに追加・変更した」というような意味です。

そこで、実際に「pins.h」と「pins.c」が正しく変更されているか確認してみましょう!

再生成されたコードの確認

最初に「pins.c」を確認します。

変更は「RA5ピンを入力」「RA1ピンを出力」に設定しましたので、TRISAレジスタの設定値が変更になっているはずです。

そこで、「pins.c」のTRSIAレジスタがどのように変更されたか確認します。

次のコードは変更前と変更後(コード再生成後)の内容を比較したものです。

// 変更前
// --------------------
    /**
    TRISx registers
    */
    TRISA = 0xF;
// --------------------


// 変更後
// --------------------
    /**
    TRISx registers
    */
    TRISA = 0x2D;
// --------------------

16進数なのでわかりづらいですが、2進数で変更前後の値を比較すると次のようになります。

TRISA = 0b00001111;  // 変更前
TRISA = 0b00101101;  // 変更前

右からRA0ピン、RA1ピン、という設定になりますので、右側から2ビット目、つまりRA1ピンが出力に変更になっています。また右側から6ビット目、つまりRA5ピンが入力に変更になっていることがわかります。


次に「pins.h」の内容を確認します。

pins.hではピンを制御する関数(マクロ)が変更されているはずです。

実際に新規追加したRA1ピン(カスタム名は「Motor」)関連のコードを確認すると、次のように追加されていることがわかります。

// get/set IO_RA1 aliases
#define Motor_TRIS                 TRISAbits.TRISA1
#define Motor_LAT                  LATAbits.LATA1
#define Motor_PORT                 PORTAbits.RA1
#define Motor_WPU                  WPUAbits.WPUA1
#define Motor_OD                   ODCONAbits.
#define Motor_ANS                  ANSELAbits.ANSA1
#define Motor_SetHigh()            do { LATAbits.LATA1 = 1; } while(0)
#define Motor_SetLow()             do { LATAbits.LATA1 = 0; } while(0)
#define Motor_Toggle()             do { LATAbits.LATA1 = ~LATAbits.LATA1; } while(0)
#define Motor_GetValue()           PORTAbits.RA1
#define Motor_SetDigitalInput()    do { TRISAbits.TRISA1 = 1; } while(0)
#define Motor_SetDigitalOutput()   do { TRISAbits.TRISA1 = 0; } while(0)
#define Motor_SetPullup()          do { WPUAbits.WPUA1 = 1; } while(0)
#define Motor_ResetPullup()        do { WPUAbits.WPUA1 = 0; } while(0)
#define Motor_SetPushPull()        do { ODCONAbits. = 0; } while(0)
#define Motor_SetOpenDrain()       do { ODCONAbits. = 1; } while(0)
#define Motor_SetAnalogMode()      do { ANSELAbits.ANSA1 = 1; } while(0)
#define Motor_SetDigitalMode()     do { ANSELAbits.ANSA1 = 0; } while(0)

また、RA5ピンはカスタム名を「Led」から「Switch」に変更しました。

そこで、RA5ピンのコードを確認すると、次のようにSwitchに変更されていることがわかります。

// get/set IO_RA5 aliases
#define Switch_TRIS                 TRISAbits.TRISA5
#define Switch_LAT                  LATAbits.LATA5
#define Switch_PORT                 PORTAbits.RA5
#define Switch_WPU                  WPUAbits.WPUA5
#define Switch_OD                   ODCONAbits.
#define Switch_ANS                  ANSELAbits.
#define Switch_SetHigh()            do { LATAbits.LATA5 = 1; } while(0)
#define Switch_SetLow()             do { LATAbits.LATA5 = 0; } while(0)
#define Switch_Toggle()             do { LATAbits.LATA5 = ~LATAbits.LATA5; } while(0)
#define Switch_GetValue()           PORTAbits.RA5
#define Switch_SetDigitalInput()    do { TRISAbits.TRISA5 = 1; } while(0)
#define Switch_SetDigitalOutput()   do { TRISAbits.TRISA5 = 0; } while(0)
#define Switch_SetPullup()          do { WPUAbits.WPUA5 = 1; } while(0)
#define Switch_ResetPullup()        do { WPUAbits.WPUA5 = 0; } while(0)
#define Switch_SetPushPull()        do { ODCONAbits. = 0; } while(0)
#define Switch_SetOpenDrain()       do { ODCONAbits. = 1; } while(0)
#define Switch_SetAnalogMode()      do { ANSELAbits. = 1; } while(0)
#define Switch_SetDigitalMode()     do { ANSELAbits. = 0; } while(0)

このように、MCCで設定変更した場合、すでに設定済みの内容を変更した場合でも、新規に設定を追加した場合でも、既存のコードをうまく変更してくれていることがわかります。

MCCが生成したファイルを編集した場合のMCC設定変更手順

ところで、MCCが生成したファイルを手動で編集した場合、先ほどのようにMCCが自動的にコードを再生成してくれません

そこで、このようなケースではMCCのコード再生成がどのようになるのか確認します。

変更内容

変更自体に意味はありませんが、MCCが生成した「pins.c」ファイルの次の3行を手動でコメントアウトしてみます。(ピン変化による割り込み関連のレジスタ設定をコメントアウトしています)

このように、MCCが生成したファイル、つまりMCCの持ち物を無断で勝手に?手動で編集するとどうなるのか確認してみます。

コード再生成と結果の確認

Generateボタンをクリックしてコードを再生成し、作業内容の記録を確認します。

 12:19:03.558  INFO :  ***************************************************** 
 12:19:03.559  INFO :   Generation Results                                   
 12:19:03.559  INFO :  ***************************************************** 
 12:19:03.559  INFO :  main.c                                       Success. 
 12:19:03.559  INFO :  mcc_generated_files/adc/adc.h                Success. 
 12:19:03.560  INFO :  mcc_generated_files/adc/adc_types.h          Success. 
 12:19:03.560  INFO :  mcc_generated_files/adc/src/adc.c            Success. 
 12:19:03.560  INFO :  mcc_generated_files/system/clock.h           Success. 
 12:19:03.560  INFO :  mcc_generated_files/system/config_bits.h     Success. 
 12:19:03.560  INFO :  mcc_generated_files/system/interrupt.h       Success. 
 12:19:03.561  INFO :  mcc_generated_files/system/pins.h            Success. 
 12:19:03.561  INFO :  mcc_generated_files/system/src/clock.c       Success. 
 12:19:03.561  INFO :  mcc_generated_files/system/src/config_bits.c Success. 
 12:19:03.561  INFO :  mcc_generated_files/system/src/interrupt.c   Success. 
 12:19:03.561  INFO :  mcc_generated_files/system/src/pins.c        Success. MCC output unchanged. User edits maintained. [See 'Force Update'] 
 12:19:03.562  INFO :  mcc_generated_files/system/src/system.c      Success. 
 12:19:03.562  INFO :  mcc_generated_files/system/system.h          Success. 
 12:19:03.588  INFO :  ***************************************************** 
 12:19:03.589  INFO :   Generation complete (total time: 97 milliseconds) 
 12:19:03.589  INFO :  ***************************************************** 
 12:19:03.589  INFO :  Generation complete. 

作業結果は全て「Success」になっていますが、15行目は右の方に次のメッセージが表示されています。

MCC output unchanged. User edits maintained. [See 'Force Update']

これは「(このファイルは)MCCにより変更されませんでした。ユーザが編集した状態のままです」というような意味です。

つまり、MCCはこのファイルは変更しなかった、と言っています。

このように、MCCが生成したファイルを手動で変更すると、MCCはそのファイルをどのように変更するのが適切か判断できないため、変更を保留にします。

このような場合、強制的にコードを上書きする方法を説明します。

コードのマージ

作業内容結果を見ると、「pins.c」ファイルに対してMCCは何もしていないことがわかります。

そこで、ピン設定関連の機能について「再生成したコードで上書き」する作業をしていきます。

この作業は「マージ」と呼んでいます。「マージ」は日本語で「融合する」という意味で、ここではすでにあるコードに対して、新しいコードを融合する、というような意味合いです。


手動で編集したコードに対して、再生成したコードをマージするには、次の手順で作業を進めます。

最初にピン関連のコードをマージするために、「Project Resouces」の「Generate」ボタンを右クリックして、表示されたメニューから「Force Update on All」(強制的に更新)を選択します。

選択しても特にフィードバックはありませんが、もう一度メニューを表示すると太字になっています。太字になっていれば選択されています。

これで準備ができましたので、「Generate」ボタンをクリックします。


Generateボタンをクリックすると、MCCはコードを生成しようとしますが、すでにあるコードはMCCが知らない変更が入っているため、次のような確認の画面が表示されます。

この画面は、上の部分に確認が必要なファイルのリスト、左側が今回MCCが生成したコード、右側が現在のコードです。

この画面では、2つのコードに違いがある部分がわかるように表示されています。

上の例では83行目から85行目まで、枠で囲まれていて、この部分が違うことを示しています。


この画面では、MCCが生成したコードを採用するか、現在のコードを採用するか選択することができます。

MCCが生成したコードを採用して、現在のコードを上書きする場合、83行目に表示されている矢印ボタンをクリックします。(下の赤い注釈)

また、違いがたくさんある場合、MCCの全てのコードをまとめて採用する場合は、ウィンドウ上の方にある矢印ボタンをクリックします。(上の青い注釈)


MCCが生成したコードを手動で編集することはできますが、このような状況になるてのなるべく編集しない方がいいですね…

補足

このようにMCCが生成したコードと現在のコードが異なる場合、上のようにマージ作業が必要になります。

このマージ作業ですが、実際の処理のコードを書く「main.c」も対象になります。

「main.c」はMCCが生成しますが、生成後は手動で処理を書きます。

その書いた処理は、MCCが知らないところで変更された、と認識されて、先ほどのマージ作業の対象になることがあります。


そのようなときは、特定のモジュールのみ強制的にマージする選択も可能です。

例えば、ピン設定関連のコードのみ強制的にマージ作業をしたい場合、「Project Resouce」の「Pins」を右クリックします。

表示されるメニューから「Force Update」を選択すると、Pins関連のコードのみ、強制的にマージするようになります。

最後に

以上で応用編は終わりです。

おそらくここまで読まれた方は相当熱心な方だと思います。

基礎編ではPICマイコンの基本的な機能に絞って確認しました。また応用編では、マイコンを使った電子工作でよく使いそうな機能を無理やりタイマー回路に実装することにより一通り確認しました。

この先は、ぜひ他のPICマイコンにもぜひ挑戦してみてください。

このシリーズで使用したPIC12F1822はピン数が限られていますし、メモリももう少し欲しいところです。

PICマイコンであれば300円も出せばかなり高機能なマイコンを手に入れることができます。他のマイコンにもチャレンジして、ご自分の作りたいものが作れるように、いろいろと試していただければと思います。

このあとの実践編では、「PIC16F18857」というより高機能なマイコンを使った電子工作をします。

実践編では、センサーや液晶モジュールなどを使用して、マイコンと電子部品の通信方法を中心に習得します。(SPI通信・I2C通信)

ご自分で何か製作される際の参考にしていただければと思います。

更新履歴

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

非常にわかりやすい解説、ありがとうございます。
自動生成された関数がinline static…で定義されたものをmain.cにて使いたい場合はどうするのがいいのでしょうか?定義をexternに変更すれば参照はできると思いますが、わざわざそのようなことをするものなのか…?そもそもmain.cで使用するのが変なのでしょうか?教えていただけると助かります。

rain
rain
返信  rain
2 年 前

#include “mcc_generated_files/mcc.h”
追加で解決しました!失礼しました…

Osada
Osada
5 年 前

MCCを試すための情報を探していてツール・ラボさんの記事に辿り着いたのですが、非常にわかりやすく書かれており感動しました。書籍があれば欲しいほどです。これを機に全記事拝見させて頂き、勉強させて頂こうと思います。ありがとうございました。

水野
水野
5 年 前

こんな自動生成機能があるとは知らなかったです。ありがとう。

管理者
管理者
返信  水野
5 年 前

コメントどうもありがとうございます。
自動生成機能は便利なのですが、使いこなしがそれなりに難しいので、何かわからないことがありましたらご質問いただければと思います。

目次