演習用のmain.cを作成する
まずは、演習用としてのmain.cを作成してみましょう。
前回、PICマイコンの開発環境としてMPLAB Xをインストールしていただきました。
テスト用としてStudy1というプロジェクトを生成するところまで進めていただいたと思います。
もし、忘れてしまったり、生成がまだの方はTOPページの「PICマイコン置き換え」を上から順番に読みつつ、遂行してみてください。
このプロジェクトを生成した際に、どのディレクトリに生成するかを指定されたと思います。
ご自身のPC内で生成されたStudy1というフォルダーへ移動してください。
どこか分からない方は以下を参考に確認をしてください。
[プロジェクトを生成したディレクトリ確認方法]
①MPLABX内の左にあるプロジェクトメニューから、
赤丸部のプロジェクト名「Study1」を右クリック
②メニューダイアログが出現するので、最下部にある「properties」をクリック
③中央にあるプロパティwindowが出現するので、赤丸部の「General」をクリック
④同じWindow内の中央最上部の赤色四角囲み「Project Location」にディレクトリパスが表示されます。

プロジェクトディレクトリ内にmain.cファイルを作成する
上記の手順でプロジェクトフォルダにたどり着けた方は、テキストファイルとして「main.c」のファイル名で新規作成をしてください。
フォルダ構成は以下の様になっていると思いますので、同じ階層にmain.cを作成します。
Study1
┗ debug
┗ nbproject
┗ Makefile
┗ mcc-manifest-autosave.yml
┗ Study1.mc3
┗ main.c
参考書の解説の際にも説明しましたが、C言語はプロジェクト内に一つのmain関数を用意することがルールになり、main関数はmain.cというファイルに用意することにします。
ファイルが新規作成できたら、中身はまだ白紙です。
ここにプログラムを書いて行くのですが、ソースファイルやヘッダーファイルを作成した際、
ファイルの冒頭には以下の様なファイルの説明をコメントで書く様にしてください。
/***********************************************************************************
* *
* File: main.c *
* version 1.00 2026/03/04 (PIC16F1614) *
* Description: *
* *
* Date By Description *
* 2026/03/04 Yoshiki Eto 新規作成 *
* Copyright (C) XXXXXXXX. *
* XXXXXXX All rights reserved. *
* *
***********************************************************************************/
コメントは /* */ で囲まれた範囲であることは解説済みです。
その上で、ファイル説明を書く理由としては以下です。
・いつ作成されたのか(=作成日)
・どの様なマイコンを対象としているのか(=マイコン型番)
・作成した人の氏名、作成目的(=新規作成でよい)
・著作権表記(=会社名など)
※XXXXXXXは会社名や個人名などを入れてください。
コンフィグレーションビット定義を書く
PICマイコンには、マイコンが動作するためのデフォルトの設定を定義する機能があります。
言わば、PICマイコンの環境設定とも言われており、コンフィグレーションビットをソースコードに対して以下の様に定義します。
#pragma config レジスタビット名 = 設定値
レジスタビット名は、PICマイコンの仕様書に書かれています。
PIC16F1614の仕様書では、P67 「4.2 Resister Definitions: Configuration Words」です。
設計時に仕様書の該当ページを見ながら、適切な設定に仕上げていきます。
各項目の解説と設定について解説していきますが、仕様書にも英文ですが解説がされています。
/***********************************************************************************
* *
* File: main.c *
* version 1.00 2026/03/04 (PIC16F1614) *
* Description: *
* *
* Date By Description *
* 2026/03/04 Yoshiki Eto 新規作成 *
* Copyright (C) XXXXXXXX. *
* XXXXXXX All rights reserved. *
* *
***********************************************************************************/
/***********************************************************************************
* *
* Configuration *
* *
***********************************************************************************/
#pragma config CLKOUTEN = OFF
#pragma config BOREN = ON
#pragma config CP = ON
#pragma config MCLRE = ON
#pragma config PWRTE = ON
#pragma config FOSC = INTOSC
#pragma config LVP = OFF
/* #pragma config DEBUG -> これはデバッガで制御されるのでここでは設定しない */
#pragma config LPBOR = OFF
#pragma config BORV = ON
#pragma config STVREN = ON
#pragma config PLLEN = ON
#pragma config ZCD = OFF
#pragma config PPS1WAY = OFF
#pragma config WRT = OFF
#pragma config WDTCCS = SC
#pragma config WDTCWS = WDTCWS_7
#pragma config WDTE = OFF
#pragma config WDTCPS = WDTCPS_31
#pragmaは、コンパイラに対してデータを任意セクションへ割り当てする時に使用します。
今回だと、指定のレジスタビットへ設定値を割り当てすることを指示する命令になります。
以下、今回のマイコンに備わっているコンフィグレーションビットの内容です。
・CLKOUTEN・・・クロック信号をポートから出力する/しないを設定。
ON:出力 OFF:出力しない
・BOREN・・・マイコンの電源電圧が低下したときにマイコン動作を停止する設定。
ON:する OFF:しない
・CP・・・Code Protectの略。プログラムの読み取りが外部からできるかどうかを設定。
ON:読み取り不可 OFF:読み取り可
・MCLRE・・・MCLRピンをRESET端子として使用するか否か。
ON:リセット端子として使用 OFF:I/O端子などで使用
・PWRTE・・・パワーアップタイマーの設定。起動直後に動作が安定するまで規定時間を待つ。
ON:有効にする OFF:無効にする
・FOSC・・・マイコンの駆動クロック信号を外部供給とするか、内部生成とするかを設定。
111:EXTRC 外部RC発振モード OSC2ピンはクロック出力
110:EXTRC 外部RC発振モード OSC2ピンは汎用入出力
101:INTOSC 内蔵クロックモード OSC2ピンはクロック出力 OSC1ピンは汎用入出力
100:INTOSC 内蔵クロックモード OSC2ピンは汎用I/O OSC1ピンも汎用I/O
011:EC 外部発振器モード OSC2ピンはRA6として汎用
010:HS HSモード 10MHz以上の高速な水晶発振子を使用する場合の設定
001:XT XTモード そのままの周波数で使用
000:LP LPモード 32.768kHzなどの時計用水晶を使用する場合の設定
・LVP・・・低電圧書き込み許可指定
ON:許可 OFF:禁止
・LPBOR・・・低電圧ブラウンアウトリセットの設定。
ON:電源電圧が一定の電圧より下がったらリセットを行う OFF:機能無効
・BORV・・・ブラウンアウトリセット電圧
LO:低い方の値を電源が下回るとリセット HI:高い方の値を電源が下回るとリセット
・STVREN・・・スタックメモリがオーバーフローした際にリセット作動設定
ON:リセットする OFF:リセットしない
・PLLEN・・・PPLにてクロック周波数を4倍にする機能を有効にするかどうか
ON:有効 OFF:無効
・ZCD・・・ゼロクロス機能で検出を行うかどうか ※御社の製品ではこの機能を使う予定
ON:有効 OFF:無効
・PPS1WAY・・・PPS Moduleを変更した後、変更できないようにロックするかどうか。
ON:有効 OFF:無効
・WRT・・・プログラム領域書き込み制御の有効化
ALL:すべての領域 000h〜FFFhを書き込み禁止
HALF:アドレス 000h〜7FFhの領域を書き込み禁止。
800h~FFFhはPMCONレジスタ設定次第
BOOT:アドレス 000h〜1FFhの領域を書き込み禁止
200h~FFFhはPMCONレジスタ設定次第
OFF:書き込み禁止設定をしない
・WDTCCS・・・ウォッチドッグタイマの動作源となるクロックの設定
111:プログラムから設定(CSで設定)
001:MFINTOSCが基準クロックとなり31.25KHz
000:LFINTOSCが基準クロックとなり31.00KHz
・WDTCWS・・・ウォッチドッグタイマが特定の時間帯内でクリアを許可。その時間帯を設定。
仕様書のWDTCWSの組み合わせを参照し、WDTCWSの3bitへ値を設定。
・WDTE・・・ウォッチドッグタイマの有効/無効
ON:有効 OFF:無効
・WDTCPS・・・ウォッチドッグタイマのリセット時間
仕様書のWDTCPSの組み合わせを参照し、WDTCPSの5bitへ値を設定
このように、動作の基盤となる設定を行うことができ、最初に設定を確立すると以降では、あまり変更することが無いような設定項目になります。
今現在は、学習用なので上記コードのままコピーして使用します。
PICのヘッダーファイル
上記の解説やコード例内には、OFF、ON、INTOSCといった設定値がそのまま記述されています。
参考書の学習を思い出していただくと、定義されたいない文字列や単語を記述するとエラーになると解説しましたので、どこかで誰かが定義してくれていることになります。
PICマイコンでは、メーカーがレジスタ名、レジスタに定義する値と設定名を用意してくれており、以下の記述にて参照することが可能となります。
#include <xc.h>
開発環境が参照しにいくディレクトリにxc.hというヘッダーファイルが置いてあり、中身にはレジスタなどのPICマイコンの指定型番で必要となる記述が既に定義されています。
そのファイル内に、ON、OFFといった汎用的な定義も存在するということです。
故に、プログラムコード内でレジスタへ設定を書くことも出てきますので、
以下の様にヘッダーファイルを読み込みしておく必要があります。
/***********************************************************************************
* *
* File: main.c *
* version 1.00 2026/03/04 (PIC16F1614) *
* Description: *
* *
* Date By Description *
* 2026/03/04 Yoshiki Eto 新規作成 *
* Copyright (C) XXXXXXXX. *
* XXXXXXX All rights reserved. *
* *
***********************************************************************************/
/***********************************************************************************
* *
* Configuration *
* *
***********************************************************************************/
#pragma config CLKOUTEN = OFF
#pragma config BOREN = ON
#pragma config CP = ON
#pragma config MCLRE = ON
#pragma config PWRTE = ON
#pragma config FOSC = INTOSC
#pragma config LVP = OFF
/* #pragma config DEBUG -> これはデバッガで制御されるのでここでは設定しない */
#pragma config LPBOR = OFF
#pragma config BORV = ON
#pragma config STVREN = ON
#pragma config PLLEN = ON
#pragma config ZCD = OFF
#pragma config PPS1WAY = OFF
#pragma config WRT = OFF
#pragma config WDTCCS = SC
#pragma config WDTCWS = WDTCWS_7
#pragma config WDTE = OFF
#pragma config WDTCPS = WDTCPS_31
#include <xc.h>
void main(void)
{
}
xc.hのinclude宣言が記述できれば、お馴染みのmain関数を記載します。
参考書と異なる点があるとすれば、main関数の戻り値がvoidになっている点です。
PICマイコンのコンパイラであるXC8コンパイラでは、この様に関数定義されているので、定義通りに記載をしています。
さぁ、やっとmain関数の中にプログラムが書ける状態になりました。
この状態で独力でLED点灯/消灯のプログラムを考えていただくことにしたいと思います。
オンラインの座学で一方的に読んで・理解を深めて・・・では、おもしろくないですし、
頭で理解ができた!というのと、実際にアウトプットできるかどうか?は別物なので、
後ほど解説を提供することとしまして、任意のI/OポートにLEDを接続する前提で制御を書いてみてください。
ヒントとすべきことを以下に簡単に記載しますので、仕様書を読解しつつ一度Tryしてみてください。
[LED点灯/消灯プログラムに必要な内容]
・main関数内に点灯/消灯の処理を記述する
・マイコンのクロックは内部生成としています。
config設定の通り、FOSCを内部生成としており、手軽にクロック部品なしで動作想定。
①LEDをどの端子に接続するべきかを決める
⇒I/Oポートであれば、どの端子でも問題はないので好きなI/Oポートに繋ぐ想定でよい。
②接続するI/Oポートを出力設定にする
③接続するI/Oポートの出力値にHIGH出力 or LOW出力に設定する
動作に必要な基盤設定は、Configビットで設定がされているはずなので、LEDを駆動する端子の設定を①~③に準じて遂行できれば、点灯/消灯はできるようになる見込みです。
HIGH出力で点灯させたい場合、LEDのアノード側にI/O端子を接続し、カソード側には制限抵抗を介してGNDへ接続する想定になります。
LOW出力で点灯させたい場合、LEDのカソード側に制限抵抗を介してI/O端子を接続し、アソード側には電源接続する想定になります。
HIGH or LOWのどちらで点灯としていただいて構いません。
また、現状のmain関数の{ }内部に処理を記載しますと、上から順次処理を行い、
記載したプログラムを全て実行すれば終了してしまいます。
今はその状態でよいので、点灯処理を書くことができれば、main関数を実行してLEDが点灯して終了。というプログラムができることになります。
まずは、ここまでを目標に進めてみたいと思います。
2、3日経過した辺りで、模範的なコード例をご紹介したいと思います。