gpt4 book ai didi

c - ADC 不适用于 ATMEGA8

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:56 25 4
gpt4 key购买 nike

我正在尝试在 ATMEGA8 上执行以下代码,但 ADC 似乎无法正常工作。

#include <avr/io.h>
#include "LCD.h"

int main()
{
int val=0;
ADCSRA=0x87;//ADc enabled and prescaler set to fosc/128
ADMUX= 0xC0;//REFS0 and REFS1 set using internal 2.5 volts as Vref
DDRC=0x00;// as input for the adc
PORTC=0x00;
DDRB=0xff;

while (1)
{
ADCSRA |=(1<<ADSC);
while(!(ADCSRA&(1<<ADIF)));
lcd_string("Done Conversion");
val=ADCL;
PORTB=ADCL;
ADCSRA |=(1<<ADIF);//(reseting ADIF to 1)
lcd_print(2,1,val,3);
}
return 0;
}

最佳答案

您还没有阅读 ADCH。数据表说

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.

val = ADCL;
val = ((ADCH<<8) | val) & 0x3F;

您正在将结果写入 8 位端口。如果您想要 8 位转换,则设置 ADMUX 中的 ADLAR 位。然后将 10 位转换左移 6 位,您可以忽略 ADCL 中的 ls 2 位。

ADMUX = 0xE0;
...
val = ADCH;

顺便说一句,不推荐 ADCSRA 的读-修改-写。要清除位 4 – ADIF,ADC 中断标志​​,您可以尝试

ADCSRA = 0x97;              // rewrite config and clear ADIF

这是您的原始配置,设置了 ADIF 位以清除该标志。或者,您可以测试第 6 位 ADSC,它在转换完成之前一直保持高电平,并且不需要任何操作来清除它。由于您尚未启用 ADC 中断,因此无需清除 ADIF 标志。

while (ADCSRA & (1<<ADSC)); // wait for conversion to complete

关于c - ADC 不适用于 ATMEGA8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com