📄 intservice.c
字号:
/* 标记脉冲宽度 */
static signed int total_energy_led_remaining_time;
unsigned long ul_actensper1,ul_actensper2;
//union signed_long_word ds;
/************************************************************
* SD16中断函数 *
* *
* 说明:当ESP关闭时用SD16测量温度 *
*************************************************************/
/****************************************************************
* ESP中断服务程序 *
****************************************************************/
#pragma vector=ESP430_VECTOR
__interrupt void ESP_ISR (void)
{
unsigned int msg_data= MBIN1;
unsigned int msg = MBIN0;
unsigned int tmp;
if (msg == mEVENT)
{
if (msg_data & ENRDYFG)
{
// sd16cycle=0;
// sd16cycle1=0;
//#if PULSE_MEASURE_MODE != 2
*(int*)(&DM.EspRs.lActEnergy1) = ACTENERGY1_LO;
*((int*)(&DM.EspRs.lActEnergy1)+1) = ACTENERGY1_HI;
if(DM.EspRs.lActEnergy1<0)
{
DM.EspRs.lActEnergy1=-DM.EspRs.lActEnergy1;
DM.uiESP430_STAT0 |= NEGENFG0;
}
else
{
DM.uiESP430_STAT0 &= ~NEGENFG0;
}
//#endif
#ifdef TAMPER_DETECTION
*(int*)(&DM.EspRs.lActEnergy2) = ACTENERGY2_LO;
*((int*)(&DM.EspRs.lActEnergy2)+1) = ACTENERGY2_HI;
if(DM.EspRs.lActEnergy2<0)
{
DM.EspRs.lActEnergy2=-DM.EspRs.lActEnergy2;
DM.uiESP430_STAT0 |= NEGENFG1;
}
else
{
DM.uiESP430_STAT0 &= ~NEGENFG1;
}
if(DM.EspRs.lActEnergy2>DM.EspRs.lActEnergy1)
{
DM.uiESP430_STAT0 |= I2LARGEI1;
}
else
{
DM.uiESP430_STAT0 &= ~I2LARGEI1;
}
#endif
*(int*)(&DM.EspRs.lReActEnergy) = REACTENERGY_LO;
*((int*)(&DM.EspRs.lReActEnergy)+1) = REACTENERGY_HI;
*(int*)(&DM.EspRs.lAppEnergy) = APPENERGY_LO;
*((int*)(&DM.EspRs.lAppEnergy)+1) = APPENERGY_HI;
//SM.EspChk = ChkSum((unsigned char *)&SM.Esp, sizeof(SM.Esp));
DM.EspRs.uiV1Rms = V1RMS;
*(int*)(&DM.EspRs.ulIRms) = IRMS_LO;
*((int*)(&DM.EspRs.ulIRms)+1) = IRMS_HI;
/*
if(DM.EspRs.ulIRms>SM.Cfg.EspPar.ulStartCurrent)
{
DM.EspRs.uiPowerFct = POWERFCT;
if(DM.EspRs.uiPowerFct>0x8000)
{
if(DM.EspRs.uiPowerFct>0xC000)
{
DM.EspRs.uiPowerFct=DM.EspRs.uiPowerFct-0xC000;
DM.EspRs.uiPowerFct=0x4000-DM.EspRs.uiPowerFct;
}
else
{
DM.EspRs.uiPowerFct = DM.EspRs.uiPowerFct-0x8000;
}
}
else
{
if(DM.EspRs.uiPowerFct>0x4000)
{
DM.EspRs.uiPowerFct=0x8000-DM.EspRs.uiPowerFct;
}
}
DM.EspRs.iCapInd = CAPIND;
}
else
{
DM.EspRs.ulIRms = 0;
DM.EspRs.uiPowerFct = 0;
DM.EspRs.iCapInd = 0;
}
*/
#if PULSE_MEASURE_MODE == 0
#ifdef TAMPER_DETECTION
//DM.ulActP1=DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
//DM.ulActP2=DM.EspRs.lActEnergy2*CZ_ENERGY_100000;
if(DM.ucKeyCalibrationMode<8)
{
if(DM.uiESP430_STAT0 & TAPERFLG) //这个地方需要修改
{
if(DM.uiESP430_STAT0 & I2LARGEI1)
{
//DM.ulLastActP = DM.ulActP2; //暂时使用
if(DM.EspRs.lActEnergy2>0)
{
DM.ulActP1=DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
DM.ulActP2=DM.EspRs.lActEnergy2*CZ_ENERGY_100000;
DM.ulLastActP = DM.ulActP2;
DM.ulReActP = DM.EspRs.lReActEnergy*CZ_ENERGY_100000;
DM.ulAppP = DM.EspRs.lAppEnergy*CZ_ENERGY_100000;
DM.EspRs.uiPowerFct = POWERFCT;
if(DM.EspRs.uiPowerFct>0x8000)
{
if(DM.EspRs.uiPowerFct>0xC000)
{
DM.EspRs.uiPowerFct=DM.EspRs.uiPowerFct-0xC000;
DM.EspRs.uiPowerFct=0x4000-DM.EspRs.uiPowerFct;
}
else
{
DM.EspRs.uiPowerFct = DM.EspRs.uiPowerFct-0x8000;
}
}
else
{
if(DM.EspRs.uiPowerFct>0x4000)
{
DM.EspRs.uiPowerFct=0x8000-DM.EspRs.uiPowerFct;
}
}
DM.EspRs.iCapInd = CAPIND;
}
else
{
DM.ulActP1=0;
DM.ulActP2=0;
DM.ulLastActP = 0;
DM.ulReActP = 0;
DM.ulAppP = 0;
DM.EspRs.ulIRms = 0;
DM.EspRs.uiPowerFct = 0;
DM.EspRs.iCapInd = 0;
}
}
else
{
//DM.ulLastActP = DM.ulActP1; //暂时使用
if(DM.EspRs.lActEnergy1>0)
{
DM.ulActP1=DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
DM.ulActP2=DM.EspRs.lActEnergy2*CZ_ENERGY_100000;
DM.ulLastActP = DM.ulActP1;
DM.ulReActP = DM.EspRs.lReActEnergy*CZ_ENERGY_100000;
DM.ulAppP = DM.EspRs.lAppEnergy*CZ_ENERGY_100000;
DM.EspRs.uiPowerFct = POWERFCT;
if(DM.EspRs.uiPowerFct>0x8000)
{
if(DM.EspRs.uiPowerFct>0xC000)
{
DM.EspRs.uiPowerFct=DM.EspRs.uiPowerFct-0xC000;
DM.EspRs.uiPowerFct=0x4000-DM.EspRs.uiPowerFct;
}
else
{
DM.EspRs.uiPowerFct = DM.EspRs.uiPowerFct-0x8000;
}
}
else
{
if(DM.EspRs.uiPowerFct>0x4000)
{
DM.EspRs.uiPowerFct=0x8000-DM.EspRs.uiPowerFct;
}
}
DM.EspRs.iCapInd = CAPIND;
}
else
{
DM.ulActP1=0;
DM.ulActP2=0;
DM.ulLastActP = 0;
DM.ulReActP = 0;
DM.ulAppP = 0;
DM.EspRs.ulIRms = 0;
DM.EspRs.uiPowerFct = 0;
DM.EspRs.iCapInd = 0;
}
}
if(DM.uiESP430_STAT0 & NEGENFG0)
{
//LED_REACTIVE_OUT &= ~LED_REACTIVE_BIT;
}
else
{
//LED_REACTIVE_OUT |= LED_REACTIVE_BIT;
}
}
else
{
//DM.ulLastActP = DM.ulActP1;
if(DM.EspRs.lActEnergy1>0)
{
DM.ulActP1=DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
DM.ulActP2=DM.EspRs.lActEnergy2*CZ_ENERGY_100000;
DM.ulLastActP = DM.ulActP1;
DM.ulReActP = DM.EspRs.lReActEnergy*CZ_ENERGY_100000;
DM.ulAppP = DM.EspRs.lAppEnergy*CZ_ENERGY_100000;
DM.EspRs.uiPowerFct = POWERFCT;
if(DM.EspRs.uiPowerFct>0x8000)
{
if(DM.EspRs.uiPowerFct>0xC000)
{
DM.EspRs.uiPowerFct=DM.EspRs.uiPowerFct-0xC000;
DM.EspRs.uiPowerFct=0x4000-DM.EspRs.uiPowerFct;
}
else
{
DM.EspRs.uiPowerFct = DM.EspRs.uiPowerFct-0x8000;
}
}
else
{
if(DM.EspRs.uiPowerFct>0x4000)
{
DM.EspRs.uiPowerFct=0x8000-DM.EspRs.uiPowerFct;
}
}
DM.EspRs.iCapInd = CAPIND;
}
else
{
DM.ulActP1=0;
DM.ulActP2=0;
DM.ulLastActP = 0;
DM.ulReActP = 0;
DM.ulAppP = 0;
DM.EspRs.ulIRms = 0;
DM.EspRs.uiPowerFct = 0;
DM.EspRs.iCapInd = 0;
}
if(DM.uiESP430_STAT0 & NEGENFG1)
{
//LED_REACTIVE_OUT &= ~LED_REACTIVE_BIT;
}
else
{
//LED_REACTIVE_OUT |= LED_REACTIVE_BIT;
}
}
}
else if(DM.ucKeyCalibrationMode<10)
{
DM.ulLastActP = DM.ulActP1;
}
else
{
DM.ulLastActP = DM.ulActP2;
}
#else
//DM.ulActP1 = DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
//DM.ulLastActP = DM.ulActP1;
if(DM.EspRs.lActEnergy1>0)
{
DM.ulActP1=DM.EspRs.lActEnergy1*CZ_ENERGY_100000;
DM.ulLastActP = DM.ulActP1;
DM.ulReActP = DM.EspRs.lReActEnergy*CZ_ENERGY_100000;
DM.ulAppP = DM.EspRs.lAppEnergy*CZ_ENERGY_100000;
DM.EspRs.uiPowerFct = POWERFCT;
if(DM.EspRs.uiPowerFct>0x8000)
{
if(DM.EspRs.uiPowerFct>0xC000)
{
DM.EspRs.uiPowerFct=DM.EspRs.uiPowerFct-0xC000;
DM.EspRs.uiPowerFct=0x4000-DM.EspRs.uiPowerFct;
}
else
{
DM.EspRs.uiPowerFct = DM.EspRs.uiPowerFct-0x8000;
}
}
else
{
if(DM.EspRs.uiPowerFct>0x4000)
{
DM.EspRs.uiPowerFct=0x8000-DM.EspRs.uiPowerFct;
}
}
DM.EspRs.iCapInd = CAPIND;
}
else
{
DM.ulActP1=0;
DM.ulLastActP = 0;
DM.ulReActP = 0;
DM.ulAppP = 0;
DM.EspRs.ulIRms = 0;
DM.EspRs.uiPowerFct = 0;
DM.EspRs.iCapInd = 0;
}
#endif
#endif
//DM.ulReActP = DM.EspRs.lReActEnergy*CZ_ENERGY_100000;
//DM.ulAppP = DM.EspRs.lAppEnergy*CZ_ENERGY_100000;
DM.ulMainsPeriodBak = DM.EspRs.ulMainsPeriod;
DM.ullMainsCntBak = DM.EspRs.uiMainsCnt;
DM.EspRs.ulMainsPeriod=0;
DM.EspRs.uiMainsCnt=0;
if (DM.ucCalibrationMode>0)
{
Calibration();
}
SystemEventFlag |= SYSTEM_ESP_ENRDYFG;
_BIC_SR_IRQ(LPM0_bits);
}
#ifdef TAMPER_DETECTION
if (msg_data & TAMPFG)
{
//LED_TAMP_OUT &= ~LED_TAMP_BIT;
DM.uiESP430_STAT0 |= TAPERFLG;
}
else
{
//LED_TAMP_OUT |= LED_TAMP_BIT;
DM.uiESP430_STAT0 &= ~TAPERFLG;
}
#endif
if (msg_data & ZXTRFG)
{
DM.uiEspState |= ZXLDFG;
}
if ((msg_data &ZXLDFG)&& (DM.uiEspState & ZXLDFG ))
{
DM.uiEspState &= ~ZXLDFG;
// sd16cycle1++;
tmp=MAINSPERIOD;
#if PULSE_MEASURE_MODE == 1
if(DM.EspRs.uiV1Rms>STARTVOLTAG)
{
*(int*)(&DM.EspRs.lActensper1) = ACTENSPER1_LO;
*((int*)(&DM.EspRs.lActensper1)+1) = ACTENSPER1_HI;
if(DM.EspRs.lActEnergy1<0)
{
DM.EspRs.lActEnergy1=-DM.EspRs.lActEnergy1;
DM.uiESP430_STAT0 |= NEGENFG0;
}
else
{
DM.uiESP430_STAT0 &= ~NEGENFG0;
}
}
else
{
*(int*)(&DM.EspRs.lActensper1)=0;
*((int*)(&DM.EspRs.lActensper1)+1)=0;
}
DM.ulLastActP = (long long)(DM.EspRs.lActensper1)*CZ_ENERGY_100000
*1048576/tmp;
#endif
//DM.Esp.ulMainsPeriod += MAINSPERIOD;
DM.EspRs.ulMainsPeriod += tmp;
DM.EspRs.uiMainsCnt++;
}
#ifndef PULSE_TIMEA_GEN
if (msg_data & WFSRDYFG)
{
//sd16cycle++;
#if PULSE_MEASURE_MODE != 2
#ifdef NO_NEG_ENGER
SM.Acc.ullAccKwhPp += DM.ulLastActP;
if(SM.Acc.ullAccKwhPp >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhPp -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.ucP595OUT |= ACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_ACTIVE_OUT |= LED_ACTIVE_BIT;
#endif
TACCR1 = TAR + ENERGY_PULSE_PERIOD;
TACCTL1 = CCIE;
SM.Puls.ucPulsKwhPp++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhPp>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhPp = 0x01 ;
_BCD4INC(SM.CMon.KwhPp.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
SM.Acc.ullAccKwhQp += DM.ulReActP;
if(SM.Acc.ullAccKwhQp >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhQp -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.ucP595OUT |= REACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_REACTIVE_OUT |= LED_REACTIVE_BIT;
#endif
DM.ucReActPulseCycle = REACT_PULSE_CYCLE;
SM.Puls.ucPulsKwhQp++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhQp>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhQp = 0x01 ;
_BCD4INC(SM.CMon.KwhQp.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
#else
if (DM.uiESP430_STAT0 &NEGENFG)
{
SM.Acc.ullAccKwhPn += DM.ulLastActP;
if(SM.Acc.ullAccKwhPn >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhPn -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.P595OUT |= ACTIVE_CAL;
Update_HC595_Port(DM.P595OUT);
#elif PCB_VERSION==1
LED_ACTIVE_OUT |= LED_ACTIVE_BIT;
#endif
TACCR1 = TAR + ENERGY_PULSE_PERIOD;
TACCTL1 = CCIE;
SM.Puls.ucPulsKwhPn++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhPn>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhPn = 0x01 ;
_BCD4INC(SM.CMon.KwhPn.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
SM.Acc.ullAccKwhQn += DM.ulReActP;
if(SM.Acc.ullAccKwhQn >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhQn -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.ucP595OUT |= REACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_REACTIVE_OUT |= LED_REACTIVE_BIT;
#endif
DM.ucReActPulseCycle = REACT_PULSE_CYCLE;
SM.Puls.ucPulsKwhQn++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhQn>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhQn = 0x01 ;
_BCD4INC(SM.CMon.KwhQn.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
}
else
{
SM.Acc.ullAccKwhPp += DM.ulLastActP;
if(SM.Acc.ullAccKwhPp >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhPp -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.P595OUT |= ACTIVE_CAL;
Update_HC595_Port(DM.P595OUT);
#elif PCB_VERSION==1
LED_ACTIVE_OUT |= LED_ACTIVE_BIT;
#endif
TACCR1 = TAR + ENERGY_PULSE_PERIOD;
TACCTL1 = CCIE;
SM.Puls.ucPulsKwhPp++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhPp>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhPp = 0x01 ;
_BCD4INC(SM.CMon.KwhPp.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
SM.Acc.ullAccKwhQp += DM.ulReActP;
if(SM.Acc.ullAccKwhQp >= ENERGY_PULSE_THRESHOLD_100000)
{
SM.Acc.ullAccKwhQp -= ENERGY_PULSE_THRESHOLD_100000;
#if PCB_VERSION==0
DM.ucP595OUT |= REACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_REACTIVE_OUT |= LED_REACTIVE_BIT;
#endif
DM.ucReActPulseCycle = REACT_PULSE_CYCLE;
SM.Puls.ucPulsKwhQp++;
DM.ucChkFlg |= BIT0;
if(SM.Puls.ucPulsKwhQp>O_O1KWH_PULS)
{
SM.Puls.ucPulsKwhQp = 0x01 ;
_BCD4INC(SM.CMon.KwhQp.Fee[0]);
DM.ucChkFlg |= BIT1;
}
}
}
#endif
if(DM.ucChkFlg&BIT0)
{
DM.ucChkFlg &= ~BIT0;
SM.PulsChk = ChkSum((unsigned char *)&SM.PulsChk, sizeof(SM.PulsChk));
}
if(DM.ucChkFlg&BIT1)
{
DM.ucChkFlg &= ~BIT1;
SM.CMonChk = ChkSum((unsigned char *)&SM.CMon, sizeof(SM.CMon));
}
#endif
if(DM.ucReActPulseCycle>0)
{
DM.ucReActPulseCycle--;
if(DM.ucReActPulseCycle==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -