0
#define F_CPU 1000000UL
#include <avr/io.h>

volatile uint8_t adcvalue;


int main(void)
{
    DDRA =0x00;
    DDRC = 0xff;

// enable adc
    ADCSRA |= (1<<ADEN);
// using division factor 8
    ADCSRA |= (1<<ADPS0) | (1<<ADPS1);

// enable 8 bit conversion
    ADMUX |= (1<<ADLAR);
// take input from PA0
    ADMUX |= (1<<MUX0);

    while (1)
    {
        // Start conversion
        ADCSRA |= (1<<ADSC);

        // wait until conversion is done
        while (ADCSRA & (1<<ADSC));

        // save result to adcvalue
        adcvalue = ADCH;

        // show result on 8 leds connected to PORT C
        PORTC = adcvalue;       
    }
    return 0;
}

上面的代码应从 PA0 获取模拟值(使用电位器)并在连接到 PORT C 的 8 个 LED 上显示数字值。当我在 Proteus 上模拟电路时,即使我更改电位器值,LED 也始终亮着,并且有一条消息说“[AVR AD 转换器]参考值 = 0”。

感谢您能帮助我了解问题所在。

4

3 回答 3

2
// take input from PA0
    ADMUX |= (1<<MUX0);

错了,用那条线你把 PA1/ADC1 作为输入,而不是 PA0/ADC0

查看第 218 页的数据表:http: //www.atmel.com/images/doc2466.pdf

MUX 4..0 00000 是 PA0,00001 是 PA1

您将 MUX 4..0 的值设置为 00001

ADMUX |= (1<<MUX0);

因此使用 PA1 作为 Source。

干杯

于 2016-12-21T23:41:39.773 回答
2

为了[AVR AD CONVERTER]Reference Value = 0proteus中删除错误消息,您应该删除源代码中的以下两行:

// enable 8 bit conversion
ADMUX |= (1<<ADLAR);
// take input from PA0
ADMUX |= (1<<MUX0);

并添加此行

 ADMUX = 0b01100000;

此外,请务必在 AVcc 引脚上连接 5 VOLT Vcc。

图表

于 2017-01-28T16:37:41.847 回答
0

我现在这里没有数据表,所以我将写的是一般形式。在 AVR 上,一些寄存器共享一些配置。在您的情况下,ADMUX 共享 MUX 和 8 位转换。

您的指示:

ADMUX |= (1<<MUX0);

将 MUX0 位置的位设置为高电平,然后将其写入寄存器中或寄存器上。这意味着如果 MUX1、MUX2、MUXN 在您的命令之后将它们变为高电平之前为高电平。

一个安全的初始化将是:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN)
ADMUX |= (1<<MUX0);

存储器的寄存器 ADMUX 将所有位设置为 0 作为第一个 ADC 引脚。所以在你的情况下,第一条指令:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN)

是唯一需要的。

于 2016-12-28T23:09:35.423 回答