📄 icp._c
字号:
#include "includes.h"
//---------------------------------------------------
unsigned int Cnt_Old=0;
unsigned int Cnt_New=0;
unsigned int Motor_Period=0;
unsigned int Cnt_Delta=0;
unsigned char Motor_Period_Hbyte=0;
unsigned char Motor_Period_Lbyte=0;
unsigned char Icr1L_Value=0;
unsigned char Icr1H_Value=0;
unsigned char Flag=0;
//--------------------------------------------------
//Timer1初始化和ICP中断处理函数
void Timer1_Init(void)
{
TCCR1B=0x00; //停止计数器
TCCR1B=0b11000010; //时钟为系统时钟8分频,为1us
TIMSK|=0b00100000; //使能ICP中断
}
/*******************************************/
#pragma interrupt_handler Timer1_Capt_Isr:6
void Timer1_Capt_Isr(void)
{
CLI();
Icr1L_Value=ICR1L;
Icr1H_Value=ICR1H;
Cnt_New=Icr1L_Value+(256*Icr1H_Value);//获得现在计数值
if(Cnt_New>=Cnt_Old) //判断新老计数值关系
{ //新值大于老值
Cnt_Delta=Cnt_New-Cnt_Old;
}
else //新值小于老值
{
Cnt_Delta=0xffff-Cnt_Old+Cnt_New;
}
Cnt_Old=Cnt_New;
Motor_Period=Cnt_Delta*T0_CLK;//计算周期值
Motor_Period_Hbyte=((unsigned char)((Motor_Period& 0xff00)>>8));//计算周期高字节
Motor_Period_Lbyte=((unsigned char)(Motor_Period&0x00ff));//计算周期低字节
if(Motor_Period_Lbyte=0xff)//避免与帧头重复
{
Motor_Period_Lbyte=0xfe;
}
Flag++;
if(Flag%100==0)
{
Usart_Tx(0xff);//上传帧头
Usart_Tx(Motor_Period_Hbyte);//上传周期高字节
Usart_Tx(Motor_Period_Lbyte);//上传周期低字节
}
SEI();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -