Forum: Mikrocontroller und Digitale Elektronik Problem bei ADC mit ATMega2560 und Codevision


von Peter (Gast)


Lesenswert?

Steh grad mal wieder auf dem Schlauch :-/
Möchte 4 Analogkanäle folgendermaßen auslesen...
1
AK[3] = read_adc(3);
2
AK[4] = read_adc(4);
3
AK[5] = read_adc(5);
4
AK[6] = read_adc(6);
Wenn ich das so mache und dann den...
AK3 Wert verstelle wird der Wert von AK[4] verändert
AK4 Wert verstelle wird der Wert von AK[5] verändert
AK5 Wert verstelle wird der Wert von AK[6] verändert
AK6 Wert verstelle wird der Wert von AK[3] verändert

Die Codevision Funktion ist folgendermaßen...
1
// Read the 8 most significant bits
2
// of the AD conversion result
3
unsigned char read_adc(unsigned char adc_input)
4
{
5
ADMUX=(adc_input & 0x07) | (ADC_VREF_TYPE & 0xff);
6
if (adc_input & 0x08) ADCSRB |= 0x08;
7
else ADCSRB &= 0xf7;
8
// Delay needed for the stabilization of the ADC input voltage
9
delay_us(10);
10
// Start the AD conversion
11
ADCSRA|=0x40;
12
// Wait for the AD conversion to complete
13
while ((ADCSRA & 0x10)==0);
14
ADCSRA|=0x10;
15
return ADCH;
16
}

Denke mal die wird stimmen.

Wo ist mein Fehler?

von Karl H. (kbuchegg)


Lesenswert?

ersetze BITTE die Hex-Zahlen durch die Schreibweise

   (1<<ADEN)

sodass man nicht suchen muss, welche Bits

ADCSRA|=0x40;

hier überhaupt gesetzt werden.

auf welches Bit, wird hier
while ((ADCSRA & 0x10)==0);
gewartet?

(Jetzt bin ich mal zu faul, im Datenblatt zu suchen)

von Peter (Gast)


Lesenswert?

müsste ADIF sein
while ((ADCSRA & (1<<ADIF))==0);

von Peter (Gast)


Lesenswert?

ADCSRB |= 0x08; =

ADCSRB |= (1<<MUX5);

von Peter (Gast)


Lesenswert?

Ich sagte doch das ich den Code nicht geschrieben hatte.
Der ist von Codevision und der generiert ihn halt so.

Ist es nicht ADIF? Was soll es denn dann sein?

von Peter (Gast)


Lesenswert?

hab jetzt mal die Abfrage

while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;

rausgenommen und durch eine Wartezeit ersetzt.

Dann stimmt das Ergebnis.

von Peter (Gast)


Lesenswert?

Kann man eigentlich als Moderator einzelne Antworten löschen?

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Ich sagte doch das ich den Code nicht geschrieben hatte.
> Der ist von Codevision und der generiert ihn halt so.
>
> Ist es nicht ADIF? Was soll es denn dann sein?

War mein Fehler. Hab die Nibble durcheinandergeschmissen.
Es ist ADIF
(Ich werde mein Lebtag nicht verstehen, warum man da auf ADIF wartet 
anstat auf ADSC. Ist doch viel einfacher zu merken: Ich setze ADSC um 
die Wandlung zu starten und wenn sie fertig ist, fällt ADSC wieder auf 0 
zurück.


OK. Die Wandelfunktion sieht so nicht so schlecht aus (auch wenn ich den 
delay da drinnen nicht mag, aber der soll jetzt erst mal nicht das 
Problem sein)

Hilft wohl nichts. Da musst du mehr von deinem restlichen Programm 
zeigen.

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.