mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-06-19 00:55:37 -04:00

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@4 013db118-44a6-b54f-8bf7-843cb86687b1
106 lines
2.4 KiB
C
106 lines
2.4 KiB
C
/* ========================================================
|
||
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;
|
||
}
|
||
}
|
||
|
||
|