📄 intservice.c
字号:
#if PCB_VERSION==0
DM.ucP595OUT &= ~REACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_REACTIVE_OUT &= ~LED_REACTIVE_BIT;
#endif
}
}
}
#endif
#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;
MetParConv();
MeterRunState &= ~MAIN_VOLTAGE_ON;
}
}
#ifdef PULSE_TIMEA_GEN
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_ISR (void)
{
TACCR0 = TAR + TIMERA_PULSE_PERIOD;
#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 |= HC595_ACTIVE_CAL_BIT;
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 |= HC595_REACTIVE_CAL_BIT;
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.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.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)
{
#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.Acc.ullAccKwhQn -= ENERGY_PULSE_THRESHOLD_100000;
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.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)
{
#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.Acc.ullAccKwhQp -= ENERGY_PULSE_THRESHOLD_100000;
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));
}
if(DM.ucReActPulseCycle>0)
{
DM.ucReActPulseCycle--;
if(DM.ucReActPulseCycle==0)
{
#if PCB_VERSION==0
DM.ucP595OUT &= ~REACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_REACTIVE_OUT &= ~LED_REACTIVE_BIT;
#endif
}
}
if(DM.ComBytTmr>0)
{
DM.ComBytTmr--;
if(DM.ComBytTmr==0)
{
//DM.ComBytTmr=0;
SystemEventFlag |= SYSTEM_COMM_FLAG;
_BIC_SR_IRQ(LPM3_bits);
}
}
#endif
}
#endif
#pragma vector=TIMERA1_VECTOR
__interrupt void TA1_ISR (void)
{
//switch(TAIV)
switch(__even_in_range(TAIV, 10))
{
case 0:{}break;
case 2:
{
#if PCB_VERSION==0
DM.ucP595OUT &= ~ACTIVE_CAL;
Update_HC595_Port(DM.ucP595OUT);
#elif PCB_VERSION==1
LED_ACTIVE_OUT &= ~LED_ACTIVE_BIT;
#endif
TACCTL1 = 0x00;
}break;
case 4:
{
TACCTL2 &= ~CCIE;
if((KEY_COM_IN & KEY_UP_BIT) == 0)
{
switch(DM.ucKeyMode)
{
case 0:
{
DM.ucKeyMode=1;
SM.LcdCtl.Mode=1;
DM.ucKeyCalibrationMode=0;
DM.ucKeyCalibrationStep=1;//SM.LcdCtl.PagePtr=NomMaxPages+1;
CalibrationLcdPtr();//SM.LcdCtl.PagePtr=2;
}break;
case 1:
{
DM.ucKeyMode=0;
SM.LcdCtl.Mode=0;
SM.LcdCtl.PagePtr=0;
DM.ucKeyCalibrationMode=0;
DM.ucKeyCalibrationStep=1;
SystemEventFlag |= SYSTEM_ESPPARASAVE_FLAG;
}break;
}
}
if((KEY_COM_IN & KEY_DOWN_BIT) == 0)
{
switch(DM.ucKeyMode)
{
case 0:
{
switch(SM.LcdCtl.Mode)
{
case 0:{SM.LcdCtl.Mode=1;}break;
case 1:{SM.LcdCtl.Mode=0;}break;
}
SM.LcdChk = ChkSum((unsigned char *)&SM.LcdCtl, sizeof(SM.LcdCtl));
}break;
case 1:
{
switch(DM.ucKeyCalibrationMode)
{
case 0:
{
}break;
case 1:
{
_NOP();
//DM.ucKeyCalibrationStep++;
//SM.LcdCtl.PagePtr++;
//if(DM.ucKeyCalibrationStep>CALNUM)
//{
//DM.ucKeyCalibrationStep=1;
//SM.LcdCtl.PagePtr=NomMaxPages+1;
//}
}break;
case 2:
{
TACCR2 = TAR+16384;
TACCTL2 |= CCIE;
CalibrationOperationSub(0x10);
MeterRunState |= ESP_PARAM_MODIFY;
//SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
}break;
case 3:
{
TACCR2 = TAR+16384;
TACCTL2 |= CCIE;
CalibrationOperationSub(-16);
MeterRunState |= ESP_PARAM_MODIFY;
//SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
}break;
}
}break;
}
}
else
{
if(MeterRunState & ESP_PARAM_MODIFY )
{
SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
MeterRunState &= ~ESP_PARAM_MODIFY;
}
}
SystemEventFlag |= SYSTEM_LCD_FLAG;
}break;
case 10:{_NOP();}break;
}
}
#pragma vector=SD16_VECTOR
__interrupt void SD16_ISR (void)
{
DM.iTempSample = SD16MEM2;
//if(!(emeter.ui_meter_status & IN_ESP_MODE))
//{
/* 测量完毕,关闭SD16,降功耗 */
SD16CCTL2 &= ~SD16SC;
//ESPCTL &= ~ESPEN;
SD16CTL &= ~SD16VMIDON;
SD16CTL &= ~SD16REFON;
SystemEventFlag |= SYSTEM_TEMP_COMPENSATE;
// correct_rtc();
// emeter.ui_meter_status &= ~IN_TEMPERATURE_MEASURE;
//}
}
//*****************************************************************
// USART0_Rx interrupt Receiver of RS485 or IrDA
//*****************************************************************
// Testing, it can be cut.
#ifdef __IAR_SYSTEMS_ICC__
#if __VER__ >= 200
#pragma vector=UART0RX_VECTOR
__interrupt void Int_Uart0Rx(void)
#else
interrupt[UART0RX_VECTOR] void Int_Uart0Rx(void)
#endif
#else
interrupt[UART0RX_VECTOR] void Int_Uart0Rx(void)
#endif
{
char Tmp;
Tmp=U0RXBUF;
//
if( DM.ComFlg & (F_Txing+F_RxNew) )
{
_NOP();
return;
}
if( (TAR-DM.ComTmr)>0x2000 || DM.ComBuf[RS_HeadPtr]!= 0x68 )
{
DM.ComPtr=0;
}
if( DM.ComPtr==0 && Tmp!=0x68 )
{
_NOP();
return;
}
if( (DM.ComPtr>RS_LenPtr && DM.ComPtr>=(DM.ComBuf[RS_LenPtr]+RS_MinSize)) || DM.ComPtr>=RS_MaxSize )
{
DM.ComPtr=0;
return;
}
DM.ComBuf[DM.ComPtr]=Tmp;
DM.ComTmr=TAR;
DM.ComPtr++;
if( DM.ComPtr>=RS_MinSize && DM.ComPtr==(DM.ComBuf[RS_LenPtr]+RS_MinSize) )
{
if( Tmp==0x16 )
{
DM.ComFlg |= F_RxNew;
DM.ComFlg |= P_UART0;
DM.ComFlg &=~F_Txing;
//_WKUP();
SystemEventFlag |= SYSTEM_COMM_FLAG;
_BIC_SR_IRQ(LPM3_bits);
//DM.ComBytTmr = COMM_BYTE_CYCLE;
return;
}
else
{
DM.ComBytTmr = 0;
DM.ComPtr=0;
//DM.ComFlg |= F_Txing;
return;
}
}
//
}
//*****************************************************************
// USART0_Tx interrupt Receiver of RS485 or IrDA
//*****************************************************************
#ifdef __IAR_SYSTEMS_ICC__
#if __VER__ >= 200
#pragma vector=UART0TX_VECTOR
__interrupt void Int_Uart0Tx(void)
#else
interrupt[UART0TX_VECTOR] void Int_Uart0Tx(void)
#endif
#else
interrupt[UART0TX_VECTOR] void Int_Uart0Tx(void)
#endif
{
if( DM.ComPtr<(DM.ComBuf[RS_LenPtr]+RS_MinSize) && DM.ComPtr<RS_MaxSize )
{
//DM.ComTmr=TAR;
//while( (TAR-DM.ComTmr)<655 ) {}; // 655: 20ms
U0TXBUF=DM.ComBuf[DM.ComPtr];
DM.ComPtr++;
DM.ComFlg |= F_Txing;
}
else
{
while( (U0TCTL&1)==0 ) {};
StopUT0();
StartUR0();
if(MeterRunState&MET_ADDRESS_MODIFY)
{
SystemEventFlag |= SYSTEM_ESPPARASAVE_FLAG;
MeterRunState &= ~MET_ADDRESS_MODIFY;
}
DM.ComFlg &= ~F_Txing;
DM.ComPtr=0;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -