📄 sys_time.c
字号:
#pragma interrupt INTTM51 _basic_timer
#include "includes.h"
sreg unsigned char SystemTime[7]={0,0,0,0,0,0,0};
unsigned char BasicTimerTick=0;
unsigned char SystemTime_MonthHex;
unsigned char SystemTimeSecCnt;
sreg unsigned short TimerCounter[TIMER_NUMBER] = {0,0,0,0,0,0,0};
const PROC_FUNC TimerProc[TIMER_NUMBER] =
{
LcdLightOff,
LcdDispPageOff,
ResetClearStatusWord,
Att702xValidityCheck,
CancleProgram,
IrOff,
CancleProgram
};
const unsigned char days_every_month[] = {
31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31,
};
const unsigned short days_per_month[] = {
0, 31, 59, 90, 120, 151,
181, 212, 243, 273, 304, 334,
};
void RedundancyTimer(ushort time)
{
unsigned char index;
for(index=0;index<TIMER_NUMBER;index++)
{
if(TimerCounter[index])
{
TimerCounter[index] = UsignedShortSub(TimerCounter[index] ,(ushort)time) ;
if(!TimerCounter[index])
{
TimerProc[index]();
}
}
}
}
void DealCoverCounterTimer(ushort time)
{
unsigned char idx;
for( idx = 0; idx < 4; idx++ )
{
if( CoverTimerCounter[idx] )
{
CoverTimerCounter[idx] = UsignedShortSub(CoverTimerCounter[idx] ,time);;
}
}
}
void GetSystemTime(void)
{
unsigned char reqtime,sysmin;
RtcOperation(0x05,SystemTime,7);
reqtime=Bcd2HexChar(SystemTime[SPACE_OF_SECOND]);
SystemTimeSecCnt=reqtime;
SystemTime_MonthHex=Bcd2HexChar(SystemTime[SPACE_OF_MONTH])-1;
sysmin=Bcd2HexChar(SystemTime[SPACE_OF_MINUTE]);
if((sysmin%15)==0)
{
_sys_evt_add(EVT_TIMER_15_MIN);
}
}
void SetSystemTime(void)
{
SystemTime[3]=CalcWeek();
RtcOperation(0x00,SystemTime,7);
_sys_evt_add(EVT_TIMER_MIN);
}
unsigned char CalcWeek(void)
{
unsigned short days=0;
unsigned char tt[3],i;
tt[0]=SystemTime[SPACE_OF_DAY];
tt[1]=SystemTime[SPACE_OF_MONTH];
tt[2]=SystemTime[SPACE_OF_YEAR];
for(i=0;i<3;i++)
{
tt[i]=Bcd2HexChar(tt[i]);
}
tt[1]--;
days=(tt[2]/4)*1461+(tt[2]%4)*365+days_per_month[tt[1]]+tt[0]-1;
if(tt[2]&0x03)
{
days++;
}
else
{
if(tt[1]>=2) days++;
}
i = (unsigned char)((days+6)%7);
return i;
}
void GetLoadRespDayData(void)
{
unsigned short temp,ii;
if( !IsPowerOn() ) return;
MemSetZero( (unsigned char *)&pub_data.pub_data_buff2[0], OFFSET_LOAD_RESPRESET_DAY );
for( ii = 0; ii < 6; ii++ )
{
pub_data.pub_data_buff2[ii] = (unsigned long)CurrentVI[ii] * 10;
pub_data.pub_data_buff2[ii] = Hex2BcdLong( pub_data.pub_data_buff2[ii] );
}
for( ii = 0; ii < 4; ii++ )
{
temp = GetPowerFactor( _calc_factor_item[ii] );
temp = Bcd2HexShort(temp);
pub_data.pub_data_buff2[6+ii] = temp;
pub_data.pub_data_buff2[6+ii] *= 10;
pub_data.pub_data_buff2[6+ii] = Hex2BcdLong( pub_data.pub_data_buff2[6+ii] );
}
ii = Bcd2HexChar( SystemTime[SPACE_OF_HOUR] );
DI1DI0 = LOAD_RESPRESET_DAY_BASE + (ulong)( SystemTime_MonthHex * 2 + ii/12 ) * DF_PAGE_LEN + ii * OFFSET_LOAD_RESPRESET_DAY;
DataflashWriteByBuffer1( DI1DI0, (unsigned char *)&pub_data.pub_data_buff2[0], 40 );
}
void CrossHourDetect(void)
{
unsigned long temp;
unsigned char ii,hour;
if( _SysPotInfo.hour != SystemTime[SPACE_OF_HOUR] )
{
hour = Bcd2HexChar( SystemTime[SPACE_OF_HOUR] );
if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) )
{
LoadEnergy( (unsigned char *)&temp, 0xFF, 5 );
FramWrite( ADDR_OF_DAY_DATA_START+DAY_ENERGY_HOUR+hour*4, (unsigned char *)&temp, 4 );
if( SystemTime[SPACE_OF_HOUR] == 0 )
{
SaveZeroFreezePower();
}
if( SystemTime[SPACE_OF_DAY] == _SysPotInfo.load_represet_day )
{
if( !( SystemIndication & EVT_INIT_ATT702X ) )
{
GetLoadRespDayData();
}
}
}
_SysPotInfo.hour = SystemTime[SPACE_OF_HOUR];
_SysPotInfo.chksum = SysDoCheckSum((unsigned char *)&_SysPotInfo.regv_con[0],sizeof(_sys_potinfo_s)-4);
}
}
void CrossDayDetect(void)
{
unsigned long addr;
unsigned short temp = 0;
unsigned char ii;
if( _SysPotInfo.day != SystemTime[SPACE_OF_DAY] )
{
if( _SysPotInfo.day != 0 )
{
PowerDataStoreRuleDay();
addr = GetDayAddr( _SysPotInfo.year, _SysPotInfo.mon, _SysPotInfo.day );
for( ii = 0; ii < 2; ii++ )
{
FramRead( ADDR_OF_DAY_DATA_START + (unsigned short)ii * 153, (unsigned char *)&pub_data.pub_data_buff3[0], 153 );
DataflashWriteByBuffer1( addr + ii * 153, (unsigned char *)&pub_data.pub_data_buff3[0], 153 );
}
addr = GetDayAddr( SystemTime[SPACE_OF_YEAR],SystemTime[SPACE_OF_MONTH],SystemTime[SPACE_OF_DAY] );
DataflashClearPages( addr, 0, DF_PAGE_LEN, 1 );
CalcMonAverInfo();
CalcMonMaxInfo();
ClearTodayData();
FramWrite( ADDR_OF_DAY_AVERAGE_PTR, (unsigned char *)&temp, 2 );
MemSetoWriteE2prom( ADDR_OF_DAY_AVERAGE_INFO, DAY_AVERAGE_INFO_SIZE );
}
EnsurePeriodOfTime();
_SysPotInfo.day = SystemTime[SPACE_OF_DAY];
_SysPotInfo.mon = SystemTime[SPACE_OF_MONTH];
_SysPotInfo.year = SystemTime[SPACE_OF_YEAR];
_SysPotInfo.chksum = SysDoCheckSum( (unsigned char *)&_SysPotInfo.regv_con[0], sizeof(_sys_potinfo_s)-4 );
}
}
void SaveInstanPowerData(void)
{
unsigned long tempval;
unsigned char ii;
for( ii = 0; ii < 50; ii++ )
{
LoadEnergy( (unsigned char *)&tempval, 0xFF, ii );
FramWrite( ADDR_OF_FED_BASE+ii*4, (unsigned char *)&tempval, 4 );
}
for( ii = 0; ii < 12; ii++ )
{
LoadPhasePowerData( (unsigned char *)&tempval, 0xFF, phase_power_item[ii] );
FramWrite( ADDR_OF_FED_BASE+FED_PHASE_ENERGE+ii*4, (unsigned char *)&tempval, 4 );
}
}
const unsigned char g_ucValidateSystime[5] =
{
60,24,8,32,13
};
void ValidateSystime( void )
{
unsigned char i = 0, flag = 0;
unsigned char temp[SYSTIME_SIZE];
FramRead( ADDR_OF_SYSTIME_START, temp, 6 );
for( i = 0; i < SYSTIME_SIZE-1; i++ )
{
if( Bcd2HexChar( temp[i]) >= g_ucValidateSystime[i] )
{
flag = 1;
break;
}
}
for( i = 3; i < SYSTIME_SIZE; i++ )
{
if( Bcd2HexChar( temp[i] ) == 0)
{
flag = 1;
break;
}
}
if( ( SystemTime[5] < temp[4] ) || ( SystemTime[6] < temp[5] ) )
{
goto SYSTIME_INIT;
}
for( i = 4; i < SYSTIME_SIZE; i++ )
{
if( Bcd2HexChar( SystemTime[i] ) == 0)
{
goto SYSTIME_INIT;
}
}
for( i = 0; i < SYSTIME_SIZE-1; i++ )
{
if( Bcd2HexChar( SystemTime[1+i]) >= g_ucValidateSystime[i] )
{
goto SYSTIME_INIT;
}
}
if( SYSTIME_SIZE-1 == i )
{
return;
}
SYSTIME_INIT:
SystemTime[0] = 0x30;
if( flag != 0 )
{
SystemTime[1] = 0x10;
SystemTime[2] = 0x12;
SystemTime[3] = 0x01;
SystemTime[4] = 0x05;
SystemTime[5] = 0x06;
SystemTime[6] = 0x07;
}
else
{
FramRead( ADDR_OF_SYSTIME_START, &SystemTime[1], 6 );
}
SetSystemTime( );
}
void TM51Init( void )
{
ClrIORBit(TMC51, 0x80);
TCL51 = TM_TM51_CLOCK;
SetIORBit(PR1L, 0x08);
ClrIORBit(IF1L, 0x08);
CR51 = TM_TM51_INTERVALVALUE;
}
void TickEventStart( void )
{
TMIF51 = 0;
SetIORBit(TMC51, 0x80);
ClrIORBit(MK1L, 0x08);
}
void TickEventStop( void )
{
ClrIORBit(TMC51, 0x80);
SetIORBit(MK1L, 0x08);
}
void BasicTimerInit(void)
{
TM51Init();
TickEventStart();
}
__interrupt void _basic_timer( void )
{
TMIF51 = 0;
ProgramStatusWord = DEVICE_OK;
if( ++BasicTimerTick >= TICK_CNT_PER_SECOND )
{
BasicTimerTick -= TICK_CNT_PER_SECOND;
SYS_EVT_ADD( EVT_TIMER_SEC );
}
if( BasicTimerTick == 2 )
{
SYS_EVT_ADD( EVT_READ_POWER1 );
}
else if( BasicTimerTick == 6 )
{
SYS_EVT_ADD( EVT_READ_POWER2 );
}
if( CancleAlarmSoundTime != 0 )
{
CancleAlarmSoundTime--;
if( CancleAlarmSoundTime == 0 )
{
ALARM_SOUND_CANCLE();
ALARM_LIGHT_CANCLE();
ALARM_LIGHT2_OFF();
}
}
if( CommPortChose )
{
if(_wait_time)
{
if( --_wait_time == 0 )
{
SYS_EVT_ADD(EVT_INIT_COMM);
}
}
else
{
FramePointer = 0;
CommPortChose = 0;
}
}
if( IsPowerOn() )
{
SYS_EVT_ADD(EVT_TICK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -