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

📄 sys_event.c

📁 用ADE7169F16单片机实现了单向多费4率电能表
💻 C
字号:
/*************************************
;Ade7169 demo program     
;*************************************
;AUTHOR:        Su RuTong
;DATE:          03 09 2006
;*************************************/


#include "Hal.h"
#include "sys_event.h"
#include "public.h"
#include "Display.h"
#include "RTC.h"
#include "UART.h"
#include "utilities.h"
#include "sys_init.h"
#include "sys_init.h"
#include "Measure.h"


unsigned char data _event_word = 0;
unsigned char data _evt_word_of_power;

/****************************************************************************************************/
// Set when the VDD power supply has been restored. This occurs when the source of VSW changes from VBAT to VDD.
void _on_power_restored(void)
{
    unsigned char temp;
    LowVDCINFlag = 0;
    KYREG = 0xA7;
    temp=0x00;                                  // LcdInterval as temp
    POWCON=temp;                                // POWCON & 0xF8; //CD2 CD1 CD0=000 4.096MHz
    InitBSO();
    InitLCD();
}

// Set when an enabled PSM interrupt condition occurs.
void _on_PSM(void)
{
}

// Set when an ADE energy measurement SAG condition occurs.
void _on_vSag(void)
{
}

// Set when VSW changes by VSWDIF or when VSW measurement is ready.
void _on_VSWDIF(void)
{
}

// Set when VBAT falls below BATVTH or when the VBAT measurement is ready.
void _on_VBAT(void)
{
    // Turn off PLL
    // Blink LCD
    // Display battery ICON
    //_Lcd_Write(0x0a,0x04);// battery ICON
    // Goto PSM2 mode
}

// Set when VSW switches from VDD to VBAT.
void _on_vdd2vbat(void)
{
    unsigned char temp;
    
    LowVDCINFlag = 1;
    LCDCON |= BLINKEN;
                                                // set 32768Hz core frequency
    KYREG = 0xA7;
    temp=0x03;                                  // LcdInterval as temp
    POWCON=temp;                                // POWCON & 0xF8; //CD2 CD1 CD0=000 4.096MHz
    // Goto PSM2 mode
}

// Set when VDCIN falls below 1.2V.
void _on_vdcin_low(void)
{
    LowVDCINFlag = 1;
}

/****************************************************************************************************/
void _on_nop(void)
{
}

void _on_tick(void)
{
    // _read_energy
    
    // Accumulate Energy
    if(bManDisp) {DisplayProcess();}
    //_DisplayTime();
}

void _on_500ms(void)
{
    // parse VRMS,IRMS,Fre,
}

void _on_second(void)
{
    /*
    _tariff_detect();
    _calc_delta_energy();
    _alarm();
    */
    DisplayRefresh();
    // 电量数据保存
    SavePowerData();
    
#if 0
    BreakPowerDetect();
    RedundancyTimerProc();
    Ade7758ResetDetect();
    if(!(SystemIndication&EVENT_INIT_ADE7758))
    {
        PhaseVoltageDetect();
    }
    
    ClrWDT();
    if(SystemIndication&EVENT_SPECTIME_00_SEC)
    {
        GetSystemTime();
        if(CurrentMinute!=SystemTime[SPACE_OF_MINUTE])
        {
            SaveRequirePowerDataMinute();
            RequirePowerTime++;
            if(RequirePowerTime>=_SysPotInfo.reqtime_huacha)
            {
                RequirePowerTime=0;
                SetSystemEvent(EVENT_CYCTIME_REQ);
            }
            CurrentMinute=SystemTime[SPACE_OF_MINUTE];
        }
        ClearSystemEvent(EVENT_SPECTIME_00_SEC);
    }
    else
    {
        SystemTime[SPACE_OF_SECOND]=Hex2BcdChar(SystemTimeSecCnt);
    }

    // 电量数据保存
    SavePowerData();
    // 更新时段
    ExesAttributeDetect();
    // 检查是否结算
    MonthBalanceDetect();
    // 检查是否跨时
    CrossHourDetect();
    // 检查是否跨天
    CrossDayDetect();
    // LCD轮显
    DisplayRefresh();
    // 报警
    Alarm();
#endif
}

void _on_minute(void)
{
    /*
    _get_sys_time_hex();
    if(_current_minute!=_sys_time.minutes)
    {
        _save_delta_energy_min();
        _save_run_time();
        if((_sys_time.minutes%15)==0)
        {
            _save_load_profile();
            _get_temperature();
        }
        _calc_demand_timer++;
        if(_calc_demand_timer>=_SysPotInfo.reqtime_huacha)
        {
            _calc_demand_timer=0;
            _sys_evt_add(SYS_EVT_DEMAND);
        }
        _current_minute=_sys_time.minutes;
    }
    */
}

void _on_hour(void)
{
    // Update system time
    // _SysPotInfo.hour=_sys_time.hours;
    // _billing_detect();
    // _SysPotInfo.chksum=GetChkSumRvrs((unsigned char *)&_SysPotInfo.regv_min,sizeof(_sys_potinfo_s)-4);
}

void _on_day(void)
{
    // update SysDate
    UpdCalendar();
    // _store_power_data(STORE_DATA_DAY|STORE_DATA_CURRENT|STORE_DATA_TOTLE|STORE_DATA_TIMEZONE);
    // EnsurePeriodOfTime();
    // _clear_power_data(_get_spec_day_addr());
}

void _on_comm(void)
{
    // protocol
    ParseFrame();
    /*
    if(!RxFrameInfo())
    {
        LCDMEM[LCD_CN_INFO_ADDR_COM]|=LCD_CN_INFO_COM;
        ParseRxFrame();
    }
    UartReInit();
    */
}

/****************************************************************************************************/
code const PW_EVT_PROC_PTR _pw_evt_handle[]=
{
    _on_power_restored,
    _on_PSM,
    _on_vSag,
    _reserved,
    _on_VSWDIF,
    _on_VBAT,
    _on_vdd2vbat,
    _on_vdcin_low
};

void _on_power_down(void)
{
    // Power supply mode: PSM0, PSM1 and PSM2
    unsigned char i;
	for(i=0;i<sizeof(_pw_evt_handle)/sizeof(PW_EVT_PROC_PTR);i++)
	{
		if((_evt_word_of_power&(BIT0<<i)))
		{
            _pw_evt_handle[i]();
			_evt_word_of_power&=~(BIT0<<i);
			// CLR_WDT();
		}
		CLR_WDT();
		if(_evt_word_of_power == 0)
		{
            break;
		}
	}
}

void power_detect_proc(void)
{
    unsigned char temp;
    
    PERIPH_TMP=PERIPH;
    if((PERIPH_TMP&BIT5)!=0) {KYREG = 0xA7;temp=0x00;POWCON=temp;LCDCON &= ~BLINKEN; return;}                // PERIPH.6 = 1 means supplied by VDD
    else if((PERIPH_TMP&BIT6)==0)                   // supplied by VDD? 0:by battery; 1: by VDD
    {
        LCDCON |= BLINKEN;
        _Lcd_Write(0x0a,0x04);                      // battery ICON
        InitPSR();                                  // if not, enable power supply restore interrupt
                                                    // set 32768Hz core frequency
        KYREG = 0xA7;
        temp=0x03;                                  // LcdInterval as temp
        POWCON=temp;                                // POWCON & 0xF8; //CD2 CD1 CD0=000 4.096MHz
        #if 0
        do
        {
            PERIPH_TMP=PERIPH;
            CLR_WDT();
        }while((PERIPH_TMP&BIT6)==0);
        InitWDT();                                  // Enable WDT
        while(1);                                   // wait for system reset by WDT
        #endif
    }
}












⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -