PICマイコンでLEDを点滅する方法を知りたい。
PIC マイコンで電子工作を始めようと思っているなら、まずは LED を点滅させてみましょう。
この記事ではLチカする手順を図やサンプルコードを用いて、初心者の方でも分かるように丁寧に解説をしています。
ぜひ参考にしてみてください!!
この記事で紹介する書き込み環境
- PICマイコン:16F1827
- パソコン:Windows 11 のノートパソコン
- 統合開発環境:MPLAB X IDE – version6.20
- 書き込みライター:PICkit3
まだ、MPLAB X IDEのインストールが完了していない方は次の記事を参考にしてみてください。
オススメの参考書
PIC マイコンの基本的な使い方を知りたい方にオススメの参考書です。
簡単な LED ボードの製作から、液晶表示器や温湿度センサの使い方、パソコンとの通信、Wi-Fiを使ってクラウドにデータを送信しグラフ表示させるところまで、具体的な製作方法が紹介されています。
参考書には専門用語の説明やアドバイスや回路のポイントなどが豊富に記載されているので、内容を理解しながら読み進めることができる1冊となっています。
LEDを点滅させる
この記事では PIC16F1827 を使用して、LEDを約1秒毎に点滅(Lチカ)させます。
LED を点滅させるために使用するピン番号は11番(RB5)にします。
配線はシンプルでマイコンの14番(Vdd)に電源のDC5V、5番(Vss)を電源のGND、11番(RB5)に抵抗とLEDを直列で接続します。LED の足が短い方がGNDに繋がるようにします。
コンフィギュレーションを設定する
PIC マイコンのプログラムでは PIC マイコンの動作設定を指定する必要があります。正しく指定していないと PIC マイコンが正しく動作しない原因になります。
プログラムを書く前に MPLAB X IDE で PIC マイコンの動作設定を行いましょう。
メニュバーから[Production] -> [Set Configuration Bits] を選択します。
MPLAB X IDEの画面の下部に Configuration Bits の設定欄が表示されます。
Option 列で設定の変更を行います。PIC の種類によって設定項目が違いますが、基本的な設定項目はどの PIC マイコンも共通です。ここでは次の3つの設定を行います。
- FOSC : INTOSC (内蔵発振器使用)
- WDT : OFF (ウォッチドッグタイマー不使用)
- LVP : OFF (定電圧プログラミング不使用)
クロックの設定について
PIC の動作にはクロック(Clock)が必要です。クロックは PIC の動作タイミングを決定する信号です。クロック信号が速いほど、PIC マイコンの速度が速くなります。
クロック源として内蔵発振子や外部発振子(水晶発振子、セラミック発振子)を使います。時計を使用する場合や高精度なクロックを必要としない場合は、内蔵発振子を選択するといいでしょう。
ウォッチドッグタイマーの設定について
ウォッチドッグタイマーはプログラムが正常に動作しているかを監視し、異常が発生した(プログラムが無限ループしている等)場合にハードウェア的に強制的にリセットをかける機能です。
プログラム開発中にウォッチドッグタイマーが作動して頻繁にりれせっとされると、デバッグが困難になる場合があるので、ここではウォッチドッグタイマーを「OFF」にします。
定電圧プログラミングの設定について
定電圧プログラミングとは、PIC マイコンにプログラムを書き込む時に通常は高電圧をかけて書き込みするのに対して、一定の電圧を使用して書き込みする機能です。
ここでは通常の書き込み方法で対応をするので、定電圧プログラミングは「OFF」にします。
設定が終わったら、[Generate Source Code to Output] ボタンをクリックします。
[Output] タブにテキストが出力されるので、テキスト全部を選択してコピーします。
コピーしたテキストを main ファイルの先頭に貼り付けます。
main ファイルには#include <xc.h>
が書かれていますが、これは重複しないようにしてください。
ピンの入出力を設定する
マイコンのピンの入出力設定を行います。
RAx や RBx がピンの名称です。ピンは8個を1つのセットとして管理されていて、この1セットをポートと呼びます。ポートにはポートA やポートB があり、RA1 や RA2はポートA、RB1 や RB2 はポートB に含まれます。
ピンの入出力設定は TRISA / TRISB レジスタで行います。TRISA が ポートA、TRISB がポートB に対応しています。
TRISA | |||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
ビットが「0」の場合は「出力」、ビットが「1」の場合は「入力」になります。例えば、上の表で RA7(TRISAのbit7)は1のなので、RA7は入力になります。
今回は入力は使用しないので、全てのピンを出力に設定します。(MCLR の RA5 は入力専用ピンなので、1にします。)
TRISA = 0b00100000;
TRISB = 0b00000000;
ピンのデジタル/アナログを設定する
マイコンのピンのデジタル / アナログの設定を行います。
ピンのデジタル/アナログの設定は ANSELA / ANSELB レジスタで行います。ANSELA が ポートA、ANSELB がポートB に対応しています。
ANSELA | |||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
ビットが「0」の場合は「デジタル」、ビットが「1」の場合は「アナログ」になります。例えば、上の表で RA7(TRISAのbit7)は1のなので、RA7はアナログになります。
今回は全てのピンをデジタルに設定します。
ANSELA = 0b00000000;
ANSELB = 0b00000000;
内蔵発振子の周波数を設定する
内蔵発振子を使う場合はクロック周波数を設定することができます。
クロック周波数の設定はOSCCON レジスタで設定します。1MHz や 4MHz、8MHz、16MHz などが利用できます。
OSCCON | |||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
SPLEN | IRCF3 | IRCF2 | IRCF1 | IRCF0 | – | SCS1 | SCS0 |
0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
青文字部分(IRCF3~IRCF0)を変更することで周波数を設定できます。赤文字部分(SCS1~SCS0)は内部周波数を使用する場合の設定です。bit2 は未割り当てなので0にします。
青文字部分を次のようにすると、特定の周波数を設定できます。
- OSCCON = 0b01111010
周波数は16MHzです。 - OSCCON = 0b01110010
周波数は8MHzです。 - OSCCON = 0b01101010
周波数は4MHzです。 - OSCCON = 0b01100010
周波数は2MHzです。 - OSCCON = 0b01011010
周波数は1MHzです。
今回はクロック周波数を1MHzに設定します。
OSCCON = 0b01011010;
使えるテクニックとして OSCCON レジスタの IRCFx だけ値を変更したい場合は、レジスタにbits.xx
を付けます。これはビットフィールドという構造体の一種です。
OSCCONbits.IRCF = 0b1011;
待機時間の周波数を設定する
LEDを点滅させるためにはLEDの点灯時間と消灯時間を設ける必要があります。こういう遅延させたい場合に便利な関数がdelay()
です。
この関数を使用するには周波数を指定する必要があります。この設定がないと delay 関数が正常に動作しません。
内部周波数が 1MHz なので、それに合わせて設定をします。ここでは2進数ではなく、10進数で記述しますので桁を間違えないようにしましょう。
#define _XTAL_FREQ 1000000
ここまでの内容をソースコードに記述すると次のようになります。
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config DEBUG = OFF // In-Circuit Debugger Mode (In-Circuit Debugger disabled, ICSPCLK and ICSPDAT are general purpose I/O pins)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 1000000
void main(void) {
TRISA = 0b00100000;
TRISB = 0b00000000;
ANSELA = 0b00000000;
ANSELB = 0b00000000;
OSCCON = 0b01011010; // 1MHz
return;
}
LEDが点滅するプログラムを実装する
ここからは Lチカする処理を書いていきます。Lチカするマイコンのピンは RB5 です。
出力の ON / OFF を切り替えるには、0もしくは1を代入します。
// 出力ON
RB5 = 1;
// 出力OFF
RB5 = 0;
この ON / OFF を繰り返すことで LED は点滅するのですが、待機時間がないので高速にON / OFF することになるので目視では点滅しているようには見えません。
そのため、delay 関数で指定した時間だけ待機する処理を追加します。関数の引数に待機時間(ミリ秒単位)を書きます。
// 出力ON
RB5 = 1;
// 500ms待機
__delay_ms(500);
// 出力OFF
RB5 = 0;
// 500ms待機
__delay_ms(500);
上記の内容を組み込むと全体のソースコードは次のようになります。
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config DEBUG = OFF // In-Circuit Debugger Mode (In-Circuit Debugger disabled, ICSPCLK and ICSPDAT are general purpose I/O pins)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 1000000
void main(void) {
TRISA = 0b00100000;
TRISB = 0b00000000;
ANSELA = 0b00000000;
ANSELB = 0b00000000;
OSCCON = 0b01011010; // 1MHz
while(1){
// 出力ON
RB5 = 1;
// 500ms待機
__delay_ms(500);
// 出力OFF
RB5 = 0;
// 500ms待機
__delay_ms(500);
}
}
プログラムを書き込む
マイコンへプログラムを書き込む前にビルドする必要があります。
ツールバーから[Build for Debugging Main Project] ボタンをクリックします。
[Output] ウィンドウに「BUILD SUCCESSFUL」と記載があればビルド成功です。
PC と書き込みライター(PICkit3 など)を接続します。
更に PICkit3(下図の左側)と PIC16F1827のピン(下図の右側)を接続します。
ツールバーから[Make and Program Device Main Project] ボタンをクリックします。
[Output] ウィンドウに「Programming/Verify complete」と記載があればビルド成功です。
動作を確認する
プログラムの書き込みが終わったマイコンに電源を供給しましょう。
ここでは乾電池3本を直列に接続して、約4.5V(乾電池:1.5V × 3本)の電圧を印加しています。
下のように LED が点滅されていれば完成です。
まとめ
この記事では PIC マイコンで LED を点滅させる手順について紹介しました。
Lチカを通して MPLAB X IDEの使い方やPICマイコンの仕様について理解して頂けたら幸いです。
PIC マイコンでできる事はまだまだ沢山あるので、このブログで紹介していきたいと思います。
オススメの参考書
PIC マイコンの基本的な使い方を知りたい方にオススメの参考書です。
簡単な LED ボードの製作から、液晶表示器や温湿度センサの使い方、パソコンとの通信、Wi-Fiを使ってクラウドにデータを送信しグラフ表示させるところまで、具体的な製作方法が紹介されています。
参考書には専門用語の説明やアドバイスや回路のポイントなどが豊富に記載されているので、内容を理解しながら読み進めることができる1冊となっています。
以上、最後まで読んでいただきありがとうございました。