mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 ADC Hilfe


Autor: Fabian K. (fabian_k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Fabian K. (fabian_k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian K. (fabian_k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian K. (fabian_k)
Datum:

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

Autor: Fabian K. (fabian_k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nils ‫‪ (n-regen)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Nils ‫‪ (n-regen)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.