无法将两个值组合在一起?

标签 c concatenation pic

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

示例:

ADRESH = 00110101 ADRESL = 10100000, I want result to = 0000001101011010.

image of output during simulation

#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;
    }
}

最佳答案

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

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

  1. 将两个 8 位值放入一个 16 位变量中。
  2. 降低该值。
        /* ... */
        result = ADRESH;
        result <<= 8;
        result |= ADRESL;

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

或者,非常简洁:

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

注释:

  • 如果编译器优化良好,两个建议都会生成相同的机器代码。
  • 如果您以二进制补码形式对结果进行签名,则左对齐 (FM = 0) 可能会很有用。我没有深入研究文档来看看这是否可行。
  • 如果您选择右对齐 (FM = 1),则不需要第二步。

关于无法将两个值组合在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70343251/

相关文章:

c++ - 如何在 ubuntu 上为 sqlite3 安装 extension-functions.c

c - PIC24H POT 输入控制 LED 闪烁延迟非线性

在 C 中连接一个环境变量和一个字符串并提供给 fopen()

c# - 使用 PIC16F877 (MikroC IDE) 从 c# 接口(interface)接收 3 位数字

visual-studio-2010 - Visual Studio 2010 中的 pic32 项目

c - PIC10F200/202/204/206可以用什么语言编程?

c - gets() 内部开关被忽略

c++ - 如何使用 stringstream 作为 C++ 函数的参数?

c++ - 在 C++ 中连接 char[] 和 uint32_t

objective-c - 在 Unix 中使用 double ?