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.

[参考译文] MSP430FR68791:时间 A 中断丢失?

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608135/msp430fr68791-time-a-interrupt-lost

器件型号:MSP430FR68791

我使用定时器 TA0在捕获模式下测量两个输入信号(CCR1和 CCR2)的脉冲宽度(时钟为 SMCLK 除以4 (4MHz))。出于测试目的,两个输入信号具有相同的源(366Hz)。
测量结果为290Hz。

如果我禁用第二个中断(例如 CCR2)、则测量值正确。
在我看来、中断可能会丢失。
只要中断仍处于挂起状态、我就使用 DO/while 环路来处理挂起的中断。

错误测量的其他原因可能是检测到了错误的 IRQ 源、因此测量使用了错误的 CCR 计数器。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//转速中断的中断服务例程//
中断在的上升沿触发 //
//转速脉冲。 在上升沿、捕捉当前//
/////计数器值并将其存储在 CCR1/2 //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////中
#pragma vector=TIMER0_A1_vector
__interrupt void ISR_Timer_A (void)
{
//调试静态 int 计数= 0;
静态 int lastCCR[2]={0、0};

UINT16电流 CCRx;
uint8风扇;

uint16_t ccrNr = 0xFFFF;

操作
{
switch (__even_in_range (TA0IV、0x0E))
{
案例 TA0IV_TACCR1://* TA0CCR1_CCIFG *
currentCCRx = TA0CCR1;
FANNr = 0;
ccrNr = TIMER_A_CAPTURECMPARE 寄存器_1;
中断;

案例 TA0IV_TACCR2://* TA0CCR2_CCIFG *
currentCCRx = TA0CCR2;
FANNr = 1;
ccrNr = TIMER_A_CAPTURECMPARE 寄存器_2;
中断;

默认值:
ccrNr = 0xFFFF;
中断;
}

// Timer_A_clearTimerInterrupt (timer_A0_BASE);
if (ccrNr!=0xFFFF)
{
uint16 ccrx = currentCCRx - lastCCR[fanNr];
lastCCR[fanNr]= currentCCRx;

i2cIFMemoryMap.rawTacho[fanNr]= ccrx;
addToTachoArray( fanNr,ccrx );

Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、ccrNr);

转速计 IrqCount[fanNr]++;
}
}while (ccrNr!=0xFFFF);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Klaus、您好!
    您可以共享计时器 A 设置吗?

    您不需要 while 循环、因为挂起的中断在退出时会生成新的标志。 请参阅用户指南的第25.2.6.2节。 尝试删除此项。

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

    1) addToTachoArray()运行需要多长时间?

    2) 2)读取 TA0IV 会清除相关的 CCIFG。 您不应显式执行此操作(Timer_A_clearCaptureCompareInterrupt)。 危险是您可能会丢失中断。

    3) 3) lastCCR 应声明为 uint16、而不是 int。 您可能可以使用的内容、但您需要确保减法(尤其是模回绕)已正确完成。

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

    我刚刚找到了问题的原因。

    在函数 addToThachhoArray()中,我没有考虑所有相关变量的参数“fanNr”。
    因此、计算平均转速值无效。


    非常感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Cameron、
    感谢您的提示。 我现在移除了 while 环路。
    我不会处理计时器溢出。 我应该检查寄存器 TAxCCTLn 中的 COV 位吗?
    同时、我发现了测量错误的原因。 我没有考虑 addToTachoArray()中所有相关变量的"fanNr"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Klaus、
    是的、否则您将打开一个场景、即新计时器值将小于旧计时器值。