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

📄 timer.c

📁 MSP430FE42X防窍电电表DEMO(编译器IAR3.42)
💻 C
字号:

//**********************************************************************
// Clock Start
//**********************************************************************
void ClkStart( void )
{
	//BTCTL = BTDIV+BTIP2+BTIP1;
/*#if	Second_Div==63
	+ BT_ADLY_16			// 1/64 = 16ms
#elif Second_Div==31
	+ BT_ADLY_32			// 1/32 = 32ms
#elif Second_Div==15
	+ BT_ADLY_64			// 1/16 = 64ms
#elif Second_Div==7
	+ BT_ADLY_125			// 1/8 = 125ms
#endif
	+ BTFRFQ0;				// STK LCD 128Hz*/
  
// 设置中断频率为 0.5s, 液晶时钟原32分频 */
  BTCTL = BT_fLCD_DIV32 | BT_fCLK2_DIV64 | BT_fCLK2_ACLK_DIV256;
// 1s 中断使能 */  
	IE2 |= BTIE;
}

//**********************************************************************
// Turn Clk (BCD) to Clk0 (binary)
//**********************************************************************
void ClkBcd_ClkHex( void )
{
	SM.ClkHex.Sec[0]  = BCD2Byte(SM.ClkBcd.Sec[0]);
	SM.ClkHex.Min[0]  = BCD2Byte(SM.ClkBcd.Min[0]);
	SM.ClkHex.Hour[0] = BCD2Byte(SM.ClkBcd.Hour[0]);
	SM.ClkHex.Day[0]  = BCD2Byte(SM.ClkBcd.Day[0]);
	SM.ClkHex.Mon[0]  = BCD2Byte(SM.ClkBcd.Mon[0]);
	SM.ClkHex.Year[0] = BCD2Byte(SM.ClkBcd.Year[0]);
	SM.ClkHex.Week[0] = SM.ClkBcd.Week[0] & 7;
  SM.ClkHexChk = ChkSum( (unsigned char*)&SM.ClkHex, sizeof(CLKDEF) );
}

//**********************************************************************
// Turn ClkHex (binary) to ClkBcd (BCD)
//**********************************************************************
void ClkHex_ClkBcd( void )
{
	SM.ClkBcd.Sec[0]  = Byte2BCD(SM.ClkHex.Sec[0]);
	SM.ClkBcd.Min[0]  = Byte2BCD(SM.ClkHex.Min[0]);
	SM.ClkBcd.Hour[0] = Byte2BCD(SM.ClkHex.Hour[0]);
	SM.ClkBcd.Day[0]  = Byte2BCD(SM.ClkHex.Day[0]);
	SM.ClkBcd.Mon[0]  = Byte2BCD(SM.ClkHex.Mon[0]);
	SM.ClkBcd.Year[0] = Byte2BCD(SM.ClkHex.Year[0]);
	//if( SM.ClkBcd.Sec[0]==0 ) SM.ClkBcd.Week[0] = GetWeek();
  SM.ClkBcdChk = ChkSum( (unsigned char*)&SM.ClkBcd, sizeof(CLKDEF) );
}

//**********************************************************************
// Turn YYMMDD to GmDay
//**********************************************************************
unsigned int GetGmDay( unsigned char* Addr )
{
   unsigned int Tmp,Mon,Year;

   Tmp=BCD2Byte(*Addr);
   Addr++;
   Mon=BCD2Byte(*Addr);
   Addr++;
   Year=BCD2Byte(*Addr);

   Tmp+=DayTab[Mon]+Year*365+(Year>>2)+1;
   if( (Year&0x03)==0 && Mon<=2 ) Tmp--;
   return Tmp;
}
//**********************************************************************
// Get the Week of Today
//**********************************************************************
char GetWeek( void )
{
   unsigned int Tmp;

   Tmp=GetGmDay(SM.ClkBcd.Day)+5;
   return( Tmp%7 );
}
//**********************************************************************
// Clock Initialize
//**********************************************************************
void ClkBcdInit( void )
{
	SM.ClkBcd.Sec[0]= 0x00;
	SM.ClkBcd.Min[0]= 0x10;
	SM.ClkBcd.Hour[0]=0x04;
	SM.ClkBcd.Day[0]= 0x05;
	SM.ClkBcd.Mon[0]= 0x02;
	SM.ClkBcd.Year[0]=0x04;
  SM.ClkBcd.Year[1]=0x20;
  SM.ClkBcd.Week[0]=0x04;
	//SM.ClkBcd.Week[0]=GetWeek();
  SM.ClkBcdChk=ChkSum((unsigned char*)&SM.ClkBcd, sizeof(CLKDEF));
	ClkBcd_ClkHex();
}

//**********************************************************************
// Clock Check
//**********************************************************************
void ClkCheck( void )
{
  if( SM.ClkHexChk==ChkSum( (unsigned char*)&SM.ClkHex, sizeof(CLKDEF) ) )
	{
		ClkHex_ClkBcd();
	}
  else if( SM.ClkBcdChk==ChkSum( (unsigned char*)&SM.ClkBcd, sizeof(CLKDEF) ) )
	{
		ClkBcd_ClkHex();
	}
	else
	{
		ClkBcdInit();
	}
	//SM.FeeNo=GetFeeNo();
}

/*void Sec_xDiv( void )
{
	if ( DM.bt_int<Second_Div ) DM.bt_int++;
	else
	{
		DM.ClkFlg |= F_Sec;
		
		DM.bt_int=0;
	}
}*/

void ClkSys( void )			//
{
 
	SM.ClkHex.Sec[0]++;
		
	if (SM.ClkHex.Sec[0] > 59)
	{
		SM.ClkHex.Sec[0]=0;
    SystemEventFlag |= SYSTEM_MINUTE_FLAG;
		SM.ClkHex.Min[0]++;		
		if (SM.ClkHex.Min[0] > 59)
		{
			SM.ClkHex.Min[0]=0;
      SystemEventFlag |= SYSTEM_HOUR_FLAG;

			SM.ClkHex.Hour[0]++;
			if (SM.ClkHex.Hour[0] > 23)
			{
				SM.ClkHex.Hour[0]=0;
        SystemEventFlag |= SYSTEM_DAY_FLAG;
				SM.ClkHex.Week[0]++;
				SM.ClkHex.Day[0]++;
				switch(SM.ClkHex.Mon[0])
				{
					case 1:
					case 3:
					case 5:
					case 7:
					case 8:
					case 10:
					case 12: if(SM.ClkHex.Day[0]>31){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}break;
					case 4:
					case 6:
					case 9:
					case 11: if(SM.ClkHex.Day[0]>30){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}break;
					case 2:	 {
						        if(SM.ClkHexLeap)
						         {
						        	 if(SM.ClkHex.Day[0]>29){SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}
						         }
						        else
						         {
						         	if(SM.ClkHex.Day[0]>28)
						         	{SM.ClkHex.Day[0]=1;SM.ClkHex.Mon[0]++;}
						         }
						       }break;			
				}

				if (SM.ClkHex.Mon[0] > 12)
				{
					SM.ClkHex.Mon[0]=1;
					SM.ClkHex.Year[0]++;
					if((SM.ClkHex.Year[0]%4==0 && SM.ClkHex.Year[0]%100) || SM.ClkHex.Year[0]%400 == 0)
					 SM.ClkHexLeap = 1;
					else SM.ClkHexLeap = 0;
				}
				if (SM.ClkHex.Week[0] > 6) SM.ClkHex.Week[0]=0;
			}
		}
	}	
  SM.ClkHexChk=ChkSum( (unsigned char*)&SM.ClkHex,sizeof(CLKDEF) );
	ClkHex_ClkBcd();
}

//char ComClkChk( char *rByte )					// if timer error, return !0.
signed char ComClkChk( unsigned char *rByte )	
{
	if (rByte[0]>0x59) return -1;
	else
	{
		if (rByte[1]>0x59) return -1;
		else
		{
			if (rByte[2]>0x32) return -1;
			else
			{
				//////////////////////////////////////
				// ------- rByte[3] is week --------//
				
				if ((rByte[4]>0x31)||(rByte[4]== 0)) return -1;
				{
					if ((rByte[5] > 0x12)||(rByte[4]== 0)) return -1;
					else if(rByte[6]>0x99) return -1;
				}
			}
		}
	}
	return 0;
}

void Time_Compensate(void)
{
  long temp =0;
  temp = DM.iTempSample*1.83108263;
  temp = temp - SM.Cfg.EspPar.iTempSampleOffset;
  temp = temp/132;
  temp = temp -273;
  DM.iTemperature = temp;
  if(DM.iTemperature<0)
  {
    DM.iTemperature = -DM.iTemperature;
    MeterRunState |= TEMP_FLAG;
  }
  else
  {
    MeterRunState &= ~TEMP_FLAG;
  }
  Word2BCD1(DM.ubTemperature,DM.iTemperature);
  
  //temp = DM.iTempSample - DM.iTempSampleOffset;
  //temp = ((((float)temp)/32768.0) * 640.0 - 343.349)/1.257 + 0.5 ; //	加0.5,四舍五入
  //DM.iTemperature = (int)temp; // 此时已经是一个摄氏温度值, 用于LCD显示
  
  temp -= 25;
  temp = temp*temp*35*CORRECT_TIME;
  temp = -temp;
  
  // 晶体的基本偏差,也就是在常温时25摄氏度时,晶体偏差 
  // 为了方便处理,在程序中,我们对偏差,包括温度引起的和基本偏差,都放大1000倍 
  
  temp += CRYSTAL_BASE_CORRECTION;
  if (temp >= 0)
    {
        SM.lTimeErrAcc += temp;
        if (SM.lTimeErrAcc >= 1000000000)
        {
            SM.lTimeErrAcc -= 1000000000;
            /* 累计偏差已达到1秒,我们需要跳过一秒 */
                       
            MeterRunState |= SKIP_A_SECOND;
        }
    }
    else
    {
        SM.lTimeErrAcc += temp;
        if (SM.lTimeErrAcc <= -1000000000)
        {
            SM.lTimeErrAcc += 1000000000;
            /* 累计偏差已达到1秒,我们需要额外增加一秒 */
            //rtc_bumper();
        }
    }
  SystemEventFlag &= ~SYSTEM_TEMP_COMPENSATE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -