PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8: ADC geht nicht



cl
25.03.2005, 23:11
Guten Abend allerseits :-)

Nach langer Fehlersuche weis ich noch immer nicht, warum der AD-Wandler meinesATmega8 nicht geht ...

Ich habs jetzt mal gekürzt soweit wie möglich. Das Problem ist, dass die while-Schleife while(ADCSRA & (1 << ADSC)) nie verlassen wird.

Was mache ich falsch???

MfG
- C. Lechner



#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>

int main(void)
{
uint8_t x;

DDRD = 0xff;

ADMUX = 0x40;
ADCSRA = (1 << ADEN) | 0x07;
while(1)
{
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));

x++;
if (x & 0x01)
PORTD = 0x00;
else
PORTD = 0xff;
}

return(0);
}

uwegw
26.03.2005, 09:41
das datenblatt sagt dazu:
A single conversion is started by writing a logical one to the ADC Start Conversion bit,
ADSC. This bit stays high as long as the conversion is in progress and will be cleared by
hardware when the conversion is completed.

du setzt also adsc, und wartest dann in der while schleife bis es wieder zurückgesetzt wird, also die ad-wandlung fertig ist, richtig?

demnach wird der adc nie fertig...
ist überhaupt alles richtig angeschlossen? denn der adc hat ja ne eigene stromversorgung. AVcc und AGnd... und ARef die referenzspannung...
wenn das nicht der fall ist kannst du natürlich lange warten...

cl
26.03.2005, 10:12
das datenblatt sagt dazu:
A single conversion is started by writing a logical one to the ADC Start Conversion bit,
ADSC. This bit stays high as long as the conversion is in progress and will be cleared by
hardware when the conversion is completed.

du setzt also adsc, und wartest dann in der while schleife bis es wieder zurückgesetzt wird, also die ad-wandlung fertig ist, richtig?

demnach wird der adc nie fertig...
Genau, ich warte auf ebendieses zurücksetzen vom Bit ADSC. Eigentlich ganz einfach, aber die Probs stecken wie immer mal wieder im Detail.

Wenn ich den Code für den ATmega16 kompiliere und den Simulator auf ATmega16 umstelle, dann läuft er ordentlich.
Kompiliere ich hingegen für ATmega8 und stelle den Simulator auf ATmega8, dann wird er eben nie fertig ...



ist überhaupt alles richtig angeschlossen? denn der adc hat ja ne eigene stromversorgung. AVcc und AGnd... und ARef die referenzspannung...
wenn das nicht der fall ist kannst du natürlich lange warten...
Keine Sorge, in diese Falle bin ich (zum Glück) nicht getappt. Es reicht ja so schon. :cheesy:

BTW: Gibt es im Internet irgendwo einen Code, der den AD-Wandler vom ATmega8 im Polling-Modus steuert und der bei Euch auch funktioniert??? Mit google findet man zwar viel, aber das meiste sieht wie mein Code aus und der funktioniert ja nicht.

MfG
- cl

Archi
26.03.2005, 11:02
BTW: Gibt es im Internet irgendwo einen Code, der den AD-Wandler vom ATmega8 im Polling-Modus steuert und der bei Euch auch funktioniert??? Mit google findet man zwar viel, aber das meiste sieht wie mein Code aus und der funktioniert ja nicht.
- cl

Im ASURO läuft folgendes:

Bei der Initialisierung:
#define IR_LEFT (1 << MUX0) | (1 << MUX1) //ADC3

// A/D Conversion
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64

und zum Auslesen:
ADMUX = (1 << REFS0) | IR_LEFT; // AVCC reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
data[0] = ADCL + (ADCH << 8);

Das hat schon ein paar hundert Mal funktioniert!

Hoffe,das hilft!

CU, Robin

cl
26.03.2005, 12:59
Futzt leider auch nicht. Ich ziehe mir mal das neueste AVRStudio. Vielleicht hat das einfach nur einen Bug ...

Jetzt habe ich Version 4.10 Build 356.

Mal sehen, ob das neue besser geht!!!

cl
26.03.2005, 13:07
Mal sehen, ob das neue besser geht!!!
Mit dem neuen AVRStudio (Build 410) geht's besser.

Auch mein alter Code geht jetzt *gruebel*.

Jetzt teste ich es noch in Hardware!