PIC16F1823-I/P を用いたLED点滅テスト

PIC16F1823に赤/緑のLEDを接続して簡易テストプログラムを作成してみたいと思います。

回路図は下図の通り。

 

この回路図を元にブレットボード上で作成したのが下記

 

MPLAB Xのプロジェクトを作成

MPLAB Xを起動して、NewProjectを選択します。

 

CategoriesとProjectを選択して次に

 

使用するPICマイコンを選択して次に

 

OPTIONのデバックヘッダは指定しないのでそのまま次に

 

使用するデバッカ(ここではPICKit3)を選択して次に

 

使用するコンパイラ(ここではXC8)を選択して次に

 

Projectの名前を指定します。

またソースコードの文字セット(ここではUTF8)を指定して、Projectのセットアップ完了です。

 

メインソースコード入力

プロジェクトを選択し、右クリックでメニューを呼び出し、C MAIN Fileを選択。

これでメイン用のCソースコードがテンプレートを参照して作成されます。

 

ソースコードを入力します。
今回LEDは100msで交互に点滅するプログラムとなっています。

 

基本的にXC8コンパイラはANSI Cと互換のあるC言語となっていますが、そこは組み込み向けマイコンのC言語ですので多少なりとも差異はあります。 構文上の違いはドキュメントを参照頂くとして、PICマイコンをC言語上で成り立たせるためには多少なりとも書式的に行う手続き必要です。

 

特にヘッダインクルードとPICマイコンの電源投入時のハードウェア動作を決定するシステムコンフィギュレーションレジスタ設定はPICマイコンならではな部分であり、ANSI標準Cにはない機能でもあるため、最初なれるまで多少時間がかかります。

今回のLED点滅で使用しているソースコードも、実際の点滅自体は20行程度の短いものですが、PICマイコンをC言語で動作させるための構文が色々入っています。

 

ソースコードで読み込んでいるヘッダファイル。

#include <stdio.h>
#include <stdlib.h>
XC8はANSI C標準関数のいくつかをサポートしていますので、標準ライブラリを使用するためにもこのヘッダはインクルードします。

#include <xc.h>
#include <pic.h>
今のXC8のバージョンではxc.hは内部的にpic.hを呼び出しているので、あまり意味が無いのですが、pic.hはハイテックC互換のための宣言であえて挿入しています。もしかしたらXC8では将来的にxc.hの内容が異なる可能性があるためです。

#include <pic16f1823.h>
デバイスの専用ヘッダフアイルです。
この中に各I/Oのレジスタ定義体も入っています。(定義体に対して読み書きするとマイコンの対応するレジスタに対してアクセスする事になる)

 

使用しているPICマイコン専用の構文/定義体

#pragma config:チップのハードウェア動作を決定するシステムコンフィギュレーションレジスタ。
OSCCON: オシレータ制御レジスタ
WDTCON: ウォッチドッグ タイマ制御レジスタ
APFCON: 代替ピンの機能制御レジスタ
TRISA: PORTA3 ステートレジスタ
TRISC: PORTC3 ステートレジスタ
PORTC: PORTC 入出力レジスタ
__delay_ms(xxx): ソフトウェアウェイト

 

XC8コンパイラの全身であるハイテックCコンパイラではおなじみですが、今回100msの点滅を実現するために100msの時間計測をソフトウェアウェイト(181行目 __delay_ms(100) の箇所)を用いて実施しています。

これは xc.h から順に htc.h → pic.hとインクルードファイルが読込まれ、pic.hの中でビルトイン関数として定義されています。

このビルトイン関数は、PICマイコンが4クロックで1命令実行するというRISCマイコンの特性を用いて時間計算しているため、「_XTAL_FREQ」にターゲットマイコンが何MHzで動作するのか定義しておく必要があります。

サンプルプログラムでは、108行目で

#define _XTAL_FREQ 32000000  //CLOCK=32MHz

と、内部クロック32MHzで動作することを定義しています。

 

コンパイルとデバック

ソースコードが完成したらコンパイラを呼び出してエラーがないかどうか確認します。

コンパイラだけを呼び出してコードを作成するならば、BuildProjectアイコンをクリックして実行します。

エラーがなくなるまでソースコードの間違いを修正します。

 

ソースコードの修正が完了したならば次はデバックとなりますが、今回PICKit3に接続したブレットボードはPICKit3より電源を供給してもらうのでそのための準備が必要。

 

LED sample プロジェクトを右クリックでメニューを呼び出して、Propertiesを呼び出します。

 

PICKi3メニューに移動し

 

Powerオプションを選択します。

 

すると、電源を供給するかどうかのチェックマークがありますので、これにチェック(供給電圧は5VでOK)

 

この設定が完了したならば、DebugProjectアイコンをクリックしてデバッカを起動します。

このデバッカオプションを起動すると、コンパイルも自動実行されますので、ソースコードを修正して微調整する場合は、BuildProjectを実行しないでDebugProjectを呼び出すだけでもOKです。

 

実行結果。

写真では赤LEDのみ光っていますが、100ms毎に緑LEDと点滅を繰り返しています。

 

オシロスコープで確認してみると、100ms毎にI/O端子が入れ替わりON/OFFわ繰り返していることがわかります。

 

LED点滅のテストはこれで完了です。

今回、100msの時間調整にPICマイコンのC言語では割とよく用いられるソフトウェアウェイトを用いましたが、これはあくまでテストサンプルでのみ。

数μs程度の時間調整ならばイザ知らず、これだけの長時間を単なるループで時間調整するというのは非常に無駄な動作で、タイマーを用いて時間をカウントして制御するのが組込みプログラムとしては正道です。

次回は、このLED点滅ソフトをタイマー割り込み対応に変更してみたいと思います。

 

 

TOP/電子工作の部屋にもどる