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.

[参考译文] MSP430FR2355:数学问题-- abs func 和如何声明变量?

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/902064/msp430fr2355-math-question----abs-func-and-how-to-declare-variables

器件型号:MSP430FR2355

早上好...

我有一个关闭的计时器、我在变量中捕获计数寄存器、溢出计数器也被声明为 volatile unsigned int。  在执行这两次之后、我想对每个变量的两个数字进行一个差异。  我认识到、不能保证这两个数字中的哪一个在任何给定的时间点都比另一个数字大、因此我将使用 ABS 函数进行扩散。  有人能告诉我应该如何声明我的所有变量,因为我很难获得数字来为我提供正确的值....

我假设我将不得不在整个过程中进行拼写。  我的数学看起来像这样: 我改变了温度和温度的声明,没有找到正确的组合....我的其他声明看起来像:

temp = abs (overflowHistory[0]- overflowHistory[1]);
对于(j = 0;j < temp;j++)
加法器+=65536;
Tempa = Abs (HoldTime[0]- HoldTime[1]);
swVolumeHoldTime =(long) Tempa +(long) adder; 


volatile unsigned int overflowHistory[2]={0};
volatile unsigned int HoldTime[2]={0};
long int swVolumeHoldTime = 0、adder = 0;

我已将温度传感器声明为 int,并创建了温度传感器 B 作为无符号 int 进行测试,但我看不到任何差异..... 最重要的是,似乎出现了一些非常奇怪的现象...例如,我在验证了数组和 GOT 中的两个值上的 HoldTime[]={0}后执行了一次运行  

HoldTime[0]= 50356

HoldTime[1]= 13715

Tempa 和 tempB 未能显示正确的减法值!!  他们展示了28895??  即使在所有变量初始化为0的复位后、也会发生此减法错误。

谢谢

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

    HoldTime[0]-HoldTime[1]=36641 = 0x8f21、Abs()调用将该值转换为(int)-28895并返回28895。 [我认为这种转换严格地说是"未定义的行为"、但通常会发生这种情况。]

    如果您"知道" HoldTime[0]晚于 HoldTime[1]、则简单的无符号减法将提供正确的结果(在定时器的范围内)。

    如果您不知道首先发生哪一个、则问题就很难解决、差异可能是36641或28895。

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

    [编辑:重复帖子。 我无法删除它、因为它不存在。 请看图。]

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

    布鲁斯...

    我对如何继续感到困惑...简短的是我永远不会知道哪一个是两个数字中较大的一个

    我正在检测开关保持的时间长度...开关生成中断、然后禁用开关以进行去抖周期。  在定时器 ISR 中唤醒时,我抓取 TC0R 寄存器(这是一个始终运行的后台2秒定时器)....

    当然,这种事情很常见。。。 继续执行的最佳方法是什么?  考虑到这一点,我还有一个问题,似乎它可能有影响....

    我捕获 TC0R 寄存器的计数器正被端口1开关中断触发...现在我自己去清零该 IFG 并在离开 P1IV 之前禁用 P1IE、但可能会有机会错误地跳转到计数器 ISR 当我在 main 中进行数学运算时,可能会多次更新其中一个 HoldTime 寄存器...这里有什么建议或技巧?  我正在使用演示板,并且没有内置模拟去抖...我正在使用一个1/2秒计时器来进行此去抖...我按下一个开关来禁用 P1IE 并清除它的标志,然后在唤醒并进入1/2秒计时器后,我再次清除标志(以防万一) 然后再重新启用 P1IE 并捕获 HoldTime

    感谢您的所有建议!

    很抱歉,还有一个问题……我有被定义为 unsigned int 的变量来捕获 TB0R… 我不明白为什么 CCS 在调试器中将这些值显示为有符号值?  首先、TB0R 是无符号值、不是吗?

    Steve

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

    在无符号值上使用 abs()是非常无用的。 您必须将其中一个值转换为 long、这样才能使其正常工作。

    如果您需要知道哪个数字更大、简单的比较将始终有效:"if (num1 > num2)"

    对于开关去抖、我采用了另一种方法。 我有一个周期性计时器中断、它读取端口并将其存储到循环缓冲器中。 然后、AND 或 OR 这些字节一起、检查特定位以查看开关的状态。 我可能在这里找到它: www.embedded.com/.../

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

    我正在对 P1开关执行此操作...也就是说,我有一个1/10秒的计时器,它在开关按下后激活,然后记录2秒钟...然后我对它执行不同的统计... P2的问题是开关可以保持很短的时间到很长的时间 (不确定)。  对于 P2,我必须能够感应两个边缘,对于 P1,它只是瞬时..... 有什么想法、为什么我在捕获 TB0R 的 HoldTime 数组中得到负值?

    在 ISR 内,分配为:

    保持时间[m]= TB0R;
    

    定义:

    volatile unsigned int history[20]={0};
    volatile char m = 0; 

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

    您会得到负值、因为您正以这种方式对它们进行解释。  (HoldTime 声明为 signed int。) 这是非常基本的数字表示法。

    TB0R 自然是一个无符号数、范围为0至(2^16)-1。 但您也可以将其视为带符号的二进制补码。 如果您这么做、它的计数会有所不同。 32767后跟-32768。

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

    没有 HoldTime 被声明为无符号整型

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

    听起来好像 HoldTime 反映了同一个按钮的两个事件--一个开始时间和一个结束时间--所以人们可以说结束时间比开始时间晚。 在这种情况下、只需从较晚的时间中减去较早的时间。 无符号下溢将为您提供正确的结果(在计时器范围内)。

    我试图避免使用"较大"和"较小"这两个词,因为这通常与循环计数器无关----由于计数器换行至0,"较晚"时间可能在数字上小于"较早"时间。

    Eclipse 有时似乎能够执行显示变量的操作。 右键单击该值并选择"数字格式"。

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

    我把它们显示为十进制..... 我只是为了检查它而使用了“恢复 首选项”… 看起来一切都是积极的…听起来像是一个食虫…感谢帮助…我想我还会再来的!!

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

    您可以使用类型无关的宏实现:

    #define my_abs(A)(A>0?A:(-A)

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

    我认为这可能更好地体现了您试图使您感到复杂化的精神:

    volatile unsigned int overflowHistory[2]={0、0};

    long int swVolumeHoldTime = 0;

     

    if (overflowHistory[0]<= overflowHistory[1])

      swVolumeHoldTime = 65536L +(long int) overflowHistory[0]- overflowHistory[1];

    其他

      swVolumeHoldTime =(long int)(overflowHistory[0]- overflowHistory[1];

    …μ A 等等