【PICマイコン入門3】LED点滅プログラムの作り方

ソフト設計



この記事でわかること

・LED点滅プログラムの内容
・PIC16F886のソフトをPIC16F18857用に変更する手順
・コンフィグレーションレジスタによる動作環境の設定法

今回は、新居浜高専PICマイコン学習キットVer.3を使って
LEDを点滅させるプログラムについて解説します。

学習キットについては下記記事で解説しています。

学習キットはVer.1~3まであり、このVer.3は2022年に発売されたものです。
基板はVer.2と同じですが、搭載PICマイコンがPIC16F886から、
現在の定番であるF1ファミリのPIC16F18857に置き換わっています。

付属CDに入っているLED点滅プログラムはVer.2(PIC16F886)用のものであるため、
Ver.3(PIC16F18857)のキットでは、そのまま使用することができません。

本記事では、PIC16F886用のLED点滅プログラムを
PIC16F18857用に変更する手順を説明すると共に、
コンフィグレーションレジスタによる動作環境の設定方法についても解説します。

※本記事はPICマイコン学習方法の一例を紹介するものであり、
ここで紹介するキットやソフトの動作を保証するものではありません。
キット等の購入については自己責任でお願いします。
(不明点等の質問にはお答えできません)

LED点滅プログラムの説明

このプログラムはキットの緑色LED(D4)を一定間隔で点滅させます。
変更前(PIC16F886用)のソースコードは以下になります。

ここで、学習キットの回路について説明します。

キットには7セグメントLEDなど4種類のLEDが搭載されており、
これをマイコンからのデジタル出力信号(DO)で制御しますが、
DOの点数に制約があるため、下表に示すように各LEDへの信号は共用されています。

LS138は3to8デコーダで、
入力A,B,Cの信号線3つの組合せによってY0~7の出力8個のうち、
1つだけLにする動作をします。

この各出力はPNPトランジスタ(TR6~12)に接続されており、
L入力でトランジスタがONすると、LEDに5V電源が供給されることで、
点灯させるLEDを指定することができます。

ここでは、A,B,C入力がRA3,4,5に接続されているので、
ポートAの出力を2進数で0b00110000(16進数表示で0x30)にすることで、
8bit LEDを指定しています。



PIC16F18857用に変更する手順

ソフトの変更はプログラム開発ソフトMPLABを使います。
この時、デバッカであるPICkit4を介して学習キットとPCを接続しておきます。

MPLABとPICkitの使い方については、下記記事で解説しています。

1.プロジェクトを現在のMPLAB X IDEのバージョンにアップデートする
 LED点滅プログラムのプロジェクト(sample_LED.X)を開くと、
 プロジェクトを現在のMPLABのバージョンにアップグレードして良いか聞いてきます。

 NOを選択すると、ソースファイルに赤マークのエラー表示が出ます。

Yesを選択すると、現在のバージョンにアップグレードされ、エラー表示は出ません。
但し、以前のバージョンの IDE ではプロジェクトを開けなくなります。

どちらにしても、この後行うデバイス変更でアップグレードされます。

ビルドすると、アップグレードの有無に関係なく成功しますが、
プロジェクトのデバイス設定がPIC16F886なので、
学習キットVer.3(PIC16F18857)に書き込もうとしてもエラーとなります。

2.プロジェクトのデバイス設定を変更する
①画面左下のダッシュボード画面の設定アイコンをクリックするか、
 プロジェクト名をダブルクリックでプロパティ画面を開く

  ※ プロパティ画面を開く方法は他にもあります(MPLABの使い方を参照)

②デバイスをPIC16F886 → PIC16F18857に変更する
 デバイスを変更すると、画面にPlease select a compiler versionと赤文字表示されるので、
 コンパイラ指定画面のXC8をクリックすると、表示が消えます。

③ハードウェアツール(デバッカ)をPICkit4に設定する
 (PICkitが未接続だと選択肢にPICkitが表示されない)
 この時、1.でIDEのバージョンアップをしなかった場合でも、
 このデバイス変更を行った際に、バージョンアップされます。

3.ビルドを行う(エラーが発生する)
 デバイス変更を実施後、ビルドを行うとエラーが発生します。
 (Outputウインドウに “BUILD FAILED” と赤文字で表示)

PIC16F886とPIC16F18857はピンコンパチですが、
F1ファミリは、エンハンスド(拡張型)ミッドレンジシリーズと呼ばれ、
それまでのPICマイコンとは内部構成が異なる部分があります。

このため、レジスタの名称が変更になったり、
同じ名称でも、レジスタ内部のビットの割り当てが違う場合があるので、
プログラムの変更が必要となります。

4.プログラムを変更する
 ビルドエラーを無くすために以下の変更を行います。

①ヘッダファイル名を変更
 変更前:#include <pic16f886.h>
 変更後:#include <pic16f18857.h>(本コードは無くても可)

 include(インクルード)命令は、指定したファイルをプログラムに取り込むための命令です。

 拡張子が.hのファイルはヘッダファイルと呼ばれ、関数や宣言を定義したもので、
 2行目にあるpic16f886.hはPIC16F886用のレジスタ名の定義などが行われています。

 ここで、変更後のpic16f18857.hは省略しても問題ありません。

 理由は、1行目の#include <xc.h> を記述しておけば、
 プロジェクトで指定したデバイスのヘッダファイル(ここではpic16f18857.h)を
 ビルド時に自動的にインクルードしてくれるからです。

②アナログ入力選択レジスタ名を変更
 変更前:
  ANSEL  = 0x00;
  ANSELH = 0x00;

 変更後:
  ANSELA = 0x00;
  ANSELB = 0x00;
  ANSELC = 0x00;

①を行ってからビルドすると、以下のエラーがOutput画面に表示されます。
  sample_LED.c:11:5: error: use of undeclared identifier ‘ANSEL’ 
  sample_LED.c:12:5: error: use of undeclared identifier ‘ANSELH’

これは、11、12行目のレジスタ名ANSEL、ANSELHが未定義であることを示してます。

この2つはアナログ入力有効化レジスタで、
PIC16F886のアナログ入力(AN0~13)を有効にする場合、1にセットします。

ANSELはAN0~7、ANSELHはAN8~13に割り当てられています。
(PIC16F886 にはAN5~7は無し)

例えば、AN0は2番ピン(28ピンDIPパッケージの場合)に割り当てられていますが、
このピンには、RA0(ポートAのデジタル入出力)等の別の機能も割り当てられています。

ANSELのビット0(ANS0)が1ならAN0が有効になり、
0なら無効(デジタル入出力として使用)になります。

ここでは、全てのビットを0にしているので、
全てのアナログ入力を無効にする設定にしています。

PIC16F18857ではアナログ入力が、ANA0~7、ANB0~7、ANC0~7に増え、
それに伴い、アナログ入力有効化レジスタがポート別に設けられており、

レジスタ名も変更されています。

このため、アナログ入力を全て無効にする場合は、
上記3レジスタを全て0にセットします。

③コンフィグレーション設定を変更
 変更前:
 #pragma config FOSC=HS, WDTE=OFF, PWRTE = ON, MCLRE = ON, IESO=OFF, FCMEN=OFF, LVP=OFF

 変更後:
 #pragma config FEXTOSC=HS, WDTE=OFF, PWRTE = ON, MCLRE = ON, RSTOSC = EXT4X, FCMEN=OFF, LVP=OFF

②を行ってからビルドすると、以下のエラーがOutput画面に表示されます。
 sample_LED.c:3:: error: (1363) unknown configuration setting/register (FOSC = HS) used
 sample_LED.c:3:: error: (1363) unknown configuration setting/register (IESO = OFF) used

これは、3行目のコンフィグレーション設定 FOSC、IESOが未定義であることを示しています。

コンフィグレーション設定とは、クロックやタイマーなどの動作環境設定を行うもので、
コンフィギュレーションワード(Configuration Words)と呼ばれるレジスタCONFIGで設定されます。
 ※本記事ではコンフィグレーションレジスタと記します。

このレジスタは、PIC16F886はCONFIG1~2、PIC16F18857はCONFIG 1~5まであり、
同じCONFIG1でもレジスタ内のビット構成は異なります。

このレジスタへの設定(コンフィグレーション設定)は
#pragma(プラグマ)命令によって行われます。

先程の#include と同様、先頭に#がつくものは、プリプロセッサ命令と呼ばれ、
ビルド時に、前処理(プリプロセス)する内容を指示します。

コンフィギュレーションの設定は基本的には次のように行います。
 #pragma config  コンフィギュレーション設定の項目名 = 設定値

この項目名や設定値はデバイスによって異なり、
その内容は下記フォルダ内にあるドキュメントで確認することができます。

 C:¥Program Files¥Microchip¥xc8¥v2.45¥docs¥chips¥pic_chipinfo.html
  (XC8コンパイラのVerが2.45の場合)

pic_chipinfo.htmlはHTELファイルなので、Webブラウザで開くと、
デバイス一覧から該当するPICマイコンをクリックすることで、
そのコンフィグレーション設定情報ファイルが開きます。

ファイルの前半は、コンフィギュレーションの設定例が記載されています。

ファイルの後半は、コンフィグレーション設定一覧が記載されています。

LED点滅プログラムにおいて、
PIC16F886のコンフィグレーション設定は以下になっています。
(赤文字はPIC16F18857には無い設定)

FOSC=HS 
  発振器選択:HS(水晶振動子 ハイスピードタイプ)
WDTE=OFF
  ウォッチドッグ タイマ(WDT)有効化 :無効
PWRTE = ON
  パワーアップ タイマ 有効化 :有効
MCLRE = ON
  RE3/MCLR端子機能選択:MCLR機能を選択
IESO=OFF
  内部/外部クロック切替モード有効化 : 無効
  (2速度スタートアップ機能を無効化)
FCMEN=OFF
  フェールセーフ クロック モニタ有効化:無効
LVP=OFF
  低電圧プログラミング有効化 :無効

ここで、PIC16F18857には無いFOSC、IESOに相当する設定名を
コンフィグレーション設定情報ファイルから探すと、
FOSCについては、FEXTOSCが該当します。

FEXTOSC=HS
  外部発振器モード選択:HS(水晶振動子 4MHz以上)

IESOについては、2速度スタートアップ機能がPIC16F18857に無いため、
該当する設定はありませんが、PIC16F18857にはPLL(※1)が設けられており、
その設定が追加で必要となります。
 ※1:Phase Locked Loop(位相同期ループ):クロック周波数を増加させる逓倍回路

RSTOSC=EXT4X 
  電源投入時の発振器の動作モード選択:PLLの4逓倍回路を使用

このPICにはPLLにより、外部からのクロック信号の周波数を4倍に増やすことができ、
8MHzの水晶振動子から32MHzのシステムクロック周波数を生成させます。

<備考:クロック設定について>
PIC16F18857のシステムクロック周波数の最大値は32MHzなので、
4逓倍した周波数はそれ以内にする必要があるため、
PLLを使う場合、外部クロック周波数は8MHz以下にします。

ちなみに、PLLが無いPIC16F886が搭載されている学習キットVer2には、
20MHzの水晶振動子が搭載されており、
それがそのままシステムクロック周波数になります。

このため、Ver.3はVer.2よりも32MHz/20MHz=1.6倍速く動作するため、
このソフトで動作するLED点滅の速さも早くなります。
(LED点滅が5秒間で10回程度)



変更後のLED点滅プログラム

上記の変更内容を反映し、PIC16F18857で動作できるようにしたものです。
(赤文字部分が変更箇所)