atmega128中的电位器adc实践
potentiometer adc practice in atmega128
我是这个领域的初学者。我的目标是根据电位器改变 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 数据表上的所有说明进行操作。
第一个问题是你的位移,应该是ADCSRA |= (1 << ADSC)
。
下一期是成绩解读。您将 ADMUX 的第五位设置为 1,因此 ADLAR=1 并且在该模式下结果被左调整,因此您应该读取 ADCH。
此外,当您切换到 10 位分辨率时,即您开始使用 multi-byte 结果时,请注意仅读取 ADCL 是不够的,请参阅数据表 23.3 进行解释:"Once ADCL is read, ADC access to data registers is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is read, neither register is updated and the result from the conversion is lost. When ADCH is read, ADC access to the ADCH and ADCL Registers is re-enabled."
最后,使用硬编码延迟读取并不是一个好习惯,尤其是当您稍后更改代码以尽可能快地读取 ADC 时。在这种情况下,在转换开始后,您应该检查是否设置了 ADIF 标志,或者在设置 ADEN 时对中断作出反应。详情请参阅数据表。
我是这个领域的初学者。我的目标是根据电位器改变 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 数据表上的所有说明进行操作。
第一个问题是你的位移,应该是ADCSRA |= (1 << ADSC)
。
下一期是成绩解读。您将 ADMUX 的第五位设置为 1,因此 ADLAR=1 并且在该模式下结果被左调整,因此您应该读取 ADCH。
此外,当您切换到 10 位分辨率时,即您开始使用 multi-byte 结果时,请注意仅读取 ADCL 是不够的,请参阅数据表 23.3 进行解释:"Once ADCL is read, ADC access to data registers is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is read, neither register is updated and the result from the conversion is lost. When ADCH is read, ADC access to the ADCH and ADCL Registers is re-enabled."
最后,使用硬编码延迟读取并不是一个好习惯,尤其是当您稍后更改代码以尽可能快地读取 ADC 时。在这种情况下,在转换开始后,您应该检查是否设置了 ADIF 标志,或者在设置 ADEN 时对中断作出反应。详情请参阅数据表。