Timer 用于红外接收器的MSP430 G2553定时器比较模式

Timer 用于红外接收器的MSP430 G2553定时器比较模式,timer,msp430,receiver,infrared,Timer,Msp430,Receiver,Infrared,我的红外接收器通过端口P1.1向我发送数字数据。我已经配置了计时器,如果有下降沿或上升沿,就会触发中断。我想知道如何得到边缘之间的实际时差。然后我想把它们保存在一个数组中 主要内容: 中断程序: //gets called when falling or rising edge is detected on IR_Recv #pragma vector = TIMER0_A0_VECTOR __interrupt void Timer_A (void) { if(edgeCount < 1

我的红外接收器通过端口P1.1向我发送数字数据。我已经配置了计时器,如果有下降沿或上升沿,就会触发中断。我想知道如何得到边缘之间的实际时差。然后我想把它们保存在一个数组中

主要内容:

中断程序:

//gets called when falling or rising edge is detected on IR_Recv
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if(edgeCount < 10){
    rxData[edgeCount] = TACCR0;
    TACCR0 = 0;
}
edgeCount++;

P2OUT ^= LED2;
//Clear interrupt Flag
TACCTL0 &= ~CCIFG;
//go back to LPM
__bic_SR_register_on_exit ( CPUOFF );
}

要获取两个捕获的事件之间的时差(单位为滴答),只需让计时器保持运行而不重置它,然后减去捕获的时间戳:

uint16_t差=rxData[1]-rxData[0];
即使计时器计数器发生溢出,此计算也是正确的。

因此您有rxData[0]和rxData[1],并且希望确切地知道它们之间的间隔。TACCR0是获取当前时间的正确寄存器吗?那么,如何仅在接收到第一个边缘时启动计时器?例如,如果rxData[0]的值为1010,而rxData[1]的值为1234,您想知道它们之间经过了多少个刻度?224是的,但如果我在调试模式下读出来,里面会有奇怪的值。。。我可能做错了什么…定义怪异。差异是否错误?正如您在我的代码中所看到的,im将TACCR0 every edge设置为0,这样我可以获得自检测到最后一个edge以来每个中断的计时器的精确值。。。我错了吗?对不起,忘了提到要删除那个。在软件中重置计时器将引入延迟并降低准确性。我像您所说的那样更改了代码,并使用2个不同的遥控器25个时间戳接收。但是数据看起来还是很奇怪。。。它看起来是线性的,遥控器上的两个不同的键看起来几乎相同。下面是一些屏幕截图:rxPulse[0]永不改变。谢谢你的帮助!这解决了我的问题。不过我还有一个问题:你认为25个周期足够接收整个信号吗?1mhz应该足够精确,对吧?
//gets called when falling or rising edge is detected on IR_Recv
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if(edgeCount < 10){
    rxData[edgeCount] = TACCR0;
    TACCR0 = 0;
}
edgeCount++;

P2OUT ^= LED2;
//Clear interrupt Flag
TACCTL0 &= ~CCIFG;
//go back to LPM
__bic_SR_register_on_exit ( CPUOFF );
}