我是这个领域的初学者。我的目标是根据电位计改变8个LED(连接到PORTA)的输出。我已将电位器的中线连接到PF0,即ADC0。我还将另外两条线连接到5V和地。
我知道芯片或连接没问题,因为LED工作正常。
但无论我如何更改下面的代码(通过稍微改变ADMUX和ADCSRA寄存器来改变我的意思)都没有显示输出!
我正在使用带有16MHZ时钟的atmega128。以下是我试图解决的代码。
#include <asf.h>
#include <avr/io.h>
#define F_CPU 16000000L
int init_board(void)
{
DDRA=0xff;
PORTA=0x01;
}
int ADC_init(void)
{
//ADCSRA
ADCSRA = 0b10000111;
//ADMUX
ADMUX = 0b01100000; // middle line connected to ADC0
}
int main (void)
{
init_board();
ADC_init();
ADCSRA |= (ADSC >> 1);
while(1)
{
if(ADSC == 0)
{
uint8_t disp_value = ADCL;
PORTA = disp_value;
delay_ms(200);
ADCSRA |= (ADSC >> 1);
}
}
}
我不知道代码为什么不起作用。
我想它是因为它没有正确设置我的寄存器,但我已经按照atmega128数据表上的所有说明进行操作。
答案 0 :(得分:0)
第一个问题是你的位移,它应该是ADCSRA |= (1 << ADSC)
。
下一期是结果阅读。将ADMUX的第五位设置为1,因此ADLAR = 1并且在该模式下结果保持调整,因此您应该读取ADCH。
此外,当您切换到10位分辨率时,即开始使用多字节结果时,请注意只读取ADCL是不够的,请参阅数据表23.3以获取解释:“读取ADCL后,ADC访问数据寄存器被阻止。这意味着如果已读取ADCL,并且在读取ADCH之前转换完成,则两个寄存器都不会更新,转换结果也会丢失。读取ADCH时,ADC访问ADCH和ADCL寄存器重新启用。“
最后,使用硬编码延迟进行读取并不是一种好的做法,尤其是当您稍后更改代码以尽快读取ADC时。在转换开始后的这种情况下,应检查ADIF标志是否置位或在ADEN置位时对中断作出反应。有关详细信息,请参阅数据表。