この記事は PICマイコン Advent Calendar 2025 8日目の記事です。
1.はじめに
今回は電子工作における Hello World である Lチカを、PICマイコンで行います。
この記事では、MCCなどのコンフィギュレーターを使わず、レジスタを直接操作する方法で解説します。
この記事を読むことで、Configuration Bits の設定方法と簡単なレジスタ操作が理解できるようになります。
もし、MPLABの操作方法でわからないことがあったら下記の記事を参照してみてください。
2.使用マイコン
本記事ではPIC24Fファミリに属するPIC24FJ64GB002を使用します。
LEDはRB10とRB11に接続しています。
秋月電子で販売されているマイコンなので入手性は良いと思います。
3.Configuration Bitsの設定
この記事では、Configuration Bitsをconfig.hに書きました。
デフォルトのまま変えずに、CONFIG1は0x7FFF、CONFIG2~4は0xFFFFになりました。
Configuration Bitsの設定方法は下記の記事で解説しているので、参照してみてください。
4. レジスタの設定
必要なヘッダファイルのinclude
まず必要なヘッダファイルを読み込みます。
stdio.hとstdlib.hをincludeします。
つぎに、内部命令サイクルクロックであるFCYをdefineします。
今回はプロセッサのクロックソースを8MHzに設定するので、これを2分周した4MHzとしています。
ちなみに、この命令サイクルクロックをFOSC/2と表記することもあります。
その後、便利なマクロが含まれるlibpic30.hをincludeします。
このlibpic30.hをincludeする際は、FCYのdefineがされていないと意図しない挙動になることがあるので注意してください。
あと、Configuration Bitsの設定をしたconfig.hをincludeします。
クロックの設定
モジュール系の初期化は、多くの場合0x0000に設定すれば問題ありません。
今回はOSCCONとCLKDIVを0x0000に設定しています。この場合、OSCCON ではFRCが選択され、CLKDIVでは全て1分周でFRCは8MHzとなります。
詳細は下記のリファレンスマニュアルを参照してください。
アナログピンの設定
一部のピンがデフォルトでアナログ入力に設定されています。
今回の場合はあまり関係がないですが、アナログピンのままだとピンの状態が読めないです。
その影響で他のペリフェラルに影響を及ぼすことがあるので、慣習的にAD1PCFGを0xffffにして無効にしておきます。
I/Oピンの操作
TRISレジスタは各ポートピンの方向を制御するレジスタです。
対応するビットが1の場合は入力ピンになり、0の場合は出力ピンとなります。
覚えやすくするなら、1 を「I(Input)」、0 を「O(Output)」というように見立てると理解しやすいです。
TRISx(今回は TRISA と TRISB)を 0xFFFF に設定すると、全てのピンが入力状態になります。
リセット時も全ピンは入力ですが、安全のため明示的に設定しておきます。
LED を点灯させるため、TRISBのRB10とRB11ビットを0に設定して出力するように変更します。
これにより、該当ピンから出力できるようになります。
LEDの制御はLATレジスタで行います。
LATがHighになると出力がHighになり、Lowになったら出力もLowになります。
今回は、RB11に接続されているLEDは常時点灯させるようにしています。
RB10に接続されているLEDを1秒周期で点滅させるために、__delay_ms()関数を使用します。
libpic30 には__delay_ms()と__delay_us()が定義されており、今回は__delay_ms(1000)を使用します。
クロック設定やFCYのdefineが正しくない場合、期待通りの周期にならないため注意してください。
トグルはLATレジスタの値を反転させて行います。PORTではなくLATを反転させる理由は、出力する値として保持された値を直接操作する方が適切だからです。
コード例
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#define FCY 4000000
#include <libpic30.h>
int main(int argc, char** argv){
OSCCON = 0x0000;
CLKDIV = 0x0000;
AD1PCFG = 0xffff;
TRISA = 0xffff;
TRISB = 0xffff;
TRISBbits.TRISB10 = 0;
TRISBbits.TRISB11 = 0;
LATBbits.LATB11 = 1;
while(1){
LATBbits.LATB10 = ~LATBbits.LATB10;
__delay_ms(1000);
}
return (EXIT_SUCCESS);
}
5. 書き込み
書き込みは MPLAB X IDE 上で行います。
初めての場合は書き込み機を選択する必要があります。私は MPLAB Snap を使用しているため Snap を選択しました。
正常に書き込めた場合、LEDが点滅します。
書き込みがうまくいかない場合は以下を確認してください。
-
プロジェクトが Set as main project に設定されているか
-
PIC24FJ64GB002でプロジェクトを作成できているか
-
プロジェクトの Properties で ToolがSimulation になっていないか
6.おわりに
今回は、PIC24FJ64GB002 を用いて、MCC などのコンフィギュレーターを使わずにレジスタを直接操作する方法で Lチカをしました。
やっていること自体は単純ですが、初心者の方にとってはクロック設定やピン操作などで意外と難しい部分もあったかもしれません。
この記事が、マイコンの基礎を理解する際や、今後の電子工作の参考になれば嬉しいです。