PIC16F13145 :第2回 LEDとプッシュスイッチでデジタル入出力の基本機能を確認

【 当サイトには広告リンクが含まれています。 】

「第1回  Curiosity Nano 評価キットを使う」で紹介したPIC16F13145 Curiosity Nano 評価キットの上のLEDとプッシュスイッチを利用して、プッシュスイッチを押している間はLEDが100ms間隔で点滅し、スイッチから手を離すと500ms間隔で点滅するプログラムを作成します。

今回は、PICマイコンの周辺モジュール関連の設定を自動的に生成するツール(MPLAB Code Configurator:MCC)を使用せず、手動でプログラムを作成します。




実験準備

実験の環境と部品を準備します。

開発環境の構築

PIC16F13145 :第1回 Curiosity Nano評価キットを使う 」を参照してください。

部品

PIC16F13145 Curiosity Nano 評価キットの上のLEDとプッシュスイッチを利用しますので、特にありません。

配線

PIC16F13145 Curiosity Nano 評価キットの上のLEDとプッシュスイッチを利用しますので、特にありません

回路図




▶️LED0 ブロック図(PIC16F13145 Curiosity Nano User Guideより)

PIC16F13145 Curiosity Nanoボードには黄色のユーザーLEDが1つ搭載されています。

GPIOまたはPWMで制御可能で、接続されたI/Oピン(RC2)をGNDに接続することでLEDを点灯させることもできます。



▶️SW0 ブロック図(PIC16F13145 Curiosity Nano User Guideより)

PIC16F13145 Curiosity Nanoボードには、汎用ユーザー設定可能なスイッチとして1つの機械式スイッチが搭載されています。

このスイッチを押すと、I/Oピン(RC3)がグランド(GND)に接続されます。


スイッチには外部接続のプルアップ抵抗がありませんので、ピンRC3の内部プルアップ抵抗を有効にして使用します。


MPLABでC言語プログラミング

MPLAB X IDE v6.20 を使って、PIC16F13145をC言語プログラムで制御します。

プロジェクトの新規作成

「MPLAB X IDE v6.20」を起動し、メニューの「File」をクリックし、リストボックスから、「New Project…」をクリックします。


New Project-Choose Projectダイアログが表示されますので、Categories:リストから「Microchip Embedded」を選択し、Projects:から「Application Ploject(S)」を選択後、「Next>」をっクリックします。


New Project-Select Deviceダイアログが表示されますので、次のように選択します。

項 目設 定 内 容
Fmily:All Families
Device:PIC16F13145
Tool:PIC16F13145 Curiosity Nano-SN:(シリアル番号)


選択後、「Next>」をクリックします。



New Project-Select Compilerダイアログが表示されますので、「XC8(v3.10)[xxxx]」を選択後、「Next>」をクリックします


New Project-Select Project Name and Folderダイアログが表示されますので、次のように設定、選択します。

項 目設 定 内 容
Project Name:任意(ここでは、pic13145_2)
Project Location:任意
Encoding:Shift JIS



選択後、「Finish」をクリックすると、「Projects」ウィンドウに作成したプロジェクトの内容が表示されます。


ソースファイルの作成

プログラムを記述するソースファイルを作成します。

Project(pic13145_2)内の「Source Files」を右クリックします。


表示されたリストボックスから、「New 」→「main.c…」と選択します。


New AssemblyLFile.asm-Nae and Locationダイアログが表示されますので、File nameに「任意の名前(pic13145_2_src)」を入力し、Extentionに「c」を選択後、「Finish」をクリックします。


Source Files に作成した「ソースファイル(pic13145_2_src.c)」が追加され、右側にC言語のひな形が入力された「エディタ」画面が表示されます。


メニューの「File」をクリックし、リストボックスから、「Exit」をクリックし、「MPLAB X IDE v6.20」を終了します。


コンフィグレーションビット

コンフィグレーションビットは、PIC16F13145の基本的な動作設定を行い、プログラム作成時にのみ変更できる特殊なビットの集まりで、リセット時に読み出され、PIC16F13145のハードウェア機能を有効または無効にします。

「MPLAB X IDE v6.20」を起動し、メニューの「Window」→「Target Memory Views」→「Configuration Bits」をクリックします。


「Configuration Bits」ウィンドウが、MPLAB X IDEの下部に表示されます。


▶️コンフィグレーションビットの設定

コンフィグレーションビットを「Option」を次のように設定し、「Generare Source Code to Outoput」をクリックします。

FieldOption説 明
コンフィグレーションビット1
FEXTOSCOFF外部発振器を使わない(内部発振器を使用)
RSTOSCHFINTOSC_1MHzリセット後の発振器をHFINTOSC_1MHzに設定する
CLKOUTENOFFクロック信号を外部端子に出力しない
CSWENONOSCCON1(発振器レジスタのNOSC(発振器の種別)とNDIV(分周比)の設定を許可する
VDDARHI内部アナログシステムをVDD = 2.3 - 5.5V間で動作するように設定する
FCMENON外部発振器が故障した場合でもデバイスが動作を継続できるようにする
コンフィグレーションビット2
MCLREEXTMCLRMCLR ピンを有効にする
PWRTSPWRT_OFF電源投入タイマー (PWRT)を無効にする
LPBORENOFFブラウンアウトリセット(電源が規定値以下になったときにリセット)を無効にする
BORENON動作中はブラウンアウトリセット有効、スリープ中は無効。SBORENビットは無視される
DACAUTOENOFFDACバッファの基準範囲はREFRNGビットによって決定される(REFRNG=1:VSS+ 1.0V ~ VDD、REFRNG=0:VSS~ VDD- 1.0V)
BORVLOブラウンアウトリセット電圧 (VBOR )を 1.9V に設定する
PPS1WAYONPPSLOCKビットをロック解除シーケンスを実行後に一度のみセットできる。一度PPSLOCK がセットされると、その後PPS は変更できない
STVRENONスタックがオーバーフローまたはアンダーフローした場合、デバイスはリセットされる
DEBUGOFFバックグラウンドデバッガーを無効にする
コンフィグレーションビット3
WDTCPSWDTCPS_31ウォッチドックタイマー(WDT)の周期を2秒(1:65536)に設定する
WDTEOFFウォッチドックタイマーを無効にする
WDTCWSWDTCWS_7ウォッチドッグウィンドウを常時開放(100%)する
WDTCCSSCWDT入力クロックをソフトウェア制御する
コンフィグレーションビット4
BBSIZEBB512メモリアクセスパーティション (MAP)のブートブロックサイズを512ワードに設定する
BBENOFFブートブロックを無効に設定する
SAFENOFFメモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)を無効に設定する
WRTAPPOFFメモリアクセスパーティション (MAP)のアプリケーションブロックの書き込みを保護しない
WRTBOFFメモリアクセスパーティション (MAP)のブートブロックの書き込みを保護しない
WRTCOFFコンフィギュレーションレジスタの書き込みを保護しない
WRTSAFOFFメモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)の書き込みを保護しない
LVPON低電圧プログラミングエントリーモードを有効にする
コンフィグレーションビット5
CPOFFプログラムフラッシュメモリコードの書き込みを保護しない



「Output – Config Bits Source」ウィンドウに設定したフィギュレーション・ビットのコードが、自動的に生成されますので、このコードをコピーしてソース・ファイルに貼り付けます。

※今回は貼り付けしません


または、「Output – Config Bits Source」ウィンドウ上で、「Ctrl」+「s」キーを押すと、「Save Output As」ダイアログが表示されますので、任意のフォルダとファイル名を設定して保存し、プロジェクトに追加します。


「MPLAB X IDE v6.20」を終了します。


プログラムの作成とビルド

ソースファイル(16f13145_2_src.c)のエディタに、プッシュスイッチを押している間はLEDが100ms間隔で点滅し、スイッチから手を離すと500ms間隔で点滅するC言語プログラムを作成します。

プログラムの入力

「MPLAB X IDE v6.20」を起動し、「Projects」ウィンドウのソースファイル(16f13145_2_src.c)のエディタを表示ます。(表示されていない場合は、ソースファイルをダブルクリックします)

次のプログラムをエディタに入力するか、コピー、貼り付けします。

/*------------------------------------------------------------------------------
LED点灯/消灯プログラム
 * File:   16f13145_2.c
 * Author: Hagetamaboti
 * Created on 2026/01/dd
------------------------------------------------------------------------------
ライセンス:SPDX-License-Identifier: MIT
------------------------------------------------------------------------------*/	

/******************************************************************************
* PIC16F13145 コンフィグレーションビットの設定
*******************************************************************************/

//コンフィグレーションビット1
#pragma config FEXTOSC = OFF            // 外部発振器を使わない(内部発振器を使用)
#pragma config RSTOSC = HFINTOSC_1MHz	// リセット後の発振器をHFINTOSC_1MHzに設定する
#pragma config CLKOUTEN = OFF           // クロック信号を外部端子に出力しない
#pragma config CSWEN = ON               // OSCCON1(発振器レジスタのNOSC(発振器の種別)とNDIV(分周比)の設定を許可する
#pragma config VDDAR = HI               // 内部アナログシステムをVDD = 2.3 - 5.5V間で動作するように設定する
#pragma config FCMEN = ON               // 外部発振器が故障した場合でもデバイスが動作を継続できるようにする

//コンフィグレーションビット2
#pragma config MCLRE = EXTMCLR          // MCLR ピンを有効にする
#pragma config PWRTS = PWRT_OFF         // 電源投入タイマー (PWRT)を無効にする	
#pragma config LPBOREN = OFF            // ブラウンアウトリセット(電源が規定値以下になったときにリセット)を無効にする
#pragma config BOREN = ON               // 動作中はブラウンアウトリセット有効、スリープ中は無効。SBORENビットは無視される
#pragma config DACAUTOEN = OFF          // DACバッファの基準範囲はREFRNGビットによって決定される(REFRNG=1:VSS+ 1.0V ? VDD、REFRNG=0:VSS? VDD- 1.0V)
#pragma config BORV = LO                // ブラウンアウトリセット電圧 (VBOR )を 1.9V に設定する
#pragma config PPS1WAY = ON             // PPSLOCKビットをロック解除シーケンスを実行後に一度のみセットできる。一度PPSLOCK がセットされると、その後PPS は変更できない
#pragma config STVREN = ON              // スタックがオーバーフローまたはアンダーフローした場合、デバイスはリセットされる
#pragma config DEBUG = OFF              // バックグラウンドデバッガーを無効にする

//コンフィグレーションビット3
#pragma config WDTCPS = WDTCPS_31       // ウォッチドックタイマー(WDT)の周期を2秒(1:65536)に設定する
#pragma config WDTE = OFF               // ウォッチドックタイマーを無効にする
#pragma config WDTCWS = WDTCWS_7        // ウォッチドッグウィンドウを常時開放(100%)する
#pragma config WDTCCS = SC              // WDT入力クロックをソフトウェア制御する

//コンフィグレーションビット4
#pragma config BBSIZE = BB512           // メモリアクセスパーティション (MAP)のブートブロックサイズを512ワードに設定する
#pragma config BBEN = OFF               // ブートブロックを無効に設定する
#pragma config SAFEN = OFF              // メモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)を無効に設定する
#pragma config WRTAPP = OFF             // メモリアクセスパーティション (MAP)のアプリケーションブロックの書き込みを保護しない
#pragma config WRTB = OFF               // メモリアクセスパーティション (MAP)のブートブロックの書き込みを保護しない
#pragma config WRTC = OFF               // コンフィギュレーションレジスタの書き込みを保護しない
#pragma config WRTSAF = OFF             // メモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)の書き込みを保護しない
#pragma config LVP = ON                 // 低電圧プログラミングエントリーモードを有効にする

//コンフィグレーションビット5
#pragma config CP = OFF                 // プログラムフラッシュメモリコードの書き込みを保護しない


/******************************************************************************
* ヘッダファイルの取り込み
*******************************************************************************/

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

/******************************************************************************
* 定数定義
*******************************************************************************/

#define _XTAL_FREQ 1000000      // 遅延関数(__delay_ms)を使用するためにシステムクロック(1MHz)を設定

/******************************************************************************
* メイン関数
*******************************************************************************/

void main(void) {

    //SFR(特殊機能レジスタ)設定
    PORTA   = 0x00;             // PORTAをクリア
    PORTB   = 0x00;             // PORTBをクリア 
    PORTC   = 0x00;             // PORTCをクリア 

    LATA    = 0x00;             // データラッチAをクリア
    LATB    = 0x00;             // データラッチBをクリア
    LATC    = 0x00;             // データラッチCをクリア

    ANSELA  = 0x00;             // アナログ入力Aは使用しない(すべてデジタルに設定)
    ANSELB  = 0x00;             // アナログ入力Bは使用しない(すべてデジタルに設定)
    ANSELC  = 0x00;             // アナログ入力Cは使用しない(すべてデジタルに設定)

    TRISA   = 0x00;             // PORTA:すべて出力(RA3は入力のみ)
    TRISB   = 0x00;             // PORTB:すべて出力
    TRISC   = 0x08;             // PORTC:RC3(SW0)は入力。RC2を含みその他すべて出力

    WPUC3   = 1;                // RC3(SW0)をプルアップ

//無限ループ

    while(1)
    {
        //プッシュスイッチ(SW0)を指から離す
        if (RC3)
        {
            //LED0(RC2)500ms間隔で点滅
            LATC2 = 1;              // 点灯
            __delay_ms(500);        // 500ms待ち
            LATC2 = 0;              // 消灯
            __delay_ms(500);        // 500ms待ち   
        }
        //プッシュスイッチ(SW0)を指で押す
        else
        {
            //LED0(RC2)100ms間隔で点滅
            LATC2 = 1;              // 点灯
            __delay_ms(100);        // 100ms待ち
            LATC2 = 0;              // 消灯
            __delay_ms(100);        // 100ms待ち   
        }
    
    }

    
    return;
}



ビルド

ビルドは、ソースファイルから、PICに書込むための実行ファイルを生成しますが、プログラムに文法上のエラー等がある場合は、実行ファイルが生成されません。

ツールバーのビルドアイコンをクリックし「Build for Debugging (xxxxxxx)」を選択すると、ビルドが開始しデバッグ用のファイル(xxxxxx.elf)が作成されます。


▶️正常にビルドが完了

正常にビルドが完了すると「Output – xxxx (Buil. Load)」ウィンドウに「BUILD SUCCESSFUL (total time: xxxms)」が表示されます。


▶️エラーでビルドが完了

エラーがあり、ビルドが失敗した場合は、ツールバーのデバッグアイコンをクリックし、デバッグモードを開始します。


デバッグ用ツールバーに変更されますので、ブレークポイント機能等を利用し、エラーが無くなるまでデバッグを行います。


デバッグ法方については、マイクロチップ社のマニュアル(英語)を参照してください。


実行ファイルをPICに書込む

MPLAB X IDE v6.20 を使って作成、ビルドしたC言語プログラムを、PIC16F13145 Curiosity Nano 評価キットのオンボードデバッガー経由でPIC16F13145に書込みます。

プログラムの書込み

「Make and Program Device 」をクリックすると、プログラムのコンパイルが開始され、コンパイルに成功するとPIC16F13145への書き込みが開始されます。


書込みが成功すると、Outputウィンドウに「Programming complete」と表示されます。


性能確認


プッシュスイッチを押している間はLEDが100ms間隔で点滅し、スイッチから手を離すと500ms間隔で点滅します。




まとめ

MPLAB X IDE v6.20を使ってC言語でプログラミングを行いました。

PIC16F13145 Curiosity Nano 評価キットの上のLEDとプッシュスイッチを利用して、プッシュスイッチを押している間はLEDが100ms間隔で点滅し、スイッチから手を離すと500ms間隔で点滅するプログラムを作成しました。

今回は、設定の基本を学習するために、PICマイコンの周辺モジュール関連の設定を自動的に生成するツール(MPLAB Code Configurator:MCC)を使用せず、手動でプログラムを作成しました。