2015-03-25 56 views
0

我試圖在ATMEGA8上執行以下一段代碼,但ADC似乎沒有工作。ADC不與ATMEGA8一起工作

#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; 
} 
+3

這是什麼意思「不工作」?請準確。 – ouah 2015-03-25 11:02:20

回答

2

您還沒有閱讀過ADCH。數據手冊中說

當讀取ADCL時,ADC數據寄存器不會更新,直到ADCH被讀取爲 。因此,如果結果是左調整的,並且不需要超過8位精度,那麼讀取ADCH就足夠了。否則,必須先讀取 ADCL,然後再讀取ADCH。

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

你正在寫的結果爲8位端口。如果您需要8位轉換,請將ADMUX中的ADLAR位置1。 10位轉換將被左移6位,您可以忽略ADCL中的ls 2位。

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

順便提一下,ADCSRA的讀 - 修改 - 寫是不推薦的。要清除位4 - ADIF,ADC中斷標誌,你可以嘗試

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

哪個是你原來的配置與ADIF位設爲清除該標誌。或者,您可以測試bit 6 ADSC,它保持高電平直到轉換完成,並且無需執行任何操作即可清除它。由於您尚未啓用ADC中斷,因此無需清除ADIF標誌。

while (ADCSRA & (1<<ADSC)); // wait for conversion to complete 
相關問題