www.pudn.com > TCPmodbushy.rar > TIMER.C


/****************************************************************************** 
 * Project     : T_BOX 
 * Module Name : TIMER.C 
 * CPU Type    : C8051F340 
 * 
 * Description : 
 * 
 * History        Author     Version       Comment 
 * 2002.12.22       HY       V0.0         Original version 
 * 
 * Copyright (C) 2006 ZJY. All rights reserved. 
 ******************************************************************************/ 
#include	"o:\sysdef.h" 
 
/******************************************************************************* 
* Controlled by Timer0 
*******************************************************************************/ 
uchar	data	Timer5ms; 
uchar  	data 	DipTime = 0; 
bit Dip_flag = YES; 
bit PreMS_flag; 
uchar data DIPstate; 
extern bit	data shield_flag; 
/******************************************************************************* 
* Use Timer2 direct( Not for Int ) 
*******************************************************************************/ 
static	uint	data ms_timeout; 
 
/******************************************************************************* 
* Use Timer2 direct( for Int out ) 
*******************************************************************************/ 
#define	Timer250MsCycle		250 
 
/******************************************************************************* 
* IpConflictTime 
*******************************************************************************/ 
static	uchar	data	Timer250MsPulse;			// 250ms Pulse flag 
static	uchar	data	Timer2Sum; 
 
static void StartTimer0( void ); 
static void Enable_Timer0_INT( void ); 
static void StartTimer2( void ); 
static void Enable_Timer2_INT( void ); 
static void Disable_Timer2_INT( void ); 
static void start_ms_timer( void ); 
static char get_ms_timer_flag( void ); 
static void clear_ms_timer_flag( void ); 
 
sfr16 TMR2RL   = 0xca;                    // Timer2 reload value 
sfr16 TMR2     = 0xcc;                    // Timer2 counter 
 
/****************************************************************************** 
* FUN: initialize timer, set timer period .&. interrupt priority 
******************************************************************************/ 
void InitTimer0( void ) 
{	 
	CKCON = CKCON | 0x04;				// uses the system clock 
	TMOD = ( TMOD & 0xF0 ) | 0x01;		// timer mode = Mode 1: 16-bit timer 
	TH0 = HIGH_BYTE( Timer0InitValue ); 
	TL0 = LOW_BYTE( Timer0InitValue ); 
	StartTimer0(); 
	Enable_Timer0_INT(); 
} 
 
/****************************************************************************** 
* function: timer 0 interrupt  
******************************************************************************/ 
void Timer0Srv( void ) interrupt 1 using Timer0SrvBank 
{ 
	TH0 = HIGH_BYTE( Timer0InitValue ); 
	TL0 = LOW_BYTE( Timer0InitValue ); 
	 
	if( Timer5ms != 0 ) 
	{ 
		Timer5ms--; 
		if( Timer5ms == 0 ) 
		{ 
			if(!shield_flag) 
				FrameDataReceived = END_RECEIVE; 
			else 
				RcvCommuLen = 0; 
			COM_LED = LED_OFF; 
		} 
	} 
	if(commDelyTime != 0 ) 
	{	 
		commDelyTime--; 
		if(commDelyTime == 0) 
			slave_send_flag = YES; 
	} 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void StartTimer0( void ) 
{ 
	TR0 = ON; 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void Enable_Timer0_INT( void ) 
{ 
	ET0 = ON; 
} 
 
/****************************************************************************** 
* FUN: initialize timer2, set timer2 period .&. interrupt priority 
******************************************************************************/ 
void InitTimer2( void ) 
{ 
	TMR2CN  = 0x00;						// Stop Timer2; Clear TF2; use SYSCLK/12 as timebase; 
	CKCON  &= ~0x30;					// uses the system clock 
 
	TMR2RLH = HIGH_BYTE( Timer2InitValue ); 
	TMR2RLL = LOW_BYTE( Timer2InitValue ); 
 
	TMR2H = HIGH_BYTE( Timer2InitValue ); 
	TMR2L = LOW_BYTE( Timer2InitValue ); 
 
	StartTimer2(); 
	Timer250MsPulse = OFF; 
	Timer2Sum = 0; 
	Enable_Timer2_INT(); 
} 
 
/****************************************************************************** 
* function: timer 2 interrupt  
******************************************************************************/ 
void Timer2Srv( void ) interrupt 5 using Timer2SrvBank 
{ 
	TF2H = 0;							// Clear Timer2 Int Flag 
 
	Timer2Sum++; 
	if( Timer2Sum == (Timer250MsCycle/Timer2Cycle) ) 
	{ 
		Timer2Sum = 0; 
		if( Timer250MsPulse ) 
			Timer250MsPulse= OFF; 
		else 
			Timer250MsPulse = ON; 
	} 
	if( UART_out_time != 0 ) 
	{ 
		UART_out_time--; 
	} 
	/*DIP process*/ 
	if(DIPstate != ( P1 & 0x1E )) 
	{ 
		DipTime = 30; 
		DIPstate = 0; 
		DIPstate |= ( P1 & 0x1E ); 
	} 
	if( DipTime != 0 ) 
		DipTime--; 
	else 
	{ 
		uchar Tmp = 0; 
		if( MS_flag ) 
			Tmp |= MASTER_NOT_SLAVE; 
		if( Get_ip_mode ) 
			Tmp |= AUTO_NOT_MANUAL_IP; 
		if( Tbox_state ) 
			Tmp |= SETPARA_NOT_WORK; 
		if( Land_mode ) 
			Tmp |= AUTOLAND; 
		CurWorkState = Tmp; 
	} 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void StartTimer2( void ) 
{ 
	TR2 = ON; 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void Enable_Timer2_INT( void ) 
{ 
	ET2 = ON; 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void Disable_Timer2_INT( void ) 
{ 
	ET2 = OFF; 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
void wait_ms( uint ms ) 
{ 
	TMR2CN  = 0x00;						// Stop Timer2; Clear TF2; 
										// use SYSCLK/12 as timebase 
	CKCON  &= ~0x30;					// Timer2 clocked based on T2XCLK; 
 
	TMR2RL = -(OscFreq/1000/12);			// Timer 2 overflows at 1 kHz 
	TMR2 = TMR2RL; 
 
	ET2 = 0;							// Disable Timer 2 interrupts 
 
	TR2 = 1;							// Start Timer 2 
 
	while( ms ) 
	{ 
		TF2H = 0; 
		while(!TF2H);					// wait until timer overflows 
		ms--;							// decrement ms 
	} 
	TR2 = 0;							// Stop Timer 2 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
void reset_timeout( uint ms ) 
{ 
   ms_timeout = ms; 
   start_ms_timer(); 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
uchar timeout_expired( void ) 
{ 
	if( get_ms_timer_flag() ) 
	{ 
		clear_ms_timer_flag(); 
		if(ms_timeout > 0) 
		{ 
			ms_timeout--; 
		} 
	} 
	return( ms_timeout == 0 );   
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static void start_ms_timer( void ) 
{ 
	TMR2CN = 0x00;						// Stop Timer2; Clear TF2; 
										// use SYSCLK/12 as timebase 
	CKCON  &= ~0x30;					// Timer2 clocked based on T2XCLK; 
	TMR2RL = -(OscFreq/1000/12);			// Timer 2 overflows at 1 kHz 
	TMR2 = TMR2RL; 
	ET2 = 0;							// Disable Timer 2 interrupts 
	TR2 = 1;							// Start Timer 2 
} 
 
/****************************************************************************** 
* 
******************************************************************************/ 
static char get_ms_timer_flag( void ) 
{ 
	return TF2H; 
} 
/****************************************************************************** 
* 
******************************************************************************/ 
static void clear_ms_timer_flag( void ) 
{ 
	TF2H = 0; 
} 
 
/****************************************************************************** 
* Deal all about LWIP's Time Task  
******************************************************************************/ 
void LWIP_Relative_Tmr( void ) 
{ 
	static uchar StoreTimer250MsPulseState = 0;		/* in order to fet LOW-Hight change edge */ 
	static uchar Arp_Interval_Timer = 0;			/* clock time max 255*250ms */ 
#if LWIP_DHCP 
	static uchar Dhcp_Fine_Interval_Timer = 0;		/* clock time max 255*250ms */ 
	static uchar Dhcp_Coarse_Interval_Timer = 0;	/* clock time max 255*250ms */ 
#endif 
	static uchar Ip_Reass_Interval_Timer = 0;		/* clock time max 255*250ms */ 
 
	/* close Timer2 int to protect StoreTimer250MsPulseState use Timer250MsPulse */ 
	Disable_Timer2_INT(); 
	if( Timer250MsPulse != StoreTimer250MsPulseState ) 
	{ 
		StoreTimer250MsPulseState = Timer250MsPulse; 
		Enable_Timer2_INT(); 
 
		if( landTIME != 0 ) 
		{/* LANDING INTERVAL */ 
			landTIME -= Timer250MsCycle; 
		} 
		/* ARP_INTERVAL */ 
		Arp_Interval_Timer++; 
		if( Arp_Interval_Timer == (ARP_TMR_INTERVAL/Timer250MsCycle) ) 
		{ 
			Arp_Interval_Timer = 0; 
			etharp_tmr(); 
		} 
#if LWIP_TCP 
		/* TCP_INTERVAL */ 
		tcp_tmr(); 
#endif 
#if LWIP_DHCP 
		Dhcp_Fine_Interval_Timer++; 
		Dhcp_Coarse_Interval_Timer++; 
		if( Dhcp_Fine_Interval_Timer == (DHCP_FINE_TIMER_MSECS/Timer250MsCycle) ) 
		{ 
			Dhcp_Fine_Interval_Timer = 0; 
			dhcp_fine_tmr(); 
		} 
	//	if( Dhcp_Coarse_Interval_Timer == (DHCP_COARSE_TIMER_SECS*1000)/Timer250MsCycle ) 
		if(Dhcp_Coarse_Interval_Timer == 240) 
		{ 
			Dhcp_Coarse_Interval_Timer = 0; 
			dhcp_coarse_tmr(); 
		} 
#endif 
		Ip_Reass_Interval_Timer++; 
		if( Ip_Reass_Interval_Timer == 1000/ Timer250MsCycle ) 
		{ 
			Ip_Reass_Interval_Timer = 0; 
			ip_reass_tmr(); 
		} 
		/* Arp Confliect Check */ 
		if( IpConflictTime ) 
		{ 
			IpConflictTime--; 
			if( IpConflictTime == (IP_CONFLICT_CHECK_TIME/2) )	// 0.25*IP_CONFLICT_CHECK_TIME/2 = 'x'S 
			{ 
				if( netif->ip_addr.addr != 0 ) 
					etharp_query( &(netif->ip_addr), NULL ); 
			} 
			if( IpConflictTime ) 
				IP_LED = LED_OFF; 
		} 
	} 
	else 
	{ 
		Enable_Timer2_INT(); 
	} 
}