ctr_mcu/trunk/rtc.c
n2232 28d501e219 ■2.0Dテスト
(バグ修正)電池が無くて、アダプタ有りの時、電源を入れようとしていた(すぐに電圧低くて切れる)。修正。
(バグ修正)wdtリセット後、電源が切れてしまっていた。hdwinit2の設定ミス。
(バグ修正?)ヒューズ切れ時、充電LEDが点きっぱなしになってしまったのを回避
(バグ修正)アダプタをさして、電池を付けてから起動すると、ステータスが充電中にならなかったのを修正
(リファクタリング?)DI_wt_chk()をDI()に。上手にマクロが書けなかった。そのうち?
もういらない #if 0 を少し削除、残す物にはコメント追加
rtc.c、インターバルのフラグを+1ではなく、=1にした。wait_ms(100)などしたときに50回タスクが回ってしまう。インターバルを当てにしてウェイトにしていることがあるので、多少コマ落ちしても間隔を守る


git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@399 013db118-44a6-b54f-8bf7-843cb86687b1
2011-08-31 11:43:44 +00:00

178 lines
4.4 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
======================================================== */
#ifndef _WIN32
#pragma sfr
#pragma inline
#endif
#include "incs.h"
#define RTC_DATA_SIZE 7
// ========================================================
static u8 rtc_work[RTC_DATA_SIZE];
static bit rtc_lock;
static bit rtc_dirty;
bit rtc_alarm_dirty;
/* ========================================================
ペリフェラルの初期化
レジスタの電池交換ビットのセット
======================================================== */
void RTC_init( void )
{
if( !RTCEN ) // ビットが立っていたらリブート
{
RTCEN = 1; // モジュールON
// RTC設定
RTCC0 = bits8(0,0,0,0, 1,0,0,0); /* 動作停止、24時間制、32k出力「まだなし」、定周期割り込みなし */
// (RTCE 0 RCLOE1 RCLOE0 AMPM CT2 CT1 CT0)
RTCC1 = bits8(1,1,0,0, 0,0,0,0); /* アラーム割り込み有効&動作開始 */
// (WALE WALIE 0 WAFG RIFG 0 RWST RWAIT)
RTCC2 = bits8(1,0,0,0, 0,0,0,0); /* インターバル:32k/2^6=2ms、RTCDIV出力なし */
// (RINTE RCLOE2 RCKDIV 0 0 ICT2 ICT1 ICT0)
HOUR = 0x00;
MIN = 0x00;
SEC = 0x00;
MONTH = 0x01;
DAY = 0x01;
WEEK = 0x01; // Mon
YEAR = 0x01;
ALARMWW = 0x7F;
vreg_ctr[VREG_C_MCU_STATUS] |= REG_BIT_RTC_BLACKOUT;
}
// 割り込み設定
RTCIF = 0;
RTCIIF = 0;
RTCMK = 1; /* 割り込み(定周期)禁止 */
RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */
RTCE = 1; /* 動作開始 */
RWAIT = 1;
while( !RWST )
{;}
RWAIT = 0;
rtc_lock = false;
rtc_dirty = false;
rtc_alarm_dirty = false;
}
/* ========================================================
RTC アラーム割り込み
======================================================== */
__interrupt void int_rtc( )
{
RWAIT = 1;
while( !RWST )
{;}
// 日付も指定日で
if( ( vreg_ctr[VREG_C_RTC_ALARM_DAY] == DAY )
&& ( vreg_ctr[VREG_C_RTC_ALARM_MONTH] == MONTH )
&& ( vreg_ctr[VREG_C_RTC_ALARM_YEAR] == YEAR ) )
{
set_irq( VREG_C_IRQ1, REG_BIT_RTC_ALARM );
}
RWAIT = 0;
}
/* ========================================================
RTC のリード
レジスタは、sec,min,hour,week,day,month,year の順
======================================================== */
void rtc_buf_refresh( )
{
if( !rtc_lock )
{
rtc_lock = true;
RWAIT = 1;
while( !RWST )
{;}
memcpy( &vreg_ctr[VREG_C_RTC_SEC], &SEC, RTC_DATA_SIZE );
RWAIT = 0;
// renge_task_immed_add( tski_rtc_close );
}
}
/* ========================================================
RTC のライト
set_rtc_close と対で使って下さい。
こいつはバッファにコピーするだけで、
実際にRTCにセットするのはset_rtc_close()です。
======================================================== */
void set_rtc( u8 adrs, u8 data )
{
if( !rtc_dirty )
{
rtc_dirty = true;
memcpy( rtc_work, &SEC, RTC_DATA_SIZE );
// renge_task_immed_add( tski_rtc_close ); // I2C終了時に行う
}
rtc_work[adrs] = data;
}
/* ========================================================
必要ならば、RTCレジスタの更新
======================================================== */
// task_status_immed tski_rtc_close(){
void rtc_unlock( )
{
// リードロック
rtc_lock = false;
// ライトロック
if( rtc_dirty )
{
rtc_dirty = false;
RWAIT = 1;
while( !RWST )
{;}
memcpy( &SEC, rtc_work, RTC_DATA_SIZE );
RWAIT = 0;
}
// アラームセット
if( rtc_alarm_dirty )
{
rtc_alarm_dirty = false;
WALE = 0;
ALARMWM = vreg_ctr[VREG_C_RTC_ALARM_MIN];
ALARMWH = vreg_ctr[VREG_C_RTC_ALARM_HOUR];
WALE = 1;
}
}
/* ========================================================
RTC システムチックタイマ割り込みベクタ
2^6/fXT1.953125 ms
======================================================== */
__interrupt void int_rtc_int( )
{
// renge_flg_interval ++; // インクリメント/デクリメント命令を使うので DI()不要
renge_flg_interval = 1; // インクリメント/デクリメント命令を使うので DI()不要
}