Forum: Mikrocontroller und Digitale Elektronik Atmega32 ADC Hilfe


von Fabian K. (fabian_k)


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

von avr (Gast)


Lesenswert?


von Fabian K. (fabian_k)


Lesenswert?

Ich hab mir den Beitrag mal schnell angeschaut, und muss zugeben, nicht 
alles von dem mitgekriegt zu haben. Aber soll das jetzt heissen, dass 
das nicht funktioniert, weil ich bei dem Setzen der Bits in den 
Registern, anstatt von |=, = geschrieben habe?

Danke im vorraus

von MWS (Gast)


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);

von Floh (Gast)


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.

von Fabian K. (fabian_k)


Lesenswert?

OK, also wäre das dann:

ADCSRA |= (1<<ADSC);

oder

ADCSRA = ADCSRA | (1<<ADSC);


Stimmt das so?
(Ich hab sowas leider noch nicht gemacht in der Schule, uC kommen erst 
nächstes Jahr (:   )


Danke im vorraus

von Fabian K. (fabian_k)


Lesenswert?

Das Aufrufen von init_adc wird gemacht, hab allerdings vergessen es oben 
hinzuschreiben (ist ein längerer Code, wo nur herauskopiert ist)
Sorry

von Fabian K. (fabian_k)


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.

von Michael (Gast)


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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Fabian K. schrieb:

> Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine
> Einheit? mV?

Nein.

995 von 1024 Digitalstufen (bei 10-Bit ADC). 1024 Stufen entsprechen 
deiner Referenzspannung. Die Umrechnung Digitalstufen nach V oder mV bei 
gegebener Bitzahl des ADC und Referenzspannung ist im Tutorial zum ADC 
erklärt.

von Nils ‫. (n-regen)


Lesenswert?

Der ATmega32 hat einen 10-bit ADC, kann also zwischen 1024 verschiedenen 
Spannungsstufen unterscheiden.
Das heißt allerdings, dass er Werte zwischen 0 und 1023 ausgibt, nicht 
bis 1024!

von Michael (Gast)


Lesenswert?

Nils ‫‪ schrieb:
> Das heißt allerdings, dass er Werte zwischen 0 und 1023 ausgibt, nicht
> bis 1024!

Stimmt, aber auch das steht ja hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

von Nils ‫. (n-regen)


Lesenswert?

Ich wollte nur die Aussagen von Stefan und dir richtig stellen, dass der 
ADC 1024 ausgeben kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.