2015-03-25 2 views
0

Я пытаюсь выполнить следующий фрагмент кода на ATMEGA8, но АЦП, похоже, не работает.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

ответ

2

Вы еще не читали ADCH. В техническом паспорте указано:

Когда ADCL считывается, регистр данных ADC не обновляется до тех пор, пока ADCH не будет . Следовательно, если результат остается отрегулированным и не более требуется 8-битная точность, достаточно прочитать ADCH. В противном случае сначала следует прочитать ADCL, а затем ADCH.

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

Вы пишете результат на 8-битный порт. Если вы хотите 8-битное преобразование, установите бит ADLAR в ADMUX. Затем 10-битное преобразование будет сдвинуто налево на 6 бит, и вы можете игнорировать ls 2 бита в ADCL.

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

BTW read-modify-write of ADCSRA не рекомендуется. Чтобы очистить бит 4 - ADIF, АЦП Флаг прерывания, вы можете попробовать

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

Какая ваша исходная конфигурация с ADIF бит установлен, чтобы очистить этот флаг. В качестве альтернативы вы можете протестировать бит 6 ADSC, который остается высоким до завершения преобразования, и для его устранения не требуется никаких действий. Поскольку вы не включили прерывание АЦП, нет необходимости очищать флаг ADIF.

while (ADCSRA & (1<<ADSC)); // wait for conversion to complete 
Смежные вопросы