?? 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 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;
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;
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;
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++;
}
#if PULSE_MEASURE_MODE == 2
if (msg_data & ILREACHEDFG)
{
//ilcycle++;
SM.uiActIntrptLevlCounter++;
if(SM.uiActIntrptLevlCounter>359)
//if(SM.uiActIntrptLevlCounter>1)
{
SM.uiActIntrptLevlCounter = 0;
#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.uiActEPulse++;
if(SM.uiActEPulse>1)
{
SM.uiActEPulse = 0x00 ;
_BCD4INC(SM.CMon.KwhPp.Fee[0]);
}
}
}
#endif
} // End of if (MBIN0 == mEVENT)
/*
if (msg == mTEMPRDY)
{
DM.iTempSample = msg_data;
SystemEventFlag |= SYSTEM_TEMP_COMPENSATE;
}
*/
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void BT_ISR (void)
{
//SystemEventFlag |= SYSTEM_BT_FLAG;
//_BIC_SR_IRQ(LPM3_bits);
SystemEventFlag |= SYSTEM_WATCHDOG_RESET;
_BIC_SR_IRQ(LPM3_bits);
}
#pragma vector=KEY_VECTOR
__interrupt void Key_ISR (void)
{
if((KEY_COM_IFG & KEY_UP_BIT) == KEY_UP_BIT)
{
DM.ucKeyFlg |= KEY_UP_FLAG;
KEY_COM_IFG &= ~KEY_UP_BIT;
}
if((KEY_COM_IFG & KEY_DOWN_BIT) == KEY_DOWN_BIT)
{
DM.ucKeyFlg |= KEY_DOWN_FLAG;
KEY_COM_IFG &= ~KEY_DOWN_BIT;
}
/*
if((KEY_COM_IFG & KEY_REMOVE_BIT) == KEY_REMOVE_BIT)
{
DM.uc_KeyFlg |= KEY_REMOVE_FLAG;
KEY_COM_IFG &= ~ KEY_REMOVE_BIT;
}
*/
SystemEventFlag |= SYSTEM_KEY_FLAG;
_BIC_SR_IRQ(LPM3_bits);
}
#pragma vector=PORT2_VECTOR
__interrupt void PowerDown_ISR (void)
{
if(((POWER_TEST_IN & POWER_TEST_BIT) == 0) && ((ESPCTL & ESPEN) == ESPEN))
{
MBOUT1= modeIDLE; // ESP_IDLE;
MBOUT0= mSET_MODE;
while ((ESP430_STAT0 & ACTIVEME) == ACTIVEME); // Wait for Idle mode
ESPCTL = 0;
SD16CTL = 0x0000;
SCFI0 = FLLD_1; // Freq = 1.024MHz
SCFQCTL = 32 - 1;
FLL_CTL0 &= ~DCOPLUS;
#if PCB_VERSION==0
DM.ucP595OUT &= ~(ACTIVE_CAL+REACTIVE_CAL);
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_ACTIVE_OUT &= ~LED_ACTIVE_BIT;
LED_REACTIVE_OUT &= ~LED_REACTIVE_BIT;
#endif
TACCTL1 = 0x00;
DM.ucReActPulseCycle = 0;
SystemEventFlag |= SYSTEM_DATASAVE_FLAG;
DataSave_Process();
DM.ulActP1 = 0;
DM.ulReActP = 0;
DM.ulAppP = 0;
DM.uiV1Rms = 0;
DM.ulIRms = 0;
DM.iPf = 0;
DM.uiMainsFrequency = 0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -