Atmega32 ADC Hilfe

OP #2039417
Lesenswert?
• ▲
▼
Hallo,

ich versuche nun schon seit einer Woche, ohne Erfolg, den ADC des 
Atmega32 zu Laufen zu bringen. Tutorials bin ich vorher schon alle 
durchgegangen, die Register hab ich mir aus dem Datenblatt rausgesucht.

Hier der Teil des Codes, der den ADC betrifft:


// init the whole adc service
void init_adc()
{
  uint16_t result;

  ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) |  (0<<ADIE) | 
(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | 
(0<<MUX2) | (0<<MUX1) | (0<<MUX0);

  ADCSRA = (1<<ADSC);
  while(ADCSRA & (1<<ADSC))
  {
  }
  result = ADCL;
  result = result | (ADCH<<8);

  return;
}

int main(void)
{
       int result=0;
       char resultc[50];

        while(1)
  {
             ADCSRA = (1<<ADSC);


       while (ADCSRA & (1<<ADSC))
       {
       }

       result = ADCL;
             result = result | (ADCH<<8);

             itoa(result,resultc,10);
             uart_puts(resultc);

       _delay_ms(5000);
        }

        return(0);
}

Die Formatierungen stimmen jetzt nicht 100%, weil die Tab-Taste in 
diesem Editor irgendwie nicht funktioniert hat.

Danke in vorraus
Gast #2039436
Lesenswert?
• ▲
▼
Beim ersten Beschreiben des Registers darf man = schreiben, beim zweiten 
Beschreiben des selben Registers muss man verodern, oder alle die 
bereits gesetzten Bits werden auf 0 gesetzt.

Fabian K. schrieb:
> ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) |  (0<<ADIE) |
> ADCSRA = (1<<ADSC);
Gast #2039438
Lesenswert?
• ▲
▼
in deinem main wir init_adc() gar nicht aufgerufen?
Außerdem, selbst wenn, wird das ADCSRA mit dieser Aktion fast 
vollständig auf null gesetzt:

> ADCSRA = (1<<ADSC);

Daher der Wink zur Bitmanipulation.

PS.: Schau dir doch einfach die Funktionen im Tutorial an. Hundertfach 
geprüft, funktionierend. Vergleich das mal mit deiner Lösung.
OP #2039455
Lesenswert?
• ▲
▼
Danke!!!
Danke!!!
Danke!!!
Danke!!!
Danke!!!
Danke!!!
Danke!!!

es funktioniert! So bloed wie ich bin vergess ich das Unterprogramm zum 
initialisieren aufzurufen, und ich hab den = Operator durch |= ersetzt.

Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine 
Einheit? mV? Ich hab ein EasyAVR-Board, mit nem Poti drauf.
Gast #2039464
Lesenswert?
• ▲
▼
Fabian K. schrieb:
> Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine
> Einheit? mV? Ich hab ein EasyAVR-Board, mit nem Poti drauf.

Das ist ein Einheitenloser Wert. 1024 bekommst du wenn am ADC-Eingang 
eine Spannung anliegt, die der Referenzspannung entspricht. Dies sind 
aber Grundlagen eines ADC und das wird auch hier im Tutorial 
beschrieben. Wieso also glaube ich dir grade nicht, dass du die 
Tutorials dir angeschaut hast wie du es im Eröffnungspost geschrieben 
hast?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren