C言語お勉強 PIC回路お勉強 MPLAB XIDEプロジェクトファイルの作成法
LEDを点滅させる (PIC12F675 XC8)
実験回路
図2:ブレッドボードに組んだ状態
実験回路
どのPICでも最初はいつもLEDの点滅実験から開始します。(簡単で動作が目に見えるので)
今回は0.5秒毎にLEDを点滅させるもので、待ち時間はプログラムのループにより作ります。
今回の実験回路です。
クロックは内部クロックを使い4MHz動作としました。
LEDと直列の抵抗は、300~800Ω程度の範囲であれば明るさが変わるだけで点灯は確認できます。
図2:ブレッドボードに組んだ状態
右下の6ピンヘッダ周りは、回路図には有りませんがICSP(In-Circuit Serial Programming)用です。秋月のPICライタなどを使う場合は不要です。
プログラム概要
---------------------------------------------------------------------------------------------------------------------------------------------------------------
プログラムの各ブロックで行っている処理は以下通りです。
main
PICの初期化(pic_init)を行った後、0.5秒毎にGPIO4,5を点滅させます。
0.5秒の時間は、1ミリ秒待ちサブルーチン(Delay_ms)に250(待ち時間:ミリ秒)を渡して2回呼び出す事で待ちます。
pic_init
PICの初期化処理を行います。
使わないコンパレータとA/D変換を無効にして、GPIO4,5を出力に設定します。
Delay_ms
引数で渡された数だけ1ミリ秒待ち関数を呼び出します。
mainでは、250をセットして呼び出していますので、250ミリ秒待つ事になります。
Delay_1ms
1ミリ秒待ち関数です。
1ミリ秒の時間は、プログラムを一定回数ループさせる事で作ります。
<注意事項>
PIC12F675は、リセット時にコンパレータとA/D変換機能が有効になっています。
このままでは、各ピンをデジタル入出力として使えませんので、初期処理で以下の設定を行っておきます。
CMCON = 0x07;
// コンパレータ未使用
ANSEL = 0x00;
// AN未使用
---------------------------------------------------------------------------------------------------------------------------------------------------------------
以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。
// ========================== ここから ==============================
//ファイル名 led_onoff.c
//作成日 2008.9.28
//更新日 2012.5.12
//作成者 mit.ueno
//バージョン 1.1
//コンパイラ MPLAB XC8
//PIC PIC12F675
//クロック 4MHz(INTIO)
//概要
// GP4,5のLEDを0.5秒間隔で点滅させる
// XC8用に非互換修正
//使用ポート
// GP4:LED
// GP5:LED
#include "pic.h"
//xc8 __CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS);
__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF);
static void pic_init();
static void Delay_ms(unsigned char ms);
static void Delay_1ms();
// ================ メイン処理 ======================
main() {
pic_init(); // PICの初期化
while(1) {
GPIO5 = 1;
GPIO4 = 0;
Delay_ms(250);
Delay_ms(250);
GPIO5 = 0;
GPIO4 = 1;
Delay_ms(250);
Delay_ms(250);
}
}
// =============== PICの初期化 ======================
static void pic_init() {
GPIO = 0;
CMCON = 0x07; // コンパレータ未使用
ANSEL = 0x00; // AN未使用
TRISIO = 0x0F; // GP4,5:out
}
// =============== 1mS×ms ウェイトルーチン =======
static void Delay_ms(unsigned char ms) {
unsigned char c;
for (c=ms ; c>0 ; c--) {
Delay_1ms();
}
}
// =============== 1mSウェイトルーチン ============
static void Delay_1ms() {
unsigned int cnt;
unsigned int i;
cnt = 76;
for (i=0 ; i<cnt ; i++) {
NOP();
}
}
// ========================== ここまで =============================