Forum: Mikrocontroller und Digitale Elektronik Probleme mit AD-Wandler im ATmega


von Frank (Gast)


Lesenswert?

Ich habe ein Problem mit dem AD-Wandler in ATmega8 und 32 (gleicher 
Fehler). Was mich schon wundert: Egal ob AVCC und GND von AD-Wandler 
angeschlossen sind oder nicht kommt das gleiche raus. Für was gibt es 
dann überhaupt diese Anschlüsse?

Zu dem eigentlichen Problem:
Ich bekomme total falsche Werte! Lege ich den Eingang auf AREF (5V) habe 
ich Werte um 600. Lege ich den Eingang auf Masse kommen Werte von ca. 
300.

Hier der C-Code:
1
    ADMUX |= (1<<MUX0);
2
    ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
3
    ADCSRA |= (1<<ADSC);
4
    
5
    while ( ADCSRA & (1<<ADSC) ) {
6
     ;
7
     }
8
  
9
  lcd_init();
10
  
11
  float spannung = 0;
12
  
13
  while(1)
14
  {
15
        
16
        ADCSRA |= (1<<ADSC);
17
        while ( ADCSRA & (1<<ADSC) ) {
18
        ;
19
        }
20
        
21
    spannung = ADCL;
22
    spannung += (ADCH<<8);    
23
    
24
    
25
    spannung = (int) (spannung);
26
    
27
28
    lcd_clear();
29
    lcd_zahl(spannung);
30
31
//1 Sekunde warten
32
    _delay_ms(100);
33
    _delay_ms(100);
34
    _delay_ms(100);
35
    _delay_ms(100);
36
    _delay_ms(100);
37
    _delay_ms(100);
38
    _delay_ms(100);
39
    _delay_ms(100);
40
    _delay_ms(100);
41
    _delay_ms(100);
42
    
43
  }

von Marius W. (mw1987)


Lesenswert?

Dein Code sieht auch nicht unbedingt toll aus.
1
float spannung = 0;
 ist schonmal ziemlich unklug. Nimm als Datentyp einen int. Ich vermute 
sogar, dass deine Routine "lcd_zahl" gar keine float-Datentypen 
verarbeiten kann.
1
spannung = (int) (spannung);
  hilft vielleicht in MATLAB, aber aufm µC kann das doch nur schief 
gehen, wenn spannung als float deklariert ist.

MfG
Marius

von Hubert G. (hubertg)


Lesenswert?

AVCC ist die Spannungsversorgung den PortC beim Mega8 oder PortA beim 
Mega16. Welchen ADC-Eingang verwendest du.

von Frank (Gast)


Lesenswert?

Ich habe einen float benutzt, weil ich damit noch mehr vor hatte. Das 
ganze mit der Ausgabe funktioniert. Hab ich auch schon bei anderen 
Programmen so gemacht.

Als Eingang verwende ich ADC0 (MUX0).
Die Versorgungsspannung hab ich wie im Datenblatt angeschlossen:

Mega8:
AVCC: Pin 20
AREF: Pin 21
GND: Pin 22
ADC0: Pin 23

Mega32:
AVCC: Pin 30
GND: Pin 31
AREF: Pin 32
ADC0: Pin 40

von Gregor L. (Gast)


Lesenswert?

Hallo !

Versuch mal mit ADMUX=0; deine Register in einen klar definierten 
Zustand zu bringen.


z.B:

    ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
    ADMUX = 0;
    ... hier  ADMUX einstellen

    ADCSRA |= (1<<ADSC);


lg,
Gregor

von Hubert G. (hubertg)


Lesenswert?

Mit ADMUX |= (1<<MUX0); hast du ADC1 eingestellt.

von Frank (Gast)


Lesenswert?

Warum hab ich da ADC1 eingestellt?

Ich dachte das geht nach dem Prinzip MUX0=ADC0, MUX1=ADC1 usw.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank schrieb:
> Egal ob AVCC und GND von AD-Wandler
> angeschlossen sind oder nicht kommt das gleiche raus.

Mit bisschen Pech hast du den AVR damit bereits kaputt geschossen,
wenn du ihn jemals ohne AVcc betrieben hast.

> Ich dachte das geht nach dem Prinzip MUX0=ADC0, MUX1=ADC1 usw.

Datenblatt lesen ist hier besser als denken.  Insbesondere beim
ATmega32 wirst du dann nämlich sehr schnell feststellen, dass der
deutlich mehr kann, als nur jeden ADC-Eingang selbst 1:1 abzutasten.
Schon dadurch kann deine Logik gar nicht aufgehen.

von Hubert G. (hubertg)


Lesenswert?

Wenn du das Bit0 im ADMUX setzt, das hast du mit ADMUX |= (1<<MUX0); 
getan, dann hast du den ADC1 aktiviert. Schau dir das im Datenblatt 
Mega8, Seite 206 an.

von Frank (Gast)


Lesenswert?

Vielen Dank für die Hilfe. Ich hab mir schon gedacht, dass ich einen 
ganz dummen Fehler gemacht hab.
Ich berichte dann, wenn ich es ausprobiert hab.

von Frank (Gast)


Lesenswert?

Mit dem richtigen Eingang funktioniert es! Und bei meinen Versuchen das 
Ding zum laufen zu bringen ist auch nichts kaputt gegangen :-)

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.