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();
}
}