我目前正在基于32位ARM9的微控制器内编程10位ADC。该10位ADC将数字化模拟值保存在名为“ADC_DATA_REG”的 10位寄存器中,该寄存器使用位9-0(LSB)。我必须读取该寄存器的值并将其与 32位常量“CONST”进行比较。我的尝试看起来像这样,但它不起作用。我在这里失踪了什么?我应该使用轮班操作吗?这是我第一次处理这个问题,所以任何例子都会受到欢迎。
下面的代码已针对coments和anwsers进行了编辑,但仍无效。我还添加了一个while语句,用于在读取ADC_DATA_REG之前检查ADC_INT_STATUS标志是否已升级。上述标志表示一旦ADC完成转换并且数据准备好从ADC_DATA_REG读取,就会挂起一个中断。事实证明,即使将寄存器ADC_DATA_REG的值分配给它,数据仍保持为0,因此这就是我的LED始终打开的原因。它也意味着我得到了一个中断,ADC_DATA_REG中应该有数据,相反它似乎没有......
#define CONST 0x1FF
unsigned int data = 0;
while (!(ADC_INT_STATUS_REG & ADC_INT_STATUS))
data = ADC_DATA_REG;
if ((data & 0x3FF)> CONST){
//code to turn off the LED
}
else{
//code to turn on the LED
}
答案 0 :(得分:2)
你不会写ADC_DATA_REG如何获取10位值。但我认为它只是对某个IO地址的读取。在这种情况下,从地址读取返回32位。在您的情况下,只有较低的10有效(或有效)。另外22位可以是任何东西(例如状态位,垃圾,......),所以在继续处理数据之前,应该将前22位置零。
如果10位值已签名,您还应执行符号扩展并更正数据类型(我知道端口IO是无符号的,但可能是adc返回的10位值不是)。然后你的比较应该工作。