This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请问TimerA的捕获模式的问题



#include <msp430x14x.h>

int mian (void)
{
  unsigned int i;
  
  WDTCTL=WDTPW+WDTHOLD;
  for (i=0;i<20000;i++);
  P1SEL|=BIT1;
  P2SEL|=BIT0;
  P2DIR|=BIT0;
  CCTL0=CM_1+SCS+CAP+CCIE;
  TACLT=TASSEL_2+MC_2;
  _EINT();
  LPM0;
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0 (void)
{
  static unsigned int new_cap,old_cap,diff_cap,aver_cap,index;
  static unsigned int diff_array[16],cap_array[16];
  
  new_cap=TACCR0;
  diff_cap=new_cap-old_cap;
  cap_array[index]=new_cap;
  diff_array[index++]=diff_cap;
  aver_array+=diff_cap;
  old_cap=new_cap;
  if (index==16)
  {
    aver_array/=16;
    index=0;
  }
}

这段程序时我参照TI的例程写的,我的疑问是timerA一直计数(continue模式),当捕获到上升沿的时候,将TAR的计数值存入TACCR0,我的理解有错吗?

假如TAR计数到60000,来了一个上升沿,然后TAR计数到65535溢出,返回0重新计数,当TAR=10时又来一个上升沿,这时候算脉冲时间不就错了吗?请问怎么解决?

  • 你好,

    你的理解是对的,但有一个问题需要你思考:  10 - 6000 = ?

    我不直接告诉你答案,你定义一个unsigned int类型的两个变量 i,j 自己仿真计算一下10-6000等于多少,你再回到这个问题你就明白了。

    多动手找答案 : )

  • kqian0327 说:

    你好,

    你的理解是对的,但有一个问题需要你思考:  10 - 6000 = ?

    我不直接告诉你答案,你定义一个unsigned int类型的两个变量 i,j 自己仿真计算一下10-6000等于多少,你再回到这个问题你就明白了。

    多动手找答案 : )

    我知道定义的是无符号,我这样写

    if (diff_cap<0)   //第二次捕获脉冲时间与第一次捕获脉冲时间的差。

    不计录;

    可以?

    有没有更好的方法?

  • 楼主,

        其实你加上if (diff_cap<0)   //第二次捕获脉冲时间与第一次捕获脉冲时间的差。也不能完全避免溢出的情况的,因为diff_cap>0也有可能发生溢出.Michael的建议你可以去仿真一下,看看答案是不是你想要的。

        其实你可以使能定时器的溢出中断,在TAR到达0xFFFF的时候将一个计数变量加1,比如count++;,当第二个捕捉中断到来之后做一个运算:

    (65535-第一次捕捉的数值)+65535*count+第二次捕捉的数值

  • 好吧,

    你没有理解我的用意,我来解释一下。

    一个小的数减去一个大的数,的到的结果不会是一个负数,原因就是你定义的结果存放的变量是unsigned int类型的变量,unsigned int的范围是0-65535。

    换个角度说,10-60000你要换算为16进制的数相减。

    10减为0之后是会像高位借位,然后变为65535再和59990相剪,但是你注意因为被减数由0变为65535是减去了一个1,最后的到数的值是 65535-60000 +10 +1.

    所以可以程序中直接用这样的方式来完成两个Cap的差值计算。

    所以参考代码就是最好的办法,不需要你if(diff_cao<0),你如果定义的是unsigned int,反而根本进步了这个中断。

    下面是我调试的结果!

  • kqian0327 说:

    好吧,

    你没有理解我的用意,我来解释一下。

    一个小的数减去一个大的数,��到的结果不会是一个负数,原因就是你定义的结果存放的变量是unsigned int类型的变量,unsigned int的范围是0-65535。

    换个角度说,10-60000你要换算为16进制的数相减。

    10减为0之后是会像高位借位,然后变为65535再和59990相剪,但是你注意因为被减数由0变为65535是减去了一个1,最后的到数的值是 65535-60000 +10 +1.

    所以可以程序中直接用这样的方式来完成两个Cap的差值计算。

    所以参考代码就是最好的办法,不需要你if(diff_cao<0),你如果定义的是unsigned int,反而根本进步了这个中断。

    下面是我调试的结果!

    好的,谢谢你。看不懂你说什么。。不好意思。我查了资料,“补码”能解决这个问题,将相减的值取反再加1,就可以得到数值。

  • 没关系,多做实验,多debug观察,你就明白了,如果我们有帮到您,请帮忙结掉该贴。