TOPPICC Lite編(PIC12F675)> (05)ひとの動きを検出したら明かりを点ける(PIC12F675,PICC-Lite)> ソース

ひとの動きを検出したら明かりを点ける(ソース)

(PIC12F675 PICC-Lite)

更新日2008.11.1

以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。

// ========================== ここから ==============================
//ファイル名	NaPi_LED.c
//作成日	2008.10.19
//作成者	mit.ueno
//バージョン	1.0
//コンパイラ	PICC Lite
//PIC	PIC12F675
//クロック	4MHz(INTIO)
//概要
//	ひとの動きを検出(GP2:NaPiOn)したら明かりを点ける(GP4)
//	暗い時(GP3:Cds = 1)のみ動作
//
//	TMR0割り込み使用
//		clock	4MHz
//		命令	1μS
//		TMR0	256(フリーラン)
//		pre_sc	256
//		割込み	1μS×256×256=65.536mS
//使用ポート
//	GP0:VR(A/D変換)
//	GP2:NaPiOn
//	GP3:Cds
//	GP4:高輝度LED
//	GP5:LED赤

#include "pic.h"

static void pic_init();
static void wait_60uS();

static unsigned char cnt1s;	// 約1秒カウンタ(65.536mS×15)
static unsigned char cntdelay;	// 消灯遅延カウンタ
static unsigned char adsave;	// ADRESH save
static bit go_sleep;		// SLEEPモードへの移行フラグ

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BORDIS);


// =================== 割り込み処理 ====================
static void interrupt intr(void) {
	if  (T0IF) {	// TMR0割込み
		T0IF = 0;	// TMR0割り込みクリア
		if	(!(cnt1s--)) {	// 約1秒?
			cnt1s = 15;
			if	(!(cntdelay--)) {	// 明かり消灯遅延時間経過?
				go_sleep = 1;
			}
		}
	} else {		// INT割込み
		INTF = 0;	// INT割り込みクリア
		cntdelay = adsave;	// AD変換結果を消灯遅延カウンタにセット
		if  (GPIO3) {	// 暗い
			go_sleep = 0;
			GPIO5 = 1;			// 明かり点灯
		}
	}
}

// ==================== メイン処理 ===========================
main()	{
	pic_init();		// PICの初期化
	cnt1s = 15;		// 約1秒カウンタ初期化
	go_sleep = 0;

	while(1) {
		if  (GPIO3) {	// 暗い
			GPIO4 = GPIO2;	// GP2(NaPiOn)の状態をGP4(LED)で表示
			wait_60uS();		// 60uS待ち(AD充電待ち)
			GODONE = 1;		// AD変換開始
			while(GODONE) {}	// AD完了待ち
			adsave = ADRESH;
			if  (go_sleep) {
				GPIO4 = 0;
				GPIO5 = 0;
				ADON = 0;	// AD変換休止
				SLEEP();
				ADON = 1;	// AD変換機能有効
				go_sleep = 0;
			}
		} else {	// 明るい
			GPIO4 = 0;
			GPIO5 = 0;
			ADON = 0;	// AD変換休止
			SLEEP();
			ADON = 1;	// AD変換機能有効
		}
	}
}

// ==================== PICの初期化 ===========================
static void pic_init() {
	CMCON = 0x07;		// コンパレータ未使用
	ANSEL = 0x11;		// 8Tosc,AN0
	ADCON0 = 0x01;		// Left,Vdd,AN0,ADON
	TRISIO = 0xCF;		// GP4,5:out
	GPIO = 0;

	OPTION = 0xC7;		// プリスケーラ:256,INTedg:rising
	TMR0 = 0x00;
	T0IE = 1;		// TMR0割り込み許可
	INTE = 1;		// INT割り込み許可
	GIE = 1;		// 全体割り込み許可
}

// =================== 60uSウェイトルーチン ===============
static void wait_60uS() {
	unsigned int cnt;
	unsigned int i;
	cnt = 3;
	for	(i=0 ; i<cnt ; i++) {
		NOP();
	}
}
// ========================== ここまで ==============================