モノ創りで国造りを

ハード/ソフト問わず知見をまとめてます

PICマイコンの使い方(draft)

はじめに

ここ最近PICマイコンを使う機会が増えました。
新人の頃は、PICって何?マイコンって何?美味しいのそれってレベルで
ちょっと勉強してみても今一つ釈然とせず、とっつきににくかった記憶があります。
個人的にはFPGAのほうがわかりやすかったです。
その原因は主に以下の2点でした。
レジスタの設定が複雑
・機能が特定のIOにしか使えない

そんな凡才エンジニアでも仕事を続ければ次第にわかってきて
少しは世の中の役に立てるレベルになりました。

ここでは、PICマイコンの特定のデバイスを例にとり
PICマイコンの使い方の大まかな流れを、データシートの記載箇所と併せて説明していきます。
PICマイコンは非常に多くの種類がありますが、使い方は大体似たようなものなので
本ブログを一通り読めば、とりあえずはPICマイコンを使えるようになると思います。

本ブログは以下の構成で進めます。
 1.PICマイコンの選び方について
 2.開発環境の構築
 3.プロジェクトの作成からレジスタの設定まで
 4.各モジュールの簡単な使い方
 5.PICへの書き込み方法

PICマイコンの選び方について

PICマイコンと一口で言っても、種類が多すぎて選べない方は多いのではと思います。
PICマイコンの選び方の一つとして、まずは使用するモジュールを考えます。
モジュールとはIO、UART、I2C、SPI、ADCなどです。
PICマイコンはモノによって搭載されているモジュールの種類と数が異なります。
データシート(ここではPIC18F25K80を例にします)に以下のようなページがあり、
ここにモジュールが記述されています。 f:id:yuji2yuji:20180811005039p:plain
PIC18F25K80は上記の表の最上部ですが
 IOが24ch  ADCが8ch
 UARTが2ch
 MSSP(I2C or SPI)が1ch といったことが見て取れます。
ここで注意すべきは、これらのモジュールはピンを共有しているものがあるということです。
特に通常のIO端子やADCは共通の端子を割り当てられていることが多いです。
どの端子にどのモジュールの端子が割り当てられているかはデータシートのピン設定を見ればわかります。
例えば以下の図をみて、1つの端子に複数の記述があるのがわかります。
f:id:yuji2yuji:20180811005335p:plain 端子28を例にとると、RA1/AN1と記載されています。
これは、端子xが以下2種類の用途から選択可能であることを示しています。

記述 用途
RA1 IOピン(PortAのch1)
AN1 アナログ入力のch1(ADCの入力信号)

PICのIOはPortA、PortB、PortC...と各ポートに対応したレジスタを持っています。
例えばRA1は、PortAの1ビット目のレジスタで設定可能、
RB4はPortBの4ビット目のレジスタで設定可能といった具合です。
各端子の設定については後程で説明します。

開発環境の構築

PICマイコンファームウェア開発用にIDE(統合開発環境)をインストールします。
IDEはいくつか種類がありますが、ここでは純正のMPLAB X IDEの使用を前提とします。
またOSはWindows10を使用しています。

MPLAB X IDEここの"Download"から、
OSに応じたファイルをダウンロード&インストールします。 f:id:yuji2yuji:20180810231630p:plain

レジスタの設定を簡易に行えるツールとしてMCC(Microchip code configurator)があります。
詳細は後程説明しますが、非常に便利なツールなので是非使用しましょう。
ということでここからダウンロード&インストールします。 f:id:yuji2yuji:20180810231856p:plain
*MCCのユーザーガイドはこちら 次にPIC用ファームウェアC言語で書いた際のコンパイラをダウンロード&インストールします。
コンパイラは、開発するPICマイコンによって異なります。コンパイラはXC8、XC16、XC32の3種類あります。
PICマイコンコンパイラの対応は以下の通りです。

PIC コンパイラ
PIC10/12/16/18 XC8
PIC24/dsPIC XC16
PIC32 XC32

本ブログではPIC16xxxxを使って説明するので、XC8をこちらからダウンロード&インストールします。
f:id:yuji2yuji:20180810231709p:plain
これで必要なものは一通りインストールできました。
最後に以下の手順でMCCをMPLAB X IDEプラグインします。
MPLAB X IDEを立ち上げます。
f:id:yuji2yuji:20180810231950p:plain
メインメニューのTools > Plugins をクリックします。
f:id:yuji2yuji:20180810232300p:plain
下の画面からMicrochip@Code configuratorを見つけ、チェックしOKします。
f:id:yuji2yuji:20180810232120p:plain
これで無事MPLAB X IDEでMCCが使用可能になりした。

プロジェクトの作成からレジスタの設定まで

プロジェクトの作成

MPLAB X IDEを起動し(起動しているならそのままで)、メインメニューのFile > New Project... をクリックします。
以下の画面が出てくるので、Microchip embedded > Standalone Project を選択し、Nextをクリックします。 f:id:yuji2yuji:20180810233302p:plain 次に使用するPICのデバイスを聞いてくるので、選択してNextをクリックします。
次に書き込みツールを問われます。使用する書き込みツールを選択します。PICKIT3がメジャーなのでお薦めです。
*現時点で使用するツールがわからない場合は、後で変えられるのでとりあえずNextをクリックします。
最後に使用するコンパイラを問われますのでXC8を選択し、Nextをクリック。
最後にプロジェクト名を入力しNextをクリックすると、プロジェクトが生成されます。

MCCの使い方

MCCの起動と終了

MCCマークf:id:yuji2yuji:20180811004338p:plainをクリックするとMCCが開きます。
*再度クリックすると閉じます。

使用するモジュールの選択

MCCを開くと、左のWindowにResource Managerタブが追加されます。
f:id:yuji2yuji:20180811024234p:plain
使用可能なモジュールはこのResource managerタブ選択時に、中段のWindowに表示されるDevice resourcesに表示されています。
f:id:yuji2yuji:20180811024428p:plain
右側にはデバイスのピン配置の図が表示されます。
f:id:yuji2yuji:20180811024612p:plain
下のWindowにはPin manager:Grid Viewが表示されます。
f:id:yuji2yuji:20180811024706p:plain
Pin Managerでは、鍵マークをクリックすると、各Moduleの端子をデバイスのどの端子に割り当てるかを選択できます。
未選択状態を示すアイコンf:id:yuji2yuji:20180811025436p:plainをクリックすると選択状態f:id:yuji2yuji:20180811025507p:plainになります。 デバイスのパッケージが選定するものと異なる場合は、
Pin ManagerのPackageから変更できます。
f:id:yuji2yuji:20180811025221p:plain

Resource managerkら使用するモジュールを選択(ダブルクリック)すると、Pin Managerにモジュールが表示されます。
通常のPICでは、各モジュールで使用可能なピンは限定的です。

EUSARTのTX端子をクリックすると、端子xはTXとして設定されます。
Remappable IO機能を有するPICでは、ピン選択が比較的自由に行えます。
Remappable IOについては後述します。

MCCで設定した内容からソースを起こすには、
Generateをクリックします。
これでProject fileに各種モジュールのレジスタが設定されました。
レジスタのみならず、IFに使用する各種関数も同時に生成されています。
*eusart.h、eusart.cを参照

過去の開発では、これらのレジスタ設定を一つ一つマニュアルで記述していましたが、
それが今ではGUIでパパっと設定し、チャチャっと生成できてしまいます。
大変楽で便利な世の中になりました。
とはいえ世の中のライバルたちもその恩恵にあやかるので、仕事は楽になりませんが...

使用するIOピンの選択

上述した通り、Pin ManagerでInput/outputをクリックすることで、IOピンを設定できます。 またIO Moduleでも設定を確認します。
f:id:yuji2yuji:20180811025627p:plain
Analogにチェックが入っていると、デジタル端子として認識されません。要注意です。

IOピンの設定をマニュアルで行う方法も記載しておきます。
IOピンは、以下4つの設定を行う必要があります。
 1.入出力の設定
 2.出力ピンのH/Lの設定
 3.プルアップの設定
 4.アナログ入力の設定

1.入出力の設定

TRISB = 0x00; //PORTBを全て出力に設定

2.出力ピンのH/L設定

PORTBbits.RB0 = 0; //RB0をLに設定

3.プルアップの設定

WPUB = 0x00;//PORTBは全てプルアップしない

4.アナログ入力の設定

ANSELB = 0x00;// PORTBを全てデジタル端子に設定

入出力や出力ピンのH/l設定を行っても、アナログ入力の設定をし忘れると、出力端子として認識されません。
よくやるミスなので要注意です。

Remappable IO

PICはデバイスによってRimappable IOの機能を有するものがあります。
Remappable IO機能を有するPICでは、各モジュールで使用するIOピンを比較的自由に設定できます(多少制限あります)。
Remappable IOとして使用可能な端子は、RPn/RPInとして表記されています(n:番号)。
両者の違いは以下です。
 RPn:入出力信号どちらでも設定できる端子
 RPIn:入力信号のみ設定できる端子

Remappable IOも、通常のIOと同様にMCCで設定可能ですが、マニュアルで設定することも稀によくあるので
方法を以下に示します。
Remappable IOの設定は、入力と出力で異なります(入出力を間違えないようにするため?)。

出力信号の設定方法

左辺にピン番号(頭にアンダーバー、末尾にRをつける)を記述し、使用する機能の値を右辺に記述します。
使用する機能の値は、データシートの"OUTPUT SELECTION FOR REMAPPABLE PINS"に記載されています。

_RP38R = 0x0003;

正式には以下の記述が正しいですが、マクロによって上記の記述でも問題ないよう配慮されています。

RPOR2bits.RP38R = 0x0003;

入力信号の設定方法

左辺に機能(頭にアンダーバー、末尾にRをつける)を記述し、右辺に使用するピン番号の値を記述します。
機能名と対応するレジスタ番号はデータシートの"SELECTABLE INPUT SOURCES"または
"PERIPHERAL PIN SELECT INPUT REGISTER MAP"に記述されています。
ピン番号と値の対応表はデータシートの"INPUT PIN SELECTION FOR SELECTABLE INPUT SOURCES"に記載されています。

_QEA1R = 0x0100;

正式な記述は以下です。

RPINR14bits.QEA1R = 0x0100;

各モジュールの簡単な使い方

CLK

UART

SPI

I2C

ADC

書き込み方法

PICKIT3による書き込み

PICへのファームウェアの書き込みには、PICKIT3がお薦めです。
*最近はPICKIT4なるものが発売されてますが、書き込みスピードが早くなった程度しか違いません。
f:id:yuji2yuji:20180811025935p:plain
PICKIT3の端子と名称は以下の通りです。
f:id:yuji2yuji:20180811025846p:plain
これらの端子をPICの各端子に接続すればよいです。
MCLRはMCLR、ICSPCLKはPGC、ICSPDATAはPGDに接続します。
注意事項として、これらの信号線にはコンデンサやプルアップ、プルダウン抵抗、ダイオードは接続してはいけません。
それらを接続すると、ファームウェアがPICに書き込めなくなる恐れがあります。   参考までにPICKIT3による書き込み用の回路を載せておきます。
f:id:yuji2yuji:20180811003637p:plain

注意:
本ブログ記載内容をもとにモノづくりをされる場合は、
使用するデバイスの定格電圧・電流に十分ご注意頂き、
自己責任にて実施ください。