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.

[参考译文] MSP430F5438A:当定时器 B 用作捕获和计数时,计数值有时不正确

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1082665/msp430f5438a-when-timer-b-is-used-as-capture-and-count-the-count-value-is-sometimes-incorrect

部件号:MSP430F5438A

大家好,团队

客户提出的问题可能需要您的帮助:

void TIEB_INIT( void )(无效)
{  

    //P4.7是时钟输入,P4.0是上边缘和下边缘捕获
   TB0CTL = TBSSEL_0 + ID_0 + TBCLR;//TB0CLK 输入,非分频器,自动清除0和除数参数

   TB0CCTL0 = CM_3 | CAP | CCIE | CNTL_0 | CCIS_0;
            //上边缘和下边缘捕获,捕获模式,中断,16位模式,P4.0输入, 必须是异步捕获

    //P4.0:1-K 频率方波输入
   P4DIR &=(~BIT0);// P4.0输入
   P4SEL |= BIT0;// P4.0配置为 TB0.0输入

   //P4.7:156K 信号计数输入
   P4DIR &=(~BIT7);// P4.0输入
   P4SEL |= BIT7;// P4.7配置为 TB0CLK 输入

   TB0CTL |= MC_2;//UP 计数模式,至65535

   TB0R =0;//初始化计数值


}

//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)

    IF(  TB0CCTL0 & CCI  ){//  捕获高级数据
       counter_156K = TB0CCR0;//存储数据
    }否则                  //捕获的低级数据
       TB0CTL |= TBCLR;//计数器被清除
    }
    TB0CCTL0 &=(~CCIFG);//清除中断标志
}

目的:捕获的信号为 P4.0,捕获上边缘和下边缘,并生成中断。 捕获 P4.0的上升边缘时,会保存在 P4.7中此时输入的方波信号的计数值。

结果:有时保存的计数值不正确,大部分是正确的。 客户希望知道什么时候出错。  当他们将中断程序修改为以下程序时,计数是正确的,未发现错误:

//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)

    IF(  TB0CCTL0 & CCI  ){//  捕获高级数据
       counter_156K = TB0R;  //存储数据,而不是捕获寄存器,使用计数寄存器
    }否则                    //捕获的低级数据
       TB0CTL |= TBCLR;//清除计数器
    }
    TB0CCTL0 &=(~CCIFG);//clear 中断标志
}

1.用上述修改的中断程序捕获计数值是否正常?

2. 定时器捕获计数,P4.7是 TIMER _B 的时钟输入,用于捕获 P4.0的上升和下降边缘,以计算 P4.0下降边缘的时间。 上述中断程序是否应该使用 TB0CCR0或 TB0R 的寄存器值写入?

下面是编写中断函数的另一种方法,是否有任何区别? 两者都能正常工作吗?  

//TIMERB 端口中断服务计划,U8_1Q 中断计划
#pragma 引导程序= TIMER0_B0_Vector
中断 void timer_b0_ISR (void)

    IF(  TB0CCTL0 & CCI  ){//  捕获高级数据
       counter_156K = TB0CCR0;//数据使用捕获寄存器保存
    }否则                  //捕获的低级数据
       TB0CTL |= TBCLR;  //清除计数器
    }
    TB0CCTL0 &=(~CCIFG);//clear 中断标志
}

请帮您检查此案例? 谢谢。

此致,

樱桃

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    “正确”与“错误”有何区别? 即您如何判断?

    TB0CCR0包含捕获的值。 TB0R (短时间)将与此匹配,但由于它不断计数,因此不会匹配。

    通常,我建议在使用 CAPTURE 时不要清除计数器,因为它会在值中引入错误(太小)。 相反,让计数器运行并减去连续捕获值。 这也会产生(有益)副作用,将中断负载减半。