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.

[参考译文] CCS/MSP430F6721:计算从日历日期和时间开始的秒数时出现问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/605425/ccs-msp430f6721-problem-calculating-seconds-since-epoch-from-calendar-date-and-time

器件型号:MSP430F6721

工具/软件:Code Composer Studio

您好!

由于 MSP430F67xx MCU 在 RTC 模块中没有计数器模式、因此我尝试实现一个简单的函数来计算 epoch (1970-01-01 00:00:00)之后的秒数。 下面是我使用的公式:

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday *86400 +(tm_your-70)*31536000 +(tm_your-69)/4)*86400 -(tm_your-1)/100)*86400 +(tm_your+299)/400)*86400

如下面所附代码中的示例所示、使用硬编码的年/月/日/小时/分钟/秒、计算出的 MSP430输出的秒数似乎总是小于我在计算器中手动计算的65536或0x00010000。

如果硬编码日历为2016-06-25 20:59:12、则 MSP430计算出的秒数为 1466736416/0x576C9F20、而正确的值应为 1466801952/0x576D9F20

我在这里缺少什么? 如果有任何意见或反馈、我们将不胜感激。

 
//WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器sysinit ();
WDTCTL = WDTPW | WDTSSEL_ACLK | WDTIS_3;//启用看门狗计时器:ACLK、4分钟和16秒
initSystem();
unsigned long seconds = 0;
char output[5]、i;
国际年、月、日、小时、分钟、 第二,每日;

while (1){
年=116;
月= 6;
天= 25;
小时= 20;
分钟= 59;
秒= 12;
//dayOfYear = getDayOfYear (月、日、RTCYEAR);
每日= 175;
秒数=秒+分钟* 60 +小时* 3600 +每日活动时间* 86400 +(年- 70)* 31536000 +((无符号整型)((年- 69)/4)* 86400 -(无符号整型)(((年- 1)/ 100))* 86400 +((年+ 299)/ 400)* 86400;
//秒= calenda2Seconds (月、日、RTCYEAR);
output[0]= RTCYEAR >> 8;
OUTPUT [1]= RTCYEAR;
output[2]=月;
output[3]=天;
output[4]=小时;
output[5]=分钟;
OUTPUT [6]=秒;
output[7]= dayOfYear >> 8;
output[8]= dayOfYear;
output[9]=秒>> 24;
output[10]=秒>> 16;
output[11]=秒>> 8;
output[12]=秒;
对于(i = 0;i < 13;i++){
while (!(UCA1IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
UCA1TXBUF = OUTPUT[i];
}
__no_operation();
} 



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

    如果有人可能感兴趣、问题在于时间* 3600。 如果 Hour <= 18、则结果< 65536、则最终结果秒值正确。 如果 hour >18,则以某种方式得出的秒值为65536,小于正确的值。 我认为这与 int 到 long 的执行依赖型转换有关。

    现在、我使用以下行来解决它。

    unsigned long const secondsOfHour = 3600;
    秒=秒+分钟* 60 +小时*秒 OfHour+ dayOfYear * 86400 +(年份- 70)* 31536000 +((年份- 69)/ 4)* 86400 -((年份- 1)/ 100)* 86400 +((年份+ 299)/ 400)* 86400; 

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

    这肯定是 int 到 long 转换问题、感谢您进一步调试并提出解决方案。

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

    您好、Ryan、

    感谢您的回复。 您能给我介绍一下有关此 int 到 long 转换的一些文档吗? 我一直假设在将 int 转换为 long 时、所有字节都将从 int 复制到较低(2或4)字节的 long。 因为我大多是自学的、所以我觉得自己可能缺少一些东西。

    此致、

    志勇

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道关于此主题的任何正式文档、此问题与 C 数据类型转换以及由 TI/MSP430生成的内容有关。

    此致、
    Ryan