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

📄 intservice.c

📁 MSP430FE42X防窍电电表DEMO(编译器IAR3.42)
💻 C
📖 第 1 页 / 共 2 页
字号:


/* 标记脉冲宽度 */
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 + -