TOP>MPLAB XC8編(PIC12F675)> (05)ひとの動きを検出したら明かりを点ける(PIC12F675,XC8)> ソース
ひとの動きを検出したら明かりを点ける(ソース)
(PIC12F675 XC8)
| 更新日2012.5.20 |
| 作成日2008.11.1 |
以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。
// ========================== ここから ==============================
//ファイル名 NaPi_LED.c
//作成日 2008.10.19
//更新日 2012.5.13
//作成者 mit.ueno
//バージョン 1.1
//コンパイラ MPLAB XC8
//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モードへの移行フラグ
//XC8 __CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BORDIS);
__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF);
// =================== 割り込み処理 ====================
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充電待ち)
//XC8 GODONE = 1; // AD変換開始
//XC8 while(GODONE) {} // AD完了待ち
GO_DONE = 1; // AD変換開始
while(GO_DONE) {} // 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;
//XC8 OPTION = 0xC7; // プリスケーラ:256,INTedg:rising
OPTION_REG = 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();
}
}
// ========================== ここまで ==============================