ADC无法使用ATMEGA8

时间:2015-03-25 10:30:43

标签: c embedded avr

我正在尝试在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;
}

1 个答案:

答案 0 :(得分:2)

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

  

读取ADCL时,ADC数据寄存器在ADCH为止之前不会更新   读。因此,如果调整结果并且不超过   需要8位精度,读取ADCH就足够了。除此以外,   必须先读取ADCL,然后再读取ADCH。

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

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

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

不推荐BTCS读取 - 修改 - 写入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