「第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」をクリックします。
| Field | Option | 説 明 |
| コンフィグレーションビット1 | ||
| FEXTOSC | OFF | 外部発振器を使わない(内部発振器を使用) |
| RSTOSC | HFINTOSC_1MHz | リセット後の発振器をHFINTOSC_1MHzに設定する |
| CLKOUTEN | OFF | クロック信号を外部端子に出力しない |
| CSWEN | ON | OSCCON1(発振器レジスタのNOSC(発振器の種別)とNDIV(分周比)の設定を許可する |
| VDDAR | HI | 内部アナログシステムをVDD = 2.3 - 5.5V間で動作するように設定する |
| FCMEN | ON | 外部発振器が故障した場合でもデバイスが動作を継続できるようにする |
| コンフィグレーションビット2 | ||
| MCLRE | EXTMCLR | MCLR ピンを有効にする |
| PWRTS | PWRT_OFF | 電源投入タイマー (PWRT)を無効にする |
| LPBOREN | OFF | ブラウンアウトリセット(電源が規定値以下になったときにリセット)を無効にする |
| BOREN | ON | 動作中はブラウンアウトリセット有効、スリープ中は無効。SBORENビットは無視される |
| DACAUTOEN | OFF | DACバッファの基準範囲はREFRNGビットによって決定される(REFRNG=1:VSS+ 1.0V ~ VDD、REFRNG=0:VSS~ VDD- 1.0V) |
| BORV | LO | ブラウンアウトリセット電圧 (VBOR )を 1.9V に設定する |
| PPS1WAY | ON | PPSLOCKビットをロック解除シーケンスを実行後に一度のみセットできる。一度PPSLOCK がセットされると、その後PPS は変更できない |
| STVREN | ON | スタックがオーバーフローまたはアンダーフローした場合、デバイスはリセットされる |
| DEBUG | OFF | バックグラウンドデバッガーを無効にする |
| コンフィグレーションビット3 | ||
| WDTCPS | WDTCPS_31 | ウォッチドックタイマー(WDT)の周期を2秒(1:65536)に設定する |
| WDTE | OFF | ウォッチドックタイマーを無効にする |
| WDTCWS | WDTCWS_7 | ウォッチドッグウィンドウを常時開放(100%)する |
| WDTCCS | SC | WDT入力クロックをソフトウェア制御する |
| コンフィグレーションビット4 | ||
| BBSIZE | BB512 | メモリアクセスパーティション (MAP)のブートブロックサイズを512ワードに設定する |
| BBEN | OFF | ブートブロックを無効に設定する |
| SAFEN | OFF | メモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)を無効に設定する |
| WRTAPP | OFF | メモリアクセスパーティション (MAP)のアプリケーションブロックの書き込みを保護しない |
| WRTB | OFF | メモリアクセスパーティション (MAP)のブートブロックの書き込みを保護しない |
| WRTC | OFF | コンフィギュレーションレジスタの書き込みを保護しない |
| WRTSAF | OFF | メモリアクセスパーティション (MAP)のストレージエリアフラッシュ(SAF)の書き込みを保護しない |
| LVP | ON | 低電圧プログラミングエントリーモードを有効にする |
| コンフィグレーションビット5 | ||
| CP | OFF | プログラムフラッシュメモリコードの書き込みを保護しない |

「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)を使用せず、手動でプログラムを作成しました。