caihong001 发表于 2012-6-5 18:46:58

avr输入捕捉,求助

我用的是ATMEGA48,要测800---2300US的脉冲   ICR是PB0

初始化程序为
voidtime1_init(void)
{
       TCCR1A=0x00;
       TCCR1B=0xc1;
       TIMSK1=0X20;
}

捕捉中断程序
void   INcatch_ser(void)
{
      uint    a,b;

      if(PINB&0X01)    //读脚位电平
   {
          a=ICR1L;
          b=ICR1H;
          num1=(b<<8)|a;   
          TCCR1B&= 0XBF;    //改触发方式
          TIFR|=(1<<ICF1);
          m=1;
   }
   else
   {
          a=ICR1L;
          b=ICR1H;
          num2=(b<<8)|a;
          TCCR1B|= 0X40;    //改触发方式
          TIFR|=(1<<ICF1);
          n=1;
   }
   if((m==1)&&(n==1))
   {
            if(num1<num2)num3= num2-num1;
            else    num3=0xffff-num1+num2;
            n=0;m=0;
   }
}

这样读出的num3是一个很乱的数据

eblc1388 发表于 2012-6-5 20:02:04

本帖最后由 eblc1388 于 2012-6-5 20:30 编辑

M48 时钟多小 MHz? 要测正脉冲或负脉冲?

结果如何乱跳?

liusoldier 发表于 2012-6-5 20:52:24

你这个中断处理程序太长,连计算间隔都在里面,没必要。你计算那些放在中断外面。另外,最好用裸中断,自己返回,节省中断反应时间。其实最好用汇编写。
就算你时钟4M,时钟间隔也才0.25us,这个也应该够了。你这个出来乱我估计是计数器溢出了,导致两个数不一定谁比谁大,num2溢出后不一定就比num1小啊。

liusoldier 发表于 2012-6-5 20:54:19

你这个中断处理程序太长,连计算间隔都在里面,没必要。你计算那些放在中断外面。另外,最好用裸中断,自己返回,节省中断反应时间。其实最好用汇编写。
就算你时钟4M,时钟间隔也才0.25us,这个也应该够了。你这个出来乱我估计是计数器溢出了,导致两个数不一定谁比谁大,num2溢出后不一定就比num1小啊。

caihong001 发表于 2012-6-5 21:31:57

eblc1388 发表于 2012-6-5 20:02 static/image/common/back.gif
M48 时钟多小 MHz? 要测正脉冲或负脉冲?

结果如何乱跳?

8m的,正脉冲,就是数据不准,比如我测1000us的,1000/0。125应该是8000的,现在误差太大了,而且不不稳定

eblc1388 发表于 2012-6-5 22:04:06

现在的程式有机会捕捉了负脉冲,因为 m 和 n 谁都可以一先一後,你没法保证。

如果你肯正是正脉冲,那就应该在 T1 init 时等待下降缘才设定上升缘捕捉。在中断内,如读脚位电平为高时,贮存 T1 捕获埴及改设捕捉缘为下降便可。

如读脚位电平为低,便可计算实际捕获长度了。在对 num3 计算後,把捕捉缘改成上升。



页: [1]
查看完整版本: avr输入捕捉,求助