/* ======================================================== RTC ======================================================== */ #pragma sfr #pragma inline #include "incs.h" // ======================================================== u8 rtc_work[7]; bit rtc_lock; bit rtc_dirty; /* ======================================================== ペリフェラルの初期化 レジスタの電池交換ビットのセット ======================================================== */ void RTC_init(void){ RTCEN = 1; // モジュールON // RTC設定 RTCC0 = 0b00001000; /* 動作停止、24時間制、32k出力「まだなし」、定周期割り込みなし */ RTCC1 = 0b00000000; /* アラーム割り込みなし */ RTCC2 = 0b10000000; /* インターバル:32k/2^6=2ms、RTCDIV出力なし */ SEC = 0; MIN = 0; HOUR = 0x00; DAY = 29; WEEK = 4; MONTH = 1; YEAR = 9; // 割り込み設定 RTCMK = 1; /* 割り込み(定周期)禁止 */ RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */ RTCE = 1; /* 動作開始 */ vreg_ctr[ VREG_C_MCU_STATUS ] = REG_BITS_RTC_BLACKOUT; } /* ======================================================== RTC インターバルタイマ割り込みベクタ 2^6/fXT(1.953125 ms) ======================================================== */ __interrupt void int_rtc_int(){ renge_flg_interval = 1; } /* ======================================================== RTC のリード レジスタは、sec,min,hour,week,day,month,year の順 ======================================================== */ void get_rtc(){ if( rtc_lock == 0 ){ rtc_lock = 1; RWAIT = 1; while( !RWST ){;} memcpy( &vreg_ctr[ VREG_C_RTC_SEC ], &SEC, 7 ); RWAIT = 0; } } /* ======================================================== RTC のライト set_rtc_close と対で使って下さい。 こいつはバッファにコピーするだけで、 実際にRTCにセットするのはset_rtc_close()です。 ======================================================== */ void set_rtc( u8 adrs, u8 data ){ if( rtc_dirty == 0 ){ rtc_dirty = 1; memcpy( rtc_work, &SEC, 7 ); } rtc_work[ adrs ] = data; } /* ======================================================== 必要ならば、RTCレジスタの更新 ======================================================== */ void rtc_close_iic(){ rtc_lock = 0; if( rtc_dirty ){ rtc_dirty = 0; RWAIT = 1; while( !RWST ){;} memcpy( &SEC, rtc_work, 7 ); RWAIT = 0; } }