📄 timer.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 + -