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

📄 intservice.c

📁 MSP430FE42X复费率电表DEMO(编译器 IAR 3.42A)
💻 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(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 + -