atmega8 adc4 problem

Gast #2191151
Hallo,

ich habe hier einen atmega8 und möchte ADC0 bis ADC4 benutzen.
ADC0 bis ADC3 liefern mir bereits gute und brauchbare Werte, aber wenn 
ich an ADC4 Ad-Wandeln will, passiert irgendwie nichts...

TWEN hab ich auf 0 gesetzt, daher sollte SDA vom TWI nicht mehr 
aktiviert sein...
TWCR &= ~(1<<TWEN);

ADC initialisieren:

ADCSRA |= (1<<ADEN); // ADC enable
ADCSRA = 0x86; // ADC enabled; no Free Running; no Interrupt; 
Clock-Prescaler: 64
ADMUX = 0xE0; // Referenz: AVcc; Left Adjusted; Channel 0

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

wenn ich jetzt z.B. so etwas mache...

ADMUX = (ADMUX & 0xE0) | (0x03 & 0x1F); // channel 3 (ADC4)
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC)) {}
result = ADCH; // hier steht richtiger Wert drin

ADMUX = (ADMUX & 0xE0) | (0x04 & 0x1F); // channel 4 (ADC4)
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC)) {}
result = ADCH; // hier steht immer der Wert von channel 3 drin...

...wird irgendwie bei channel 4 nicht gewandelt.

Weiß jemand wo mein Fehler liegt? Was ist da falsch?

ADMUX hab ich schon geprüft nachdem ich den entsprechenden Wert ins 
Register geschrieben hab... das passt auch!

Wäre über jeden sinnvollen Vorschlag dankbar!

Gruß vogael
Angehängte Dateien:
Gast
Weiß leider nicht genau wie interssant das ist aber:

4. Note that ADC input channel 4 uses digital power.

Während:

3. Note that ADC input channel 3 uses analog power.

Sonst lese mal TWCR aus nachdem du es beschrieben hast. (Kenne leider 
die C-Befehle nochtnicht so gut).
Gast
ADCSRA=(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
 ADCSRA|=(1<<ADEN);
 ADMUX= 3; //ADC4;
 ADMUX|=(0<<REFS1)|(1<<REFS0)|(0<<ADLAR);
 ADCSRA|=(1<<ADSC);
 while(ADCSRA&(1<<ADSC)){};
 mess=ADCL;
 mess+=(ADCH<<8);
 ADCSRA=(0<<ADEN);

Laeuft Problemlos

Gruß peter
Gast
ADCSRA=(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
 ADCSRA|=(1<<ADEN);
 ADMUX= 4; //ADC4;
 ADMUX|=(0<<REFS1)|(1<<REFS0)|(0<<ADLAR);
 ADCSRA|=(1<<ADSC);
 while(ADCSRA&(1<<ADSC)){};
 mess=ADCL;
 mess+=(ADCH<<8);
 ADCSRA=(0<<ADEN);

Sorry ADMUXmuß natürlich 4 sein - geht aber auch ohne Probleme

Peter
Gast
Warum hast Du Pullup Widerstände am ADC?
So misst Du nur 5V = 1023.

Warum liegt dein AREF-Pin an 5V? Normalerweise geht der über nen 
Kondensator an Masse.
Schau Dir mal die beiden Bilder an im Anhang.
Da siehtst Du wie man es richtig anschließt.
Die "Extended" Version sollte dabei bessere Werte liefern, durch den 
Tiefpass 2.Ordnung am Eingang der Referenz-Spannung.

Grüße
Angehängte Dateien:
Gast
funktioniert jetzt...
aus unerklärlichen Gründen hats heute morgen funktioniert!

Hab dann nochmal getestet, zwischen 4,5 V und 5 V läuft auch adc4 
problemlos, sobald die Spannung weiter sinkt tritt genau das oben 
beschriebene Verhalten auf. Bin mir eigentlich sicher das ich gestern 
ca. 5V dran hatte.

Egal, danke für eure Hilfe, aber am Code lags nicht...

Die Pull-Up-Widerstände sind dran weil ich jeweils einen CNY70 Sensor an 
den ADC-Pins habe und der gegen Masse zieht.

AREF hatte ich erst so wie auf deinen Bildern, aber da kam immer 1023 
raus! Hab dann versuchsweise mal AREF auf 5 V gelegt und dann 
funktionierte es wunderbar. Und die Extended Version steht so glaub ich 
auch im Datenblatt aber die ist hier garnicht nötig, die Sensoren müssen 
nur schwarz / weiß unterscheiden können, zwischenwerte sind mir relativ 
egal...

Aber danke für deine kritischen Fragen!

Gruß vogael
Gast
>AREF hatte ich erst so wie auf deinen Bildern, aber da kam immer 1023
>raus! Hab dann versuchsweise mal AREF auf 5 V gelegt und dann
>funktionierte es wunderbar.

AREF nuss auch als Referenz gewählt sein, sonst geht's nicht!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.