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

📄 timer.c

📁 AVR单片机基础上的以太网协议编程
💻 C
字号:
/**************************************************************************
**
**    文件: Timer.c
**    描述: 该文件完成定时器的初始化、删除和中断服务程序,所有定时器64分频 
            T1用于发送设备声明报文的间隔计时、本地周期报文发送时刻计时、非周期报文发送阶段到来计时
			T2用于计算证实报文响应时间
			T3用于计算宏周期           
**
**************************************************************************/

//include library files
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>

//include user defined files
#include "Define.h"
#include "Global_Variable.h"
#include "Extern_Function.h"
#include "EPA_ManInfBas.h"

static uint n1,n2,n3;                               //分别对应T1,T2,T3中断发生计数变量
static uint n1_Init,n2_Init,n3_Init;                //分别对应T1,T2,T3中断发生计数变量初值
static uint Timer1_Value,Timer2_Value,Timer3_Value; //分别为T1,T2,T3的定时初值
uchar T1_Flag;                                      //定时器T1的分时复用标志

/**************************************************************************
**
**    函数: void Timer1_Init(uint)
**    描述: 该函数完成16位定时器Timer1的初始化,入口参数为要定时的值
**
**************************************************************************/
void Timer1_Init(uint nms)
{
    if(nms<=10)            //<=10ms的定时
    {
        Timer1_Value=65536-(XTAL*nms)/64;
        n1=n1_Init=1;
    }
    else                  //>10ms的定时
    {
        Timer1_Value=65536-(XTAL*10)/64;
        n1=n1_Init=nms/10;
    }
 
    TCCR1B = 0x00;                       //关定时器
    TCNT1H = (Timer1_Value & 0xff00)>>8; //设置初值的高字节
    TCNT1L = Timer1_Value & 0x00ff;      //设置初值的低字节
    TCCR1A = 0x00;                       //普通定时模式
    TCCR1B = 0x03;                       //启动定时器
}

/**************************************************************************
**
**    函数: void Delete_DeviceAnnunciation_Timer(void)
**    描述: 该函数删除设备声明报文的定时器
**
**************************************************************************/
void Delete_DeviceAnnunciation_Timer(void)
{
    TCCR1B = 0x00;
}

/**************************************************************************
**
**    函数: void timer1_ovf_isr(void)
**    描述: 该函数是Timer1的中断服务程序
**
**************************************************************************/
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
    TCNT1H = (Timer1_Value & 0xff00)>>8; //装入计数器高字节
    TCNT1L = Timer1_Value & 0x00ff;      //装入计数器低字节
    n1--;                        //中断发生计数
    if (!n1)                     //定时时间到
    {
	    if(T1_Flag==T1_Interval) //发送设备声明报文的时间间隔到
        {
		    n1=n1_Init;          //每隔一定时间发送设备声明报文
		    Send_EM_DeviceAnnunciation();
		}
        else if(T1_Flag==T1_Period)//本地发送周期报文的时刻到
        {
            T1_Flag=T1_NonPeriod;  //计算非周期报文发送阶段的到来
            Timer1_Init(MIB_Csm->NonPeriodic_Data_Transfer_Offset-MIB_Lo->Send_Time_Offset);
            Send_PeriodData();   //发送周期报文
        }
        else if(T1_Flag==T1_NonPeriod)//非周期报文发送阶段到
        {
            TCCR1B = 0x00;       //关定时器
            Send_NonPeriodData();//发送非周期报文
        }
    }
}

/**************************************************************************
**
**    函数: void Timer2_Init(uint)
**    描述: 该函数完成8位定时器Timer2的初始化,入口参数为要定时的值
**
**************************************************************************/
void Timer2_Init(uint nms)
{
    if(nms<=2)           //<=2ms的定时
    {
        Timer2_Value=256-(XTAL*nms)/64;
        n2=n2_Init=1;
    }
    else                 //>2ms的定时
    {
        Timer2_Value=256-(XTAL*2)/64;
        n2=n2_Init=nms/2;
    }
	
    TCCR2 = 0x00;        //关定时器
    TCNT2 = Timer2_Value;//设置初值
    TCCR2 = 0x03;        //启动定时器
}

/**************************************************************************
**
**    函数: void Delete_Confirmation_Timer(void)
**    描述: 该函数删除证实报文的定时器
**
**************************************************************************/
void Delete_Confirmation_Timer(void)
{
    TCCR2 = 0x00;
}

/**************************************************************************
**
**    函数: void timer2_ovf_isr(void)
**    描述: 该函数是Timer2的中断服务程序
**
**************************************************************************/
#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{
     TCNT2 = Timer2_Value; //设置初值
     n2--;                 //中断发生计数
     if(!n2)               //定时时间到
     Error_Man();          //响应时间内未收到响应报文,进行错误处理
} 

/**************************************************************************
**
**    函数: void Timer3_Init(uint)
**    描述: 该函数完成16位定时器Timer3的初始化,入口参数为要定时的值
**
**************************************************************************/
void Timer3_Init(uint nms)
{
    if(nms<=10)
    {
        Timer3_Value=65536-(XTAL*nms)/64;
        n3=n3_Init=1;
    }
    else
    {
        Timer3_Value=65536-(XTAL*10)/64;
        n3=n3_Init=nms/10;
    }
	
    TCCR3B = 0x00;                      //关定时器
    TCNT3H = (Timer1_Value & 0xff00)>>8;//设置初值的高字节
    TCNT3L = Timer1_Value & 0x00ff;     //设置初值的低字节
    TCCR3A = 0x00;                      //普通定时模式
    TCCR3B = 0x03;                      //启动定时器
}

/**************************************************************************
**
**    函数: void timer3_ovf_isr(void)
**    描述: 该函数是Timer3的中断服务程序
**
**************************************************************************/
#pragma interrupt_handler timer3_ovf_isr:iv_TIM3_OVF
void timer3_ovf_isr(void)
{
    TCNT3H = (Timer3_Value & 0xff00)>>8; //装入计数器高字节
    TCNT3L = Timer3_Value & 0x00ff;      //装入计数器低字节
    n3--;                                //中断发生计数
    if (!n3)                             //定时时间到
    {
        n3=n3_Init;
        T1_Flag=T1_Period;
        Timer1_Init(MIB_Lo->Send_Time_Offset); //启动定时器T1
    }
}

/******************* End Of File **********************/

⌨️ 快捷键说明

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