前回に引き続き、今回は PIC 業界の "Hello, world" 的な存在、LED フラッシャーを作ってみます。多分、順番としてはこちらが先だと思うんですが。回路は前回のものをそのまま流用します。LED の数が少ないので、綺麗に流れて見えませんが、原理を理解するには十分と思うので。
#include <htc.h>
__CONFIG (FOSC_INTRCIO // 内蔵オシレータ
& WDTE_OFF // WDT 無効
& PWRTE_OFF // PWRT 無効
& MCLRE_OFF // MCLR 使用しない
& BOREN_OFF // BOD 無効
& CP_OFF // Program Memory code protection 無効
& CPD_OFF // Data memory code protection 無効
);
void main ()
{
// ポートの入出力方向を設定 @see Section 3.0 GPIO PORT
// GP0 OUT
// GP1 OUT
// GP4 OUT
// GP5 OUT
TRISIO = 0b00001100;
// LED の点灯パターンを定義
unsigned int pattern [] = {
0b00000001,
0b00000010,
0b00010000,
0b00100000,
0b00010000,
0b00000010
};
unsigned int counter = 0;
while (1)
{
// カウンタを進める
counter++;
// カウンタをパターン定義数でクリップ/ループ
counter %= (sizeof(pattern) / sizeof(pattern[0]));
// パターンを出力
GPIO = pattern[counter];
// ウェイト
#define _XTAL_FREQ 4000000/*Hz*/
__delay_ms (200/*mSec*/);
}
}
前回作った回路を流用するので、LED の数は 4 つですが、PIC12F675 を用いる場合、最大で 5 つまでの LED を駆動することができます*1。また、PIC16F84 などを用いれば、さらに多数の LED を駆動することができますが、考え方は全く同じです。
上記のソース中で、pattern 変数に点灯する LED のパターンが登録されているので、これを変更することで様々な点灯パターンを実現できます。また、__delay_ms 関数は、指定された時間、処理を中断するマクロ*2で、PIC の動作周波数(_XTAL_FREQ)を元にウェイトを実現しています。
回路は前回使ったものをそのまま流用し、スイッチ部分は利用せずに、LED の部分だけを使います。ハードウェアの実装はそのままで、機能を変更できるというのも PIC の便利なところですね。