第31回 MPLAB Code Configurator(7)〜プログラム完成〜

今回は、MCCにより自動生成されたコードを利用して、スイッチ状態の読み取りとLEDの制御を行います。

目次

動作仕様確認

今回作成するプログラムの動作仕様を再度確認します。

プログラム動作としては、RA2ピンに接続された片方のスイッチが押されるとLEDをON、もう片方のスイッチが押されるとLEDをOFFにします。

今回作成するプログラムは、MCCが生成した定数や関数を使用して作成してみます。

手書きプログラムの確認

MCCを利用したプログラムを作成する前に、第26回の記事で作成した手書きの?プログラムの構成を確認しておきます。

プログラムの構成は次のようになっていました。

このプログラムをMCCを利用した場合、どのように変わるか確認していきましょう!

MCCを利用したプログラム作成

動作の流れは上のプログラムの通りですので、それぞれの処理をどのように書けば良いか確認していきます。

ヘッダファイルインクルード

MCCでは必要なヘッダファイルのインクルードは、「system.c」で対応してくれていますので、「main.c」でヘッダファイルをインクルードする必要はありません。

コンフィグレーションとクロック周波数設定

上のプログラムでは、#pragma configでコンフィグレーションを設定を行い、そのあと_XTAL_FREQの定義をしています。

MCCではSYSTEM_Initialize()関数で対応してくれていますので、コンフィグレーションと_XTAL_FREQの定義を「main.c」で書く必要はありません。

マイコン設定とADコンバータ設定

上のプログラムでは、OSCCONレジスタなどのマイコン動作のレジスタ設定と、ADコンバータ機能を利用するためのADCON0レジスタなどの設定を行っています。

MCCではSYSTEM_Initialize()関数で対応してくれていますので、これらのコード「main.c」で書く必要はありません。

プログラム動作

プログラム動作は「main.c」に書く必要があります。

最初に使用する関数を確認しておきましょう。

LEDをON、ブザーをOFFにしますので、MCCが生成した次の関数を使用します。

関数名処理内容
Led_SetHigh()LEDをONにする
Buzzer_SetLow()ブザーをOFFにする

ADコンバータ機能については、次の関数を使用します。

関数処理内容
ADC_ConversionStart()ADコンバータ読取りを開始
bool ADC_IsConversionDone()ADコンバータの読み取りが完了するまで待つ(この関数がtrueになるまで待つ)
adc_result_t ADC_ConversionResultGet()読み取り結果を取得する

これらを反映したプログラムを次のように作成してみました。(コメントなどは削除しています)

手書きのプログラムにくらべると、コンフィグレーションやマイコン動作設定などがないのでスッキリしていますね。

/*
 *   RA2ピンに接続しているスイッチ状態をADコンバータで読み取り
 *   片方のスイッチはLEDオン、もう片方のスイッチはLEDオフの動作
 */

#include "mcc_generated_files/system/system.h"

int main(void)
{
    SYSTEM_Initialize();

    Buzzer_SetLow();  // ブザーをOFF
    Led_SetHigh();    // LEDをON

    while(1)
    {
        // ADコンバータ読み取り開始
        ADC_ConversionStart();
        
        // ADコンバータ処理が終わるまで待つ
        while( ADC_IsConversionDone() == false ) {
        }
        
        // ADコンバータの結果読み取り
        adc_result_t adc_value = ADC_ConversionResultGet();
        
        // 結果に応じてLEDをON/OFF制御
        if( adc_value < 250 ) {
            Led_SetHigh();
        } else {
            if(adc_value < 750 ) {
                Led_SetLow();
            }
        }
    } 

}

ビルドエラーが発生する場合

ところで、上のプログラムをビルドするとエラーが発生しました。

真の原因は不明ですが、2025年6月時点のMCCでは、RA2ピンのプルアップ設定をOFFにすると「adc_types.h」に次の未定義のコードが生成され、それによりビルドエラーになっているようです。

ADC_CHANNEL_ANA2 =  undefined, /**< Button: RA2*/ 

もしビルドしたときにエラーが発生した場合、次のように対応してみてください。

STEP
adc_types.hを開く

プロジェクトフォルダの「Header Files」フォルダ ▶︎ 「MCC Generated Files」フォルダ ▶︎「adc」フォルダの「adc_types.h」ファイルを開く

STEP
ADC_CHANNEL_ANA2の行をコメントアウトする

adc_types.hファイルの後半に次のコードがあります。

typedef enum
{
    ADC_CHANNEL_TEMP =  0x1d, /**< Temp*/ 
    ADC_CHANNEL_DAC =  0x1e, /**< DAC*/ 
    ADC_CHANNEL_FVR =  0x1f, /**< FVR*/ 
    ADC_CHANNEL_ANA2 =  undefined, /**< Button: RA2*/ 
    ADC_CHANNEL_AN2 =  0x2 /**< IO_R2: AN2*/ 
} adc_channel_t;

この中のADC_CHANNEL_ANA2の行(6行目)を次のようにコメントアウトします。

typedef enum
{
    ADC_CHANNEL_TEMP =  0x1d, /**< Temp*/ 
    ADC_CHANNEL_DAC =  0x1e, /**< DAC*/ 
    ADC_CHANNEL_FVR =  0x1f, /**< FVR*/ 
    // ADC_CHANNEL_ANA2 =  undefined, /**< Button: RA2*/ 
    ADC_CHANNEL_AN2 =  0x2 /**< IO_R2: AN2*/ 
} adc_channel_t;

RA2のプルアップをOFFにすると、上のようにADC_CHANNEL_ANA2がundefinedとしてenum定義されることによりビルドエラーになっているようです。

調べた限り、なぜこのようになるか真の原因はわかりませんでした。

もし何かわかりましたら記事を更新します。(ご存知の方がいらっしゃいましたらコメントいただけると幸いです!)

更新履歴

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

いつも明快なご回答ありがとうございます。

さて31回のMCCでメイン部にコピペしてコンパイルすると
下記のようなエラーが出ます。
どうも定義されていないようです。
adc result_t sw_value;
LED SetHigh();
sw_Value = ADC_GetConversion(SWITCH);
LED_SetHigh();
LED_SetLow();
上記部分にエラーが発生しております。
Identifier whose declaration cannot be found 
のエラーが出ます。
ご教授いただければ幸いです。

.

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

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

こちらでMPLABX IDE(v5.40)、MCC(v3.95.0)で確認したところ、このページに記載のプログラムをコピペしてビルドしましたが、特にエラーは発生しませんでした。

エラーはdeclaration cannot be foundとのことですので、エラーログに何が定義されていないか表示されていると思います。その情報がないのですぐにわかりませんが、投稿いただいたコードがコピペしたものだとすると、

1行目の「adc result_t」のadcとresultの間にアンダースコア(_)がないのと、2行目の「LED SetHigh()」のLEDとSetHighの間にもアンダースコアがありませんのでこれが原因かもしれません。

お手数ですがご確認いただければと思います。

三浦秀信
三浦秀信
4 年 前

何回もすみません。

adc_result_t sw_value;
でエラーが出ます。
アンダースコアはついております。

エラーコードもわからず全くすいません。
下記にOUTPUTされたエラーコード添付いたしました。
かなりめげそうになってきました。
申し訳ありませんがご教授ください。

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory ‘C:/Users/Owner/MPLABXProjects/M_test.X’
make -f nbproject/Makefile-default.mk dist/default/production/M_test.X.production.hex
make[2]: Entering directory ‘C:/Users/Owner/MPLABXProjects/M_test.X’
“C:Program Files (x86)Microchipxc8v2.10binxc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/mcc_generated_files/adc.p1 mcc_generated_files/adc.c
“C:Program Files (x86)Microchipxc8v2.10binxc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/main.p1 main.c
“C:Program Files (x86)Microchipxc8v2.10binxc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/mcc_generated_files/device_config.p1 mcc_generated_files/device_config.c
“C:Program Files (x86)Microchipxc8v2.10binxc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/mcc_generated_files/mcc.p1 mcc_generated_files/mcc.c
“C:Program Files (x86)Microchipxc8v2.10binxc8-cc.exe” -mcpu=12F1822 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,–data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/mcc_generated_files/pin_manager.p1 mcc_generated_files/pin_manager.c
main.c:72:1: error: function definition is not allowed here
{
^
main.c:109:3: error: expected ‘}’
*/
^
main.c:50:1: note: to match this ‘{‘
{
^
2 errors generated.
(908) exit status = 1
nbproject/Makefile-default.mk:146: recipe for target ‘build/default/production/main.p1’ failed
make[2]: *** [build/default/production/main.p1] Error 1
make[2]: *** Waiting for unfinished jobs….
make[2]: Leaving directory ‘C:/Users/Owner/MPLABXProjects/M_test.X’
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
nbproject/Makefile-default.mk:90: recipe for target ‘.build-conf’ failed
make[1]: Leaving directory ‘C:/Users/Owner/MPLABXProjects/M_test.X’
nbproject/Makefile-impl.mk:39: recipe for target ‘.build-impl’ failed

BUILD FAILED (exit value 2, total time: 1s)

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

詳細な情報どうもありがとうございます。

“Identifier whose declaration cannot be found”というのはMPLABX IDEのエディタ上で表示されるエラーのことでしょうか。この表示は真のエラーではないことがあります。

いただいたエラーログをみると、adc_result_t sw_value;でエラーになっているのではなく、他の場所でエラーが出ていてそれが影響しているようです。

もし差し支えなければ、main.cを丸ごと投稿いただけませんでしょうか。お手数ですがよろしくお願いいたします。

三浦秀信
三浦秀信
4 年 前

まことに申し訳ありません。
再度maincをお送りします。
/**
Generated Main Source File

Company:
Microchip Technology Inc.

File Name:
main.c

Summary:
This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs – 1.81.4
Device : PIC12F1822
Driver Version : 2.00
*/

/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.

Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.

THIS SOFTWARE IS SUPPLIED BY MICROCHIP “AS IS”. NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.

IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP’S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/

#include “mcc_generated_files/mcc.h”

/*
Main application
*/
void main(void)
{
// initialize the device
SYSTEM_Initialize();

// When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
// Use the following macros to:

// Enable the Global Interrupts
//INTERRUPT_GlobalInterruptEnable();

// Enable the Peripheral Interrupts
//INTERRUPT_PeripheralInterruptEnable();

// Disable the Global Interrupts
//INTERRUPT_GlobalInterruptDisable();

// Disable the Peripheral Interrupts
//INTERRUPT_PeripheralInterruptDisable();

while (1)
{
void main(void)
{

// ※追加部分ここから
// ADコンバータの読み取り値を格納する変数
adc_result_t sw_value;
// ※追加部分ここまで

// initialize the device
SYSTEM_Initialize();

// ※追加部分ここから
// LEDを点灯
LED_SetHigh();

while (true)
{
// ADコンバータ値の読み取り
sw_value = ADC_GetConversion(SWITCH);

// LEDオンの処理
// (ADコンバート値が250未満の場合)
if( sw_value < 250 ) { LED_SetHigh(); } else { // LEDオフの処理 // (ADコンバート値が250以上750未満) if( 250 < sw_value && sw_value < 750 ) { LED_SetLow(); } } } // ※追加部分ここまで } } /** End of File */

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

回答が遅くなり申し訳ございませんでした。

このプログラムですが、while分の中に、main関数を入れていますのでこれがエラーの原因です。

上の記事にある完成したプログラムというのは、mccが生成したmain.cファイルのmain関数の中の該当箇所に追加するものです。

「// ※追加部分ここから」と「// ※追加部分ここまで」という部分をmccが生成したmain関数の相当する箇所に書くことになります。

mccはプログラムを自動生成してくれますが、中身を理解する必要がありますので、まずはこの回答を元にご自身でトライしてみてください。

わからないようでしたらまたご質問いただければと思います。

ミウラヒデノブ
ミウラヒデノブ
4 年 前

ご丁寧なご回答ありがとうございました。
おかげでうまくいきました。感謝です!!!

管理者
管理者
返信  ミウラヒデノブ
4 年 前

わざわざご連絡どうもありがとうございました。動作したとのことでよかったです!

目次