#include <iom16v.h>
#include <macros.h>
#include <STDIO.h>
//时钟4MHZ
//t/c1 8分频
//
volatile char cap_flag=0;//为0是时刻1 为1是时刻2
volatile unsigned int ov_countr=0;
volatile unsigned int cesu_time1,cesu_time2;
//输入捕获初始化
void capture_init(void)
{
TCCR1B=BIT(ICES1)|BIT(CS11);//上升沿触发,8分频 0X42
TIMSK=0X24;//输入捕获中断,溢出中断
SEI();//全局中断使能
}
//计数器1溢出中断
#pragma interrupt_handler ov_timer1:9
void ov_timer1()
{
ov_countr++;
}
////输入捕获中断
#pragma interrupt_handler capture_timer1:6
void capture_timer1()
{
if(cap_flag==1)//时刻2
{cap_flag=0;//
cesu_time2=ICR1;
}
else//时刻1
{
ov_countr=0;//时刻1 清空溢出计数器
cesu_time1=ICR1;
cap_flag=1;
}
}
//分析程序
//自己需要的其他程序都可以写在这里
void cesu_fenxi(void)
{unsigned long int pulse_clocks;
pulse_clocks = (unsigned long)cesu_time2 - (unsigned long)cesu_time1
+ (unsigned long)ov_countr * 0x10000 / 500; //计算脉冲宽度
}
///主要程序
void main()
{
capture_init();//
while(1)
{
cesu_fenxi();
}
}
|