【问题标题】:ADC not working with ATMEGA8ADC 不适用于 ATMEGA8
【发布时间】:2023-03-10 13:30:01
【问题描述】:

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

【问题讨论】:

  • “不工作”是什么意思?请准确。

标签: c embedded avr


【解决方案1】:

您还没有阅读 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 的BTW read-modify-write。要清除第 4 位 - ADIF,ADC 中断标志​​,您可以尝试

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2021-11-18
    • 2023-02-12
    相关资源
    最近更新 更多