📄 sys_event.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 + -