Forum: Mikrocontroller und Digitale Elektronik atmega8 adc4 problem


von vogael (Gast)


Angehängte Dateien:

Lesenswert?

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

von vogael (Gast)


Lesenswert?

hat denn noch keiner den adc4 oder adc5 auf einem atmega8 (PDIP) 
verwendet und kann mir evtl. helfen?

von unbekannt (Gast)


Lesenswert?

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

von petrov (Gast)


Lesenswert?

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

von petrov (Gast)


Lesenswert?

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

von NopNop (Gast)


Angehängte Dateien:

Lesenswert?

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

von vogael (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

>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!

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.