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(); } } // ========================== ここまで ==============================