Skocz do zawartości

Atmega8A ADC oczekiwanie na wynik wymaga własnego delaya


Jagodziana

Pomocna odpowiedź

Hej, mam problem z adc. Gdy oczekuje aż bit rejestru mówiący o zakończeniu odczytu przeskoczy to wartości w ADCH i ADCL zawsze są ustawione na high - 0xFF. Jeśli jednak dołożę własnego delay'a to wszystko działa jak powinno. Próbowałem już ustawień różnych prędkości odczytu ADC, lecz to nic nie dawało. Prosiłbym o pomoc

void initADC(){
   ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADPS2);
   ADMUX = (1<<REFS0) | (1<<ADLAR); 
}
int8_t getADC(int8_t number) 
{ 
       ADMUX &= 0xf0; //zerowanie 4 młodszych bitów 
       ADMUX |= number; //ustawianie numeru kanału 

       ADCSRA |= 1<<ADSC; //zaczyna konwersję 
       while(ADCSRA & (1 << ADIF));
       _delay_ms(DELAY_IN_MS); //bez tego delaya ADCH da zawsze 0xFF;
return ADCH; 
} 
Link do komentarza
Share on other sites

Pętla while(ADCSRA & (1 << ADIF)); nie czeka na koniec konwersji, bo raz ustawiony bit ADIF nie jest zerowany przez odczyt ADCH. Albo czekaj na automatyczne wyzerowanie bitu ADSC:

"ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero"

albo na ustawienie (jak obecnie) bitu ADIF tylko że wtedy musisz po odczycie wyniku wpisać tam jedynkę:

"ADIF is cleared by hardware when executing the corresponding interrupt Handling Vector. Alternatively, ADIF is cleared by writing a logical one to the flag"

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.