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

📄 intservice.c

📁 MSP430FE42X复费率电表DEMO(编译器 IAR 3.42A)
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -