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.

[参考译文] MSP430F1611:将值与计时器值进行比较并同步。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653385/msp430f1611-comparing-value-with-timer-value-and-synchronise

部件号:MSP430F1611

尊敬的各位:

由于你们的贡献,我取得了一些巨大的进展,我即将达到我设定的里程碑。

我有一个计时器,每237个刻度就会递增一次,存储为 app_vars.num_asn, 大约每6秒app_vars.num_asn就会打印其对应的计数。

现在,我有另一个值app_vars.asn;表示从网络检索到的一种序列号类型,并存储为uint64_t

如果    app_vars.num_asn - app_vars.ASN > 15 || app_vars.ASN - app_vars.num_ASN > 15,则应始终引用app_vars.ASN并同步到此号码。

我打印   了app_vars.num_asn对应的计数并与 app_vars.asn进行了比较如果它们不相等,我的所有LED都将打开并与 app_vars.asn相等。

查看下面的功能,它还应关闭所有LED,因为最初计数器总是小于 app_vars.ASN的值 ,但它不会。

void CB_asnread (void){

app_vars.num_asn++;
如果(app_vars.num_asn % 885 )==0{
UART_writeByte (app_vars.num_ASN);
while (app_vars.num_ASN != app_vars.ASN){
LEDs_all_on();
IF (app_vars.num_ASN < app_vars.ASN){
LEDs_all_off();
app_vars.num_asn = app_vars.asn;
}

//app_vars.num_asn = app_vars.asn;
//LEDs_all_off();
}
}
}

此帖子中附有代码。  01bsp_radio_rx  是主代码。

我们非常感谢您的帮助!

祝大家新年快乐!

谢谢你。

e2e.ti.com/.../2630.01bsp_5F00_radio_5F00_rx.c

e2e.ti.com/.../1072.sctimer.c

e2e.ti.com/.../8880.sctimer.h

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

    IF语句是否从未输入,或者LEDs_all_off函数是否未正确执行其目的? 如果这是一个逻辑问题,那么这似乎是您可以自行调试的问题,至少可以提供更多信息。

    此致,
    Ryan

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

    感谢您的回复。

    LEDs_all_off功能无法执行,我很不理解。

    所以我对函数做了一些修改,如下所示:

    void CB_asnread (void){

    app_vars.num_asn++;

    如果(app_vars.num_asn % 885 )==0{

     UART_writeByte (app_vars.num_ASN);

     LEDs_all_on();

    }

    IF ((((app_vars.num_ASN - app_vars.ASN)> 15)||((app_vars.ASN - app_vars.num_ASN)> 15)){
    app_vars.num_asn = app_vars.asn;
    LEDs_all_off();
    }否则,如果(app_vars.num_asn == app_vars.ASN){
    LEDs_all_on();
    }

    }

    在这种情况下,第一个IF语句从未执行。 我认为这不是编码的问题,也许是算法的问题。

    据我所知,正是由于这个原因,app_vars.ASN的值是从网络中的溴化封包中检索的值,该数据包广播约6秒,但变化为±0.5秒。

    模块中的计数器每7.25毫秒递增一次,与来自网络的相同计数器速率相对应。  

    因此,当app_vars.num_asn = app_vars.ASN时,我们先说app_vars.ASN = 43.5567万;然后在7.25毫秒后,模块的计数器和网络的计数器应增加到43.5568万。

    从这种情况开始,LED应亮起,因为我期望计数器以相同的速率相互递增,我有同步功能的原因是模块内的时钟漂移。 因为它将在某个时间点与初始设置的时钟相位,所以此函数应该能够补偿时钟漂移,因为它将不断地将其值与数据包进行比较。

    或者 app_vars.num_asn在 其设置为app_vars.ASN的值之后不会开始增量?

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这种情况下,在IDE中逐步调试,同时查看表达式窗口(以查看num_asn和asn的当前值)将非常有用:

    www.ti.com/.../slaa393f.pdf
    software-dl.ti.com/.../sdto_ccs_debug-handbook.html

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

    您是否解决了问题? 您是否有任何更新要提供?

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

    尊敬的Ryan:

    感谢您的帖子,

    我已成功在5us内同步模块,请参阅附件。

    谢谢你

    此致

    Yong Kime2e.ti.com/.../5415.01bsp_5F00_radio_5F00_rx.c