我试图在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。数据表显示
当读取ADCL时,ADC数据寄存器直到ADCH
读。因此,如果结果保持调整,且不超过
需要8位精度,足以读取ADCH。否则,
必须先读取ADCL,然后读取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