#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 CONVERTER]参考值= 0”。
感谢您能否帮助我了解错误。
答案 0 :(得分: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的值设置为00001ADMUX |= (1<<MUX0);
因此使用PA1作为来源。
干杯
答案 1 :(得分:1)
要删除错误消息[AVR AD CONVERTER]Reference Value = 0
从 proteus 您应该删除源代码中的以下两行:
// enable 8 bit conversion
ADMUX |= (1<<ADLAR);
// take input from PA0
ADMUX |= (1<<MUX0);
并添加此行
ADMUX = 0b01100000;
另外,请务必在AVcc引脚连接5 VOLT Vcc。
答案 2 :(得分: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)
是唯一需要的。