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

今回は自動生成されたプログラムを利用して、スイッチとLEDを制御します。

目次

動作仕様

何度も確認してすみませんが、今回作成するプログラムの動作仕様を再度確認します。

RA2ピンに接続された片方のスイッチが押されるとLEDをON、もう片方のスイッチが押されるとLEDをOFFにします。

プログラムの方針としては、ADC_GetConversion関数でRA2ピンの電圧値を読み取り、その値に応じてRA5ピンのLEDをLED_SetHigh()またはLED_SetLow()で制御します。

プログラム本体

動作の流れとしては、ADC_GetConversion関数でRA2ピンのADコンバータ値を読み取り、250未満の場合、250以上750未満の場合、750以上の場合で場合分けをしてLEDを制御します。

LEDのON/OFFは、LED_SetHigh、LED_SetLow関数を使用します。

以下が完成したプログラムです。元のmain.cに対して、追加した部分を「※追加部分ここから」「※追加部分ここまで」でコメントしています。

特に難しいアルゴリズムではないので、これ以上の説明は必要ないと思いますが、不明点ありましたらコメント欄かお問い合わせページからご質問いただければと思います。

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();
            }
        }
        
    }
    // ※追加部分ここまで

}

更新履歴

日付 内容
2017.12.24 新規投稿
通知の設定
通知タイミング
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 年 前

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

目次