|
发表于 2012-6-15 16:59:11
|
显示全部楼层
>> 测出的数据怎么感觉比用定时器测得误差还大呢??
不应如此。
初始化程序为
void time1_init(void)
{
void time1_init(void)
{
TCCR1A=0x00; //普通计数
m=0;
n=0;
// TCCR1B: 不使能输入捕捉噪声抑制,上升沿触发,不分频
TCCR1B = (0<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
// 先等待上升沿,然後等待下降沿
while !(PINB & 0x01);
while (PINB & 0x01);
TIFR|=(1<<ICF1); //清 ICF 中断标志
TIMSK1=0X20; //开捕捉中断
}
捕捉中断程序
void INcatch_ser(void)
{
uint a;
a = ICR1;
if(PINB&0X01) //读脚位电平
{
num1=a;
// TCCR1B &= 0XBF; //改触发方式,下降沿
// TCCR1B: 不使能输入捕捉噪声抑制,下降沿触发,不分频
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
TIFR|=(1<<ICF1); //改变触发方式后立即清中断标志
m=1; //上升沿捕捉完成标志
}
else
{
num2=a;
// TCCR1B |= 0X40; //改触发方式,上升沿
// TCCR1B: 不使能输入捕捉噪声抑制,上升沿触发,不分频
TCCR1B = (0<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)
TIFR|=(1<<ICF1); //改变触发方式后立即清中断标志
n=1; //下降沿捕捉完成标志
}
if((m==1)&&(n==1)) //表示一个完整的高电平脉宽检测完
{
if(num1<num2) num3= num2-num1; //判断定时器是否溢出
else num3=0xffff- num1 + num2 + 1;
n=0;m=0;
}
}
|
|