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

📄 timer.c

📁 MSP430F413单相电表DEMO(编译器IAR 3.42A)
💻 C
字号:
// 以下是有外时钟
#ifdef I2C_RX8025
#else
const unsigned char HowDay[]={
	0x31,	0x28,	0x31,
	0x30,	0x31,	0x30,
	0x31,	0x31,	0x30,
	0,		0,		0,
	0,		0,		0,
	0x31,	0x30,	0x31,
};
#endif

void ClkInit( void )
{
  BTCTL =
#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
#elif Second_Div==3
	 BT_ADLY_250			// 1/8 = 125ms
#elif Second_Div==1
	 BT_ADLY_500			// 1/8 = 125ms
#else
   BT_ADLY_1000
#endif
	+ BTFRFQ0;				// STK LCD 128Hz

	IE2 |= BTIE;
}

void ClkRest( void )
{
	SM.Clk.Sec[0]=0x00;
	SM.Clk.Min[0]=0x00;
	SM.Clk.Hour[0]=0x00;
	SM.Clk.Week[0]=6;
	SM.Clk.Day[0]=0x05;
	SM.Clk.Mon[0]=0x02;
	SM.Clk.Year=0x2004;
}

void ClkSys( void )            //
{
	unsigned int i;
	
	if (SM.Clk.Sec[0]<0x59) _BCD1INC((unsigned char *)&SM.Clk.Sec[0] );
	else
	{
		SM.Clk.Sec[0]=0;   
		DM.Tsk.Req.Min=1;    
		if (SM.Clk.Min[0]<0x59) _BCD1INC((unsigned char *)&SM.Clk.Min[0] );
		else
		{
			SM.Clk.Min[0]=0;     
			DM.Tsk.Req.Hour=1;    
			if (SM.Clk.Hour[0]<0x23) _BCD1INC((unsigned char *)&SM.Clk.Hour[0] );
			else
			{
				SM.Clk.Hour[0]=0;
				if( SM.Clk.Week[0]>=6 ) SM.Clk.Week[0]=0;		// 0100 0000
				else SM.Clk.Week[0]++;
				i=BCD2Byte(SM.Clk.Year&0xFF);
				if (SM.Clk.Day[0]<(((SM.Clk.Mon[0]==2)&&((i&0x03)==0))?0x29:HowDay[SM.Clk.Mon[0]-1]))
					_BCD1INC((unsigned char *)&SM.Clk.Day[0] );
				else
				{
					SM.Clk.Day[0]=1;
					if (SM.Clk.Mon[0]<0x12) _BCD1INC((unsigned char *)&SM.Clk.Mon[0] );
					else
					{
						SM.Clk.Mon[0]=1;
						_BCD1INC((unsigned char *)&SM.Clk.Year );
					}
				}
			}
		}
	}
	
	SM.ClkChk=ChkSum((unsigned char*)&SM.Clk,sizeof(RTC));
}

void ProcHalf(void)
{ 
	DM.Tsk.Req.Half=0;   
#if Second_Counter >= 2
	WDTCTL = WDT_ARST_1000;			// Clear WDT
#endif
}

const unsigned char TariLed[]=
{
	0xff,
	~LED_RED_BIT,     //~P6LEDRATE2,		// 0x10		// P6.4
	~LED_YELLOW_BIT,  //~P6LEDRATE3,		// 0x20		// P6.5
	~LED_GREEN_BIT,   //~P6LEDRATE4		// 0x40		// P6.6
};

void ProcSec(void)
{
#if Second_Counter >= 2
  WDTCTL = WDT_ARST_1000;			// Start WDT
#endif

  DM.Tsk.Req.Sec=0;    
	
	ClkSys();
	
	if(SM.Clk.Sec[0]==0)
	{
		SM.Cfg.FeeNo[0]=GetFeeNo();
		if( SM.Cfg.FeeNo[0]>3 ) SM.Cfg.FeeNo[0]=1;
	
		SM.Cfg.MetStatus[0] &=~0xC0; 					// 费率状态
		SM.Cfg.MetStatus[0] |= SM.Cfg.FeeNo[0]<<6;
	
		SM.Cfg.MetStatus[0]=BATTEST(SM.Cfg.MetStatus[0]);		// 电池状态
		
    if( REVP_IN & REVP_BIT )
		{
			_BCD3INC(&SM.Cfg.IRevAllTmr[0]);
			SM.Cfg.MetStatus[0] |= M_DIR;	// 电能方向
			LCDMEM[0] |= 0x40;
		}
		else
		{
			SM.Cfg.MetStatus[0] &=~M_DIR;
			LCDMEM[0] &=~0x40;
		}
		SM.CfgChk=ChkSum((unsigned char*)&SM.Cfg, sizeof(CFGGRP));
		SM.E2Flgs |= S_E2CFGGRP;   
		DM.Tsk.Req.I2C=1;    
	
	
#ifdef TEMP_COMPENSATE
		// 启动温度转换。
		DM.Reg.b[0] = 0x00;
		SetI2CData(DM.Reg.b,0x9E,0x01,1);
#endif		

	}
	
#ifdef TEMP_COMPENSATE
	if(SM.Clk.Sec[0]==1)
	{

		// 让 AD7416 进入掉电模式。
		DM.Reg.b[0] = 0x01;
		SetI2CData(DM.Reg.b,0x9E,0x01,1);
		
		// 读出温度值,取高10位,再右移2位,得温度的整数度。
		GetI2CWord(DM.Reg.w,0x9E,0x00 );
		DM.Reg.w[0] >>=6;
		
		// +0x02 的目的,是为了修正C语言中的四舍五入问题。
		if(DM.Reg.w[0]&0x200)
			SM.Temp=-((0x402-DM.Reg.w[0])>>2);	// 负温度
		else
			SM.Temp =(DM.Reg.w[0]+0x02)>>2;
			
		if(SM.Temp>80) SM.Temp=80;
		if(SM.Temp<-40) SM.Temp=-40;
		
		_NOP();
	}
// 以下程序为内部软件时钟温度补偿:
	// when t=-40, use cofset[0].
	SM.cul_t = SM.cul_t + cofset_t[SM.Temp+40];
	if(SM.cul_t>=15625)
	{
		//温度补偿程序。
		SM.cul_t -=15625;
		DM.Flgs |= F_Temp;
	}
#endif
//
	

	//以下一句,可用红、黄、绿指示灯来代替。
  LED_COM_OUT |= (LED_RED_BIT | LED_YELLOW_BIT | LED_GREEN_BIT);
  LED_COM_OUT &= TariLed[SM.Cfg.FeeNo[0]];

#ifdef DISPLAY_CHANGED

#ifdef OSC_FAULT_DETECT
  if ( (SM.Cfg.LcdCtl.Mode&0x03)==0 ) DspCtrl();
#else
  if ( SM.Cfg.LcdCtl.Mode==0 ) DspCtrl();
#endif

#else

#ifdef OSC_FAULT_DETECT
	if ( (SM.Cfg.LcdCtl.Mode[0]&0x03)==0 ) DspCtrl();
#else
  if ( SM.Cfg.LcdCtl.Mode[0]==0 ) DspCtrl();
#endif

#endif
   
	DM.Tsk.Req.Disp=1;    
}

void ProcMin(void)
{
	DM.Tsk.Req.Min=0;   
}

void ProcHour(void)
{	
  DM.Tsk.Req.Hour=0;  
	SM.Cfg.MetStatus[0] &=~M_CHKCLK;
	
	if( (SM.Cfg.BillDay[0]==SM.Clk.Hour[0])&&(SM.Cfg.BillDay[1]==SM.Clk.Day[0]))
	{
		SM.E2Flgs |= S_E2LMONGRP; 
		DM.Tsk.Req.I2C=1;   
	}
}

⌨️ 快捷键说明

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