ctr_mcu/trunk/rtc.c
fujita_ryohei 047644344a V0.1 ソフト開発者の皆さんのTEG2ボードをこれにリセットしました。
既知の不具合 Vol値が突然不正になることがある。ADCの値がおかしい。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@3 013db118-44a6-b54f-8bf7-843cb86687b1
2009-08-19 08:16:22 +00:00

109 lines
2.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
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/fXT1.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;
}
}