⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_time.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 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 + -