c - ADC 不适用于 ATMEGA8

标签 c embedded avr

我正在尝试在 ATMEGA8 上执行以下代码,但 ADC 似乎无法正常工作。

#include <avr/io.h>
#include "LCD.h"

int main()
{
    int val=0;
    ADCSRA=0x87;//ADc enabled and prescaler set to fosc/128
    ADMUX= 0xC0;//REFS0 and REFS1 set using internal 2.5 volts as Vref      
    DDRC=0x00;// as input for the adc
    PORTC=0x00;
    DDRB=0xff;

    while (1)
    {
        ADCSRA |=(1<<ADSC);
        while(!(ADCSRA&(1<<ADIF)));
        lcd_string("Done Conversion");
        val=ADCL;
        PORTB=ADCL;
        ADCSRA |=(1<<ADIF);//(reseting ADIF to 1)
        lcd_print(2,1,val,3);
    }
    return 0;
}

最佳答案

您还没有阅读 ADCH。数据表说

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.

val = ADCL;
val = ((ADCH<<8) | val) & 0x3F;

您正在将结果写入 8 位端口。如果您想要 8 位转换,则设置 ADMUX 中的 ADLAR 位。然后将 10 位转换左移 6 位,您可以忽略 ADCL 中的 ls 2 位。

ADMUX = 0xE0;
...
val = ADCH;

顺便说一句,不推荐 ADCSRA 的读-修改-写。要清除位 4 – ADIF,ADC 中断标志​​,您可以尝试

ADCSRA = 0x97;              // rewrite config and clear ADIF

这是您的原始配置,设置了 ADIF 位以清除该标志。或者,您可以测试第 6 位 ADSC,它在转换完成之前一直保持高电平,并且不需要任何操作来清除它。由于您尚未启用 ADC 中断,因此无需清除 ADIF 标志。

while (ADCSRA & (1<<ADSC)); // wait for conversion to complete

关于c - ADC 不适用于 ATMEGA8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253150/

相关文章:

c - 如何在嵌入式 C 代码库中查找与数据一致性相关的问题?

c - 通过 USART 发送 c char* 时出现问题

c - 设置了 1 位的位掩码的名称

c - 如何使用memcpy初始化struct中的char指针

c++ - 嵌入式 C++11 代码——我需要 volatile 吗?

c - 需要一种算法来检测振荡数据中的大峰值

c - 设置 ILI9325 TFT 显示器的方向

c - 在 assembly 中使用定义

c - Makefile 中的标志和宏是什么?

PHP:比较 NULL 和 FALSE - 转换为 ~Negative Infinity