(32) PIC#2 : 初めてのPIC入門 (2/2)

投稿者: | 2019年10月28日

前回 (31) 初めてのPIC入門 (1/2) からの続きです。

前回の投稿で列挙した物を買い揃え、今回の投稿で記した通りにプログラムを書けば、PICが初めての人でも LED点滅プログラムを動かすことができます。

基本的には、自分でやったことを記録しておく 自分自身のための備忘録 なのですが、同じような動機で初めて PICを使おうとしている方には、いくらか役立つ情報がちらほらと見つかるかもしれません。

ちょっとボリュームが大きくなってしまいましたが、端折らずに書いたので…
少しはお役に立てる内容かと思います。(^^;

1. MPLABでひな形プログラムを開く

(1) MPLAB IDEを起動する。

(2) ひな型を利用して新プロジェクトを作る。

[File]-[New Project…] メニューを選択する。

[Samples]-[Microchip Embedded] を選択する。
今回は PIC16F1827 を使用するため、[PIC16 C Template] を選択する。
C言語版のテンプレートを使ってプログラムを書き始めたいのだ。

プロジェクト名や格納ディレクトリなどは自由に決めてよい。

この時点で、指定したディレクトリの配下に、プロジェクトファイル一式が自動生成される。
生成されたファイルは、MPLAB IDEの Projectsペインに階層表示される。

ここで、ターゲットデバイス名を選択する。
今回は PIC16F1827 を使用するため、プルダウンリストの中からこれを選択する。

(3) 初めてのビルド!

ひな型一式が自動生成されたので、これをビルドしてみる。

なんと、エラー発生!
自動生成されたプログラムでエラーが発生するとは、なんということか…

エラーの発生原因は、
interrupts.c:23:6 error: variable has incomplete type ‘void’
とのこと。

interrupt.cに書かれている
void interrupt isr(void)
この宣言が NGらしい。

で…
ネット上で調べたところ、この記述法は現在使用しているコンパイラ XC8 ではダメとのこと。
正しくは、以下のように書く必要があるとのこと。
void __interrupt() isr(void)

コンパイラの仕様に従って、記述の仕方を変えるしかないのだ。

ビルドが成功した!

2. LED点滅プログラムを書く

ひな型が準備できたので、いよいよこのひな形に自分のやりたいことを追記していく。

(1) 仕様を決める。

PICマイコンを使った LED点滅プログラムの仕様を決める。

1) クロックは PIC内蔵の発振器 を使う。
2) LEDは Pin#1 RA2 に繋げて点灯/消灯させる。
3) 点灯 1.5秒、消灯 0.5秒の周期で点滅させる。
これだけだ。

(2) H/Wレジスタの初期化コードを自動生成

マイコン制御プログラムでは、電源 ON時に真っ先にやることがある。
それは、マイコンとプログラムとの I/Fである レジスタ に、マイコンを思い通りに動かすための初期設定をすること。

MPLAB IDEには、この作業を簡単にしてくれる機能がある。
[Production]-[Set Configuration Bits]メニューを選択する。

すると…
Configuration Bits ペインが出現するので、これを編集する。

今回は、上記(1)に記したように、内蔵クロックを使う。
このために FOSCINTOSC(=Internal Oscillator)を選択した。

また、プログラム暴走時にリセットをかける Watch Dog Timer の Enable/Disable を Disable すなわち停止状態にするため WDTEOFF にした。WDTは周期的にレジスタに書き込みをしないとマイコンにリセットがかかる仕組みだが、今回はその周期処理を書かないので OFFにする。

MCLRE は、外部から PICにリセットをかけるための入力端子として使う or notを設定するレジスタだが、今回はそのような使い方をしないので OFF にする。

後は PIC電源ON時のレジスタ初期値のまま使用する。
この状態で、[Generate Source Code to Output] ボタンを押下する。

すると…
Config Bits Sourceペインが出現するので、そこに書かれたテキストをすべてコピーし、
自動生成された Source Files/configuration_bits.c
/* TODO Fill in your config bits here. Use the configuration bits generator */
と書かれた下にまるまるペーストする。

(3) 自動生成されない H/Wレジスタの初期化コードを自分で書く。

FOSCINTOSC で PIC内蔵発振器を使う設定をしたが、クロック周波数の設定ができていない。
デフォルトだと 500[kHz]だが、今回はこれを 4[MHz]のクロック周波数で使うことにする。

自動生成された Source Files/system.c
関数 ConfigureOscillator(void) の中に以下のコードを追記する。

この 1行は、OSCCON (=OSCILLATOR CONTROL REGISTER)に 16進数で 68H (=二進数で 01101000B)を設定している。
OSCCONレジスタの仕様は以下の通り。今回は、以下の通りに設定している。
・SPLLEN: 0 (PLL使用せず)
・IRCF: 1101B (4MHz)
・SCS: 00B (FOSCの設定に従う)

http://akizukidenshi.com/download/pic16f1827.pdf

また、RA2 端子を LED点灯制御のための 出力ポート として使用するため、
自動生成された Source Files/user.c
関数 InitApp(void) の中に以下のコードを追記する。


汎用入出力用端子のどれを使ってもよいのだが、一番端の 1番ピンで分かり易かったため PA2を使うことにした。

TRISA = 0x00 は、ポートAをすべて出力ポートとして使用するための設定。
TRISB = 0x00 は、ポートBをすべて出力ポートとして使用するための設定。
ANSELA = 0x00 は、ポートAのアナログ or デジタルをすべてデジタルで使用するための設定。
LATA = 0x00 は、ポートAの出力ラッチを全て 0に設定。
詳細は前述の データシート を参照のこと。

(4) プログラム本体を書く。

前述の(2),(3)でハードウェアの初期化コードを書いた。
いよいよ初期化完了後のプログラム、すなわち本題である LED点滅制御のためのプログラムを書く。

とは言っても、ハードウェア初期化でお膳立てが出来ているので、実際に書くプログラムの量は少ない。

自動生成された Source Files/main.c
関数 main(void) の中に以下のコードを追記する。

LATA2=1;
すなわち LATAレジスタの Bit2を 1にする。
 → RA2出力端子の電圧レベルを HIGHにする。
  → RA2端子には LEDの+側を接続しているので LEDが点灯する。

__delay_ms(1500);
すなわち 1500[ms]の間、このプログラムの実行を停止する。

LATA2=0;
すなわち LATAレジスタの Bit2を 0にする。
 → RA2出力端子の電圧レベルを LOWにする。
  → RA2端子には LEDの+側を接続しているので LEDが消灯する。

__delay_ms(1500);
すなわち 500[ms]の間、このプログラムの実行を停止する。

こんな流れで LEDの点灯、消灯を制御し、LEDの点滅を実現する。
いざ ビルド実行!

あれっ?
エラーが出た…

__delay_ms(); を使う場合、_XTAL_FREQ を定義しておく必要があるとのこと。

自動生成された Header Files/system.h にこれを追記しておく。
前述のハードウェアレジスタの設定で、内部発振器の周波数を 4[MHz]に設定した。
delay関数もこのクロックを使用するので、これと同じ値 4000000L と書く。

再度 ビルド実行!

今度はビルドが成功した!

3. Pickit3の設定

PIC上で動かすための LED点滅プログラムが完成した。
いよいよ、これを実機に焼いて動かす準備を行う。

前回の投稿 (31) 初めてのPIC入門 (1/2) に記したように、パソコン上の MPLAB IDEで作ったプログラムを PICにダウンロードするためのツールとして、PICマイコンのメーカーであるマイクロチップ社純正の PICkit3 を使用する。

MPLAB IDEから PICkit3を使うために、いくつか設定すべき項目がある。

(1) 使用するツールを選択する。

1) [File]-[Project Properties]メニューを選択し、ダイアログを開く。

2) [Hardware Tool]項目で PICkit3の [SN:xxxxxxxx] シリアルナンバーを選択する。
※パソコンに PICkit3を繋いでいないと SNが表示されない。

3) [Compiler Toolchain]で XC8を選択する。
※他の商用コンパイラを使っている場合はそちらを選択する。

4) [Apply]ボタンを押下する。

(2) PICkit3からターゲット(PIC)に対して電力を供給する。

上の写真のように、ブレッドボード上に PICを載せて、PICkit3と接続しただけの単純な回路だ。
PICを駆動するためには電源供給が必要なため、PICkit3から供給する。

1) [File]-[Project Properties]メニューを選択し、ダイアログを開く。

2) [Conf]項目で [PICkit3]を選択する。

3) [Power target circuit from PICkit3]項目にチェックを付ける。

4) [Apply]ボタンを押下する。

4. PICにプログラムを書き込み

[Make and Program Device Main Project]メニューを選択する。
これで、PIC用のコンパイル & PICへのダウンロード(=PIC上のEEPROMへのプログラム書き込み)が実行される。

Programming/Verify complete
と表示されれば PICへの書き込みが完了!

でも…
たまにこんなエラーが出たりする。

エラーの内容は…
The target VDD is measured to be 4.75 volts.
An external power supply might be necessary.
Connection Failed

つまり…
PICkit3から 5[V]の電源供給しているはずだが、PICの VDDピンには 4.75[V]しか来ていません。
PICの動作に必要な電力を得るために、外部電源が必要です。
コネクションに失敗しました。

ということだ。

よって…
この場合は、前回の投稿 (31) 初めてのPIC入門 (1/2) に記したように、マイクロUSBコネクタDIP化キットを使い、スマホ用ACアダプターから 5[V]電源を引き込めばよい。

また、マイクロUSBコネクタDIP化キットの使い方については、過去記事 (30) マイクロUSBコネクタDIP化キットでスマホ用電源を引き込む も参照されたい。

PICkit3からの電源供給とは別に、
スマホ電源の + を PICの VDD に繋ぎ、
スマホ電源の を PICの VSS に繋ぐ。

これで上記の Connection Failed が発生しなくなる。

5. PICkit3を外す

一度 PICにプログラムを書きこんでしまえば、パソコンと PIC搭載回路との中継器である PICkit3は不要だ。
PICkit3と PICとの接続を切っても、PICに焼いたプログラムは自律して動作する。

この後、プログラムの内容を変更したい時は、また PICkit3を繋いでプログラムを書き換えればよい。
もし、頻繁にプログラムを書き換えるようならば、ブレッドボード上にピンコネクタを挿しておき、PICkit3をそこへ繋げばよいだけにしておくと便利だ。

例えばこんな物を使えばよい。
http://akizukidenshi.com/catalog/g/gC-05336/

6. 所感

・PICは 1個が 150円~300円ほどと安いので、手軽に電子工作に利用できる。
・5[V]で動作するので、外部電源としてスマホ用 ACアダプターが使えるのもお手軽だ。
・PICは種類が多いので、使うPICごとに H/W構成、レジスタ I/F仕様を勉強する必要がある。
・次回は PICkit3を使ったシミュレータ上デバッグと実機上デバッグをやってみよう。
・次の制作では、息子のおもちゃとしてイルミネーションライトを作ってみたい。
 → フルカラーLEDを制御する必要がある。
  → PWM制御について学習しなくては。


カテゴリー: PIC

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)