我正在使用带有 XC8 编译器的 PIC18lF47k42。
我正在尝试获取完整的 12 位 ADC 值,以便获得完整的分辨率,但是,我似乎无法从 ADRESL
获取 4 位数据来使用 中的数据得出结果>ADRESH
。
结果是一个 16 位变量,因此它可以容纳所有 12 位。有什么想法吗?
示例:
ADRESH = 00110101 ADRESL = 10100000, I want result to = 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;
}
}
最佳答案
显然您正在使用将结果向左对齐的模式 (FM
= 0)。
然后您可以分两步进行组合:
- 将两个 8 位值放入一个 16 位变量中。
- 降低该值。
/* ... */
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/