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.

[参考译文] MSP430FW423:更改 SIFDACR6/7时、ScanIF 测试周期插入附加脉冲(SIFIFG3)中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647622/msp430fw423-scanif-test-cycle-insertion-additional-impulse-sififg3-interrupts-when-changing-sifdacr6-7

器件型号:MSP430FW423

您好!

我在使用 ScanIF 进行旋转检测时遇到 TCI 问题。 我使用测试周期来注入7个模拟信号的附加测试、并检查信号是否处于预期边界内。 要使用比较器计算信号的数字值、我使用简单的二进制搜索算法:

//[...]

if ((SIFCTL2 & 0x0001)!= 0)
dac1_value += delta;
否则
dac1_value = delta;

SIFDACR6 = dac1_value;

if ((SIFCTL2 & 0x0002)!= 0)
dac2_value += delta;
否则
dac2_value = dac1_value;

= dac2_delta

= dAC2或 dac2 = dac1;
如果 dac2 = dac2 = dac1

或 dac1、
则 dac2 = dac1或 dac2 = dac1

遗憾的是、在校准过程中、我从 PSM 获得额外的中断、这些中断会生成错误的旋转计数。 如果我对这两行进行注释、一切正常:

//SIFDACR6 = dac1_value; 
//SIFDACR7 = dac2_value; 

上图显示了正常运行期间7个 TCI、无需修改 SIFDAC6/7。 DBG0 -来自 ScanIF 的中断处理程序。 扫描中断处理程序(SIIFG1)的 DGB1结束。

上图显示了在7个测试周期内修改 SIFDAC6/7时 PSM 的额外计数周期。 这些附加周期在随机扫描结束中断处(图片仅显示示例)。
DBG2显示了 SIFIFG3中断的处理程序。 当 SIFDEBUG 设置为0x0001 (检查当前 PSM 状态)与 PRV 不同时、切换 DBG3。 这意味着 PSM 检测到真正的转弯、不仅会生成错误中断。 在整个过程中、线圈未阻尼、并且处于稳定状态。 因此、不应在 PSM 中进行状态更改。

我使用通道0和1来实现正常运行、并且在 INIT 上将 SIFDAC0/1/2/3设置为恒定值、并且在整个校准过程中不会改变。

我怎么做了?

此致 Maciek

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

    我将向我们的专家咨询您的问题并回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Maciek、您好!

    当您更改 SIFDACRx 寄存器时、是否检查 CPU 是否处于活动的 TSM 序列中? 您可以使用 SIFDEBUG 寄存器检查 TSM 状态、并在 CPU 不处于活动 TSM 序列时更改 SIFDACRx 寄存器。

    此致、

    现金 Hao

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

    您好 Hao、

    我将在扫描中断上下文结束时更改 SIFDACR6/7的值。 因此、TSM 序列应该结束、TSM 索引复位为0。 我已将小测试代码添加到主循环、并且在 ScanIF 中断开始时:

    _DINT ();
    
    SIFDEBUG = 0x0001;
    int CURRENT_DEBUG_VALUE = SIFDEBUG;
    
    IF ((CURRENT_DEBUG_VALUE & 0x1f00)!= 0)
    DBG3_ON;
    否则
    DBG3_OFF;
    
    _EINT (); 

    _DINT 和_EINT 仅在主循环中。 我始终观察到、在 ScanIF 的开头、TSM 索引设置为0。

    此处:

    DBG0 - ScanIF 中断例程。

    DBG1 - ScanIF SIIFG1处理程序(其中 SIFDACR6/7可能被更改。 它们在来自测试周期的第二个中断上被改变。)

    DBG2 - ScanIF SIIFG3处理程序->脉冲计数。

    DBG3 - SIFDEBUG & 0x1f00不是0

    DBG6 -主循环指示器->每次执行时齿状。

    我的示波器显示相同的结果。 我有可见的线圈激励和振荡、然后看到来自中断处理程序的 DBG 引脚。 不要同时进行。

    此致 Maciek

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Maciek、您好!
    因此、您仍然可以在 ScanIF 例程期间更改 SIFDACR6/7。 我们已经在 MSP430FR698x 器件中发现一个错误、ScanIF 可能会导致 TSM1寄存器损坏。 您可以在 ESI2 www.ti.com/.../slaz517u.pdf 中找到它。 您可以找到此问题的解决方法。

    您是否确实需要在 CPU 可能仍处于活动 TSM 序列时更改 SIFDACR6/7?

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

    您好!

    这很奇怪... 但这可以解决我的问题。 在进行更多测试后、我将确认这一点。

    我已将校准过程从"扫描结束"中断处理程序移动到主上下文。 不再有假冲动。

    奇怪的是:我对当前 TSM 状态使用小测试:

    _DINT();
    SIFDEBUG = 0x0001;
    int CURRENT_DEBUG_VALUE = SIFDEBUG;
    
    while ((current_debug_value & 0x1f00)!= 0)
    {
    SIFDEBUG = 0x0001;
    current_debug_value = SIFDEBUG;
    }
    _EINT (); 

    在测试时、它始终会在第一个状态下设置为0。 与中断例程中的完全相同。 我确定在最后一个 TSM (SIFSTOP)周期后立即触发'End of SCAN'中断、因此我确信、在 TSM 工作时我对 SIFDACR6/7 _NOT_进行了修改。

    还有!!! 我使用第一个版本的 ScanIF、而不是 ESI2错误中的扩展 ScanIF。

    我将在更多测试后发布一些结果。 我希望这是解决方案。

    此致

    Maciek

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

    Maciek、您好!

     写入 SIFDEBUG 寄存器的方式不正确。 用户指南第912页对其进行了说明  

    这就是你一直得到0的方法。

    此致、

    现金 Hao

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

    您好!

    我确信我使用 mov 指令写入 SIFDEBUG。 这是生成的汇编器:

    .dwpsn文件"../main.c"、行629、列4、is_stmt、ISA 0
    提示
    NOP ;[]|629|
    .dwpsn文件"../main.c",第631行,第4列,is_stmt,ISA 0
    MOV.W 1、SIFDEBUG+0 ;[]|631|
    .dwpsn文件"../main.c",第633行,第28列,is_stmt,ISA 0
    MOV.W SIFDEBUG+0、R15 ;[]|633| 

    不幸的是,我太快了…… 我仍然从脉冲计数器获得假中断。 仍在挖掘出错误。

    =========== 编辑===========

    我更改了

    SIFDEBUG = 0x0001;

    更改为  

    asm ("\t\tMOV.B #1、&SIFDEBUG+0");

    结果是相同的。 每次(((SIFDEBUG & 0x1f00)==0)=true。

    此致

    Maciek

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

    经过一些测试后、我确定出现了问题。

    完成日期:

    -在"扫描结束"中断处理程序之后、我将在主上下文中更改 SIFDACR6/7。

    -我将仅使用 MOV.B 检查 SIFDEBUG 的 TSM 非活动状态、以将 SIFDEBUG 设置为0x0001

    出什么问题了? 当我更改 SIFDAC0-1和 SIFDAC2-3中的 SIFDACR6/7迟滞时、无法正常工作、从而导致额外的假脉冲计数。

    在应用程序初始化时、我已经为 SIFDAC0/1/2/3设置了静态值

    SIFDACR0 = 715;
    SIFDACR1 = 705;
    SIFDACR2 = 715;
    SIFDACR3 = 705; 

    之前、我有725-715个用于 DAC、并且来自线圈的未阻尼信号等于725-727、因此应该位于迟滞电平之上。 这就是为什么我将电平更改为715-705以进一步远离迟滞阈值的原因。

    现在!!! 我将执行两个测试。 代码库是相同的。 对于第一项测试、我不修改 SIFDACR6/7、对于第二项测试、我将使用简单的二进制搜索算法来更改这些寄存器的值、以查找来自线圈的电流信号电平。

    在首次测试期间、我的线圈未阻尼、我将金属环放置在更靠近线圈的位置。 我不能观察到任何假脉冲。

    在第二次测试中、我的线圈未阻尼、我将金属环放置在更靠近线圈的位置。  我可以观察校准例程的输出。 此时、当来自两个线圈的信号低于顶部迟滞电平(715)但仍高于低迟滞电平(705)时、我会观察到假脉冲(其中很多)。

    红色和蓝色信号是校准过程的结果(在先前的帖子中可见这7个 TCI)

    黄色表示检测到假脉冲的瞬间。 ScanIF 配置为输出脉冲 MOD 4、因此必须在扩展状态机(PSM)中存在全旋转。

    为了确保我还对反相迟滞阈值执行了相同的测试:

    SIFDACR1 = 715;
    SIFDACR0 = 705;
    SIFDACR3 = 715;
    SIFDACR2 = 705; 

    观察结果类似。 当信号处于迟滞阈值之间时、可以看到错误计数、但有更多的错误计数。 在上面的示例中、我发出5个假脉冲。 当阈值被反转时、我可以在同一时间周期内计数大约55个假脉冲。

    我正在更改在50000以上器件上工作1.5年的软件、没有任何错误计数。 现在的不同之处在于、这一 TCI 自动校准过程修改了 SIFDAC6/7寄存 器并完全破坏了迟滞。 目前、我正在尝试生成最小不起作用的示例。 但我不能在这里(公开)发布它。

    此致

    Maciek

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

    Maciek、您好!

    感谢您进行这些测试。  

    我将继续处理这个问题。 如果您认为 E2E 不是共享的好地方、我们可以通过电子邮件进行讨论。 我的电子邮件是 cash-hao@ti.com  

    此致、

    现金 Hao

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

    我想解决问题并共享解决方案、但无法共享代码。 我还在处理这个问题。
    看起来、测试周期的结果是决定比较器在正常周期中使用哪个迟滞阈值(高电平或低电平)。 我有一些测试需要考虑、但我将在大约几个小时的时间内办公、所以我将进行测试。

    我要做的是、将 SIFDACR6/7设置为测试周期的恒定值模式、以生成脉冲。 通过了解正常周期使用的比较器阈值、我理论上可以生成特定数量的错误周期。 这将证明或拒绝我的意见。

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

    我的 TSM 的第一个状态未设置为0x0000。 这就是问题所在。 添加"SIFTSM0 = 0x0000;"后、不再有错误计数、校准工作正常。

    感谢你的帮助。