#include //#define _InternalClock //#pragma config BOREN = OFF, CPD = OFF, FOSC = EXTRCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = OFF #pragma config BOREN = OFF, CPD = OFF, FOSC = INTRCIO, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = OFF //#define _XTAL_FREQ 1000 // 1kHzクロック周波数の定義です #define _XTAL_FREQ 4000000 // 4MHzクロック周波数の定義です #define LAMP GP1 #define MDS GP2 // 1kHzの場合 //#define RST_TMR1 28036 // 5分カウンタの初期値 //#define RST_TMR1 43036 // 3分カウンタの初期値 //#define RST_TMR1 64286 // 10秒カウンタの初期値 // 4MHzの場合 #define RST_TMR1 572 // 5分カウンタの初期値 //#define RST_TMR1 19 // 10秒カウンタの初期値 unsigned short int count; // タイマ用カウンタ //Delay 10msec -------------------------------- void Delay_10ms(unsigned short int time){ while(time--){ __delay_ms(10); } } //**************************************** /* 割込みハンドラ INT割込みでセンサー検知信号を受信 TMR0割込みで消灯カウンタデクリメント */ void interrupt handler( void ){ unsigned char sleep_flag; // 非同期動作のためカウント値を保護するためカウンタ停止 TMR1ON = 0; // TMR1カウンタ停止 sleep_flag = 0; // TMR1割込み(0.524288s周期)の場合 if(TMR1IE&&TMR1IF) { // TMR1割込み TMR1IF = 0; // TMR1割込みフラグクリア count--; // カウンタデクリメント if(!count){ LAMP = 0; // LED照明消灯 count = RST_TMR1; // カウンタ初期化 sleep_flag = 1; // スリープする } } // INT割込み(人感センサ検知)の場合 if(INTE&&INTF) { // INT割込み INTF = 0; // INT割込みフラグクリア LAMP = 1; // LED照明点灯 TMR1 = 0; // カウンタ初期化 count = RST_TMR1; // カウンタ初期化 sleep_flag = 0; // スリープしない } // 想定外の割込み発生の場合 else{ } TMR1ON = 1; // TMR1カウント再開 GIE = 1; // 割込み許可 if(sleep_flag) SLEEP(); // タイマエクスパイヤで消灯したらスリープモードに } //#################### main ################################# void main(void){ //Initialization OPTION_REG = 0b11000000; // Pull up Off CMCON = 0b00000111; // ComperlatorOFF // ANSEL = 0b00000000; // 全てデジタル(675only) // 入出力指定 TRISIO = 0b00001100; // GP0,1,4,5:Output GP2,3:Input //--543210 // 出力ポート状態初期化 GPIO = 0b00000000; // 全てOFF //--543210 // TMR1初期化 T1CON = 0b00110000; // クロック源(Fosc/4),プリスケール1:8,TMR1停止 LAMP = 1; // 電源が入ったときは先ずは点灯 Delay_10ms(3000); // センサの安定まで30秒待つ // タイマ1設定 // TMR1割込みでSleepからWakeUpせず // TMR1:(1MHz)*8*65536=0.524288s 毎にタイマー割込みが発生する // 300s/0.524288=572.20 // TMR1割込を572回カウント(変数count)すると概ね300s(5分) count = RST_TMR1; // カウンタ初期化 TMR1 = 0; // TMR1初期化 TMR1ON = 1; // TMR1カウント開始 // 割込み設定 PEIE = 1; // 周辺機器割込み許可 INTE = 1; // 外部割込み許可(GP2/INTが外部割込み) TMR1IE = 1; // TMR1割込み許可 GIE = 1; // 割込み許可 //--------------------------------------------------------- while(1){ } }