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/MSP430G2553:可变乘法提供错误输出

Guru**** 2609955 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/659398/ccs-msp430g2553-variable-multiplication-giving-false-output

部件号:MSP430G2553

工具/软件:Code Composer Studio

我想将两个ADC读数相乘(电压和电流以获得功率)。 我正在使用CCS7版本,并且在CCS项目属性,编译器和链接器中启用了硬件乘法器(设置为16)。

但观察窗口中的结果与实际答案不相符。 如果我尝试将两个变量相乘,我得到的结果是变量的任何值都是'314'。 如果尝试将一个变量(值45)与一个常量相乘,我不能将常量值增加到大于32的数字,只要它超过32,结果就变成'314'。 如果将两个常量数相乘(其乘积小于3.2768万),我得到正确的答案。

我是否缺少任何设置???

变量声明和乘法部分如下所示

unsigned int adc_val[6]={0,0,0,0,0,0,0,0,0,0";
unsigned int v_pan_avg_acc_n10=0,c_pan_avg_acc_n10=0,v_pan_avg_n7=0,c_pan_avg_n7=0;
unsigned int panel_pwr_n14=0;

----------------------------------

----------------------------------

v_PAN_avg_acc_n10  = v_PAN_avg_acc_n10+adc_val[4];

c_pan_avg_acc_n10  = c_pan_avg_acc_n10+adc_val[1];

ADC_COUNT++;

IF (ADC_COUNT>32)

v_PAN_avg_n7 = v_PAN_avg_acc_n10>8;
.................................................................
c_pan_avg_n7  = c_pan_avg_acc_n10>8;

PANEL_Pwr_n14 =(v_PAN_avg_n7)*(c_PAN_avg_n7) ;

..................................................................

.................................................................

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Jeevan
    哪个变量返回的答案不正确? 哪个变量是静态变量,或'32'?

    您是否正在查看这些值以确保任何点都没有溢出?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一个非常简单的测试是尝试使用一个长的,如果这可以修复它,那么你就知道你已经翻滚了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII..感谢您的回复,
    实际上,存储产品的变量始终给出错误输出(PAGE_Pwr_n14)。
    我尝试了def类型的所有可能组合- int,short,unsigned int和long。
    即使我尝试用_QMATH进行计算,乘法仍会产生假结果。
    我也将堆栈大小增加到0x100。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在CCS项目属性中,我已将编译器和链接器设置为'--use_HW_Bump'到'16',因为我的控制器是16位。
    这是使硬件乘法器执行乘法所需的唯一设置还是需要任何其他设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您只累积了33个值时,为什么要除以256?

    向我们展示一些实际的可编译代码,以显示问题所在。 您只需使用值数组来模拟ADC。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADC结果中的最大值为1023。 如果我想将两个这样的ADC结果相乘,它将出现1023*1023,1023,我认为控制器可能无法处理,这就是为什么我要将标准化的ADC值转换为最大值2^7。 产品将提供2^14,控制器应能够处理。

    实际上没有显示错误或警告,我模拟使用值,只是给出值,我连接电位器并在ADC上应用固定电压以获得结果。 但我在手表窗口中看到的产品是错误的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    忽略我删除的回复,我看不到您在上面回复的位置。

    您是否有一个可以重现问题的测试代码,如果有,我可以在我的端测试它
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include <msp430g2553.h>

    unsigned int adc_val[6]={ 70.06万 ,0,0,0,0";
    unsigned int x=0,y=0,z=0;

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD; //停止监视计时器
    DCOCTL = CALDCO_16MHz; // 16MHz数字振荡器时钟
    BCSCTL1 = CALC1_16MHz; //SM时钟频率为16MHz
    WDTCTL=WDT_MDLY_32; //2毫秒计时器

    同时(1) //loop for ever

    IF ((IFG1&BIT0)=0x01) //设置了看门狗计时器标志(定时2毫秒)

    x = adc_val[0]>>3;
    Y = adc_val[1]>>3;
    Z = x *y;
    IFG1 &=~WDTIFG;//清除WDT的中断标志
    }
    }
    }

    预期计算
    X = 700>3=87
    Y= 600>>3=75
    Z = x*y = 6525
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这对我来说很好。 您可能需要使用默认的MPY选项并查看是否有任何更改。 如果所有其他操作都失败,请尝试将代码导入到新项目,而不更改任何项目设置。

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

    你好,Jeevan,
    我找到了您的问题。 G2553没有HW MPY。 所以你使用的设置是告诉它使用一个不存在的指令。 要解决此问题,请将您提到的选项更改为"无"。

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

    先生,  

    很抱歉回复太晚了,我被分配到另一个项目几天。

    我已根据您的建议更改了设置。现在我已正确获得 结果。 我还会在做乘法的任何地方收到警告。

    <ahref="processors.wiki.ti.com/.../1533"> (ULP 6.1 )检测到在没有硬件的设备上使用乘法
    乘数。

    感谢您的支持,这真的很有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是预料之中的。 它只是让您知道编译器将模拟应用程序算法,因为您的设备没有MPY。