atmega128中的电位器adc练习

时间:2018-02-21 02:32:51

标签: c adc

我是这个领域的初学者。我的目标是根据电位计改变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数据表上的所有说明进行操作。

1 个答案:

答案 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置位时对中断作出反应。有关详细信息,请参阅数据表。