不能将两个值结合在一起吗?

Posted

技术标签:

【中文标题】不能将两个值结合在一起吗?【英文标题】:Cant combine 2 values together? 【发布时间】:2022-01-17 10:23:08 【问题描述】:

我正在使用带有 XC8 编译器的 PIC18lF47k42。 我正在尝试获得这个完整的 12 位 ADC 值,因此我拥有完整的分辨率,但是,我似乎无法从 ADRESL 获取 4 位数据以使用来自 ADRESH 的数据进入结果。 结果是一个 16 位变量,因此它可以适合所有 12 位。有什么想法吗?

例子:

ADRESH = 00110101 ADRESL = 10100000,我希望结果 = 0000001101011010。

#include "myIncludes.h"

volatile unsigned char ZCDSoftwareFlag = 0;
volatile unsigned char switchValue = 0;

void main(void) 

    portInit();
    adcInit();
    uint16_t result;                
    while (1)
    
        ADCON0bits.GO = 1; //Start conversion
        while (ADCON0bits.GO); //Wait for conversion done
       
        result = 0b0000000000000000;
        result = ADRESH << 4;
        result = (result)  | ADRESL;
        //result = (ADRESH << 4) | ADRESL;
    

【问题讨论】:

由于绿线高亮显示,我认为还没有执行。如果您在调试器中再前进一行会发生什么? while (ADCON0bits.GO); - 另一个使用大括号的好理由 while 循环很好。 【参考方案1】:

显然您正在使用将结果左对齐的模式 (FM = 0)。

然后你可以分两步进行组合:

    将两个 8 位值放入一个 16 位变量中。 向下移动该值。
        /* ... */
        result = ADRESH;
        result <<= 8;
        result |= ADRESL;

        result >>= 4;
        /* ... */

或者,非常简洁:

        /* ... */
        result = (((uint16_t)ADRESH << 8) | ADRESL) >> 4;
        /* ... */

注意事项:

如果编译器优化得很好,两个建议会产生相同的机器代码。 如果您在二进制补码中签名结果,左对齐 (FM = 0) 可能会很有用。我没有深入研究文档以查看是否可行。 如果选择右对齐(@9​​87654325@ = 1),则不需要第二步。

【讨论】:

以上是关于不能将两个值结合在一起吗?的主要内容,如果未能解决你的问题,请参考以下文章

不能将两个相同大小的矩阵加在一起

webpack 和 jQuery:不能很好地结合在一起

MongoDB和“加入”[重复]

适配器模式

适配器模式

请问下EDEM或者PFC能不能与ansys或者其他有限元软件结合在一起