Forum: Mikrocontroller und Digitale Elektronik Hilfe Fehler beim ADC


von olaf (Gast)


Angehängte Dateien:

Lesenswert?

kann mir jemand sagen was ich bei meinem 3x MUX ADC falsch mache?!?!?

will 3 spannungswerte aufnehmen und über rs 232 weg senden (klappt 
schon)

wenn ich ihn laufen lasse und am adc0 was anschließe ändern sich alle 
drei werte. bei pin adc1 bzw. adc2 ändert sich gar nix

kann mir da bitte jemand weiter helfen

ps: anfänger

von olaf (Gast)


Lesenswert?

achso at mega 128 habe ich mit 16mhz

von gast (Gast)


Lesenswert?

Man muß den AD auch starten und wandeln lassen.

Schau mal hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

von Michael U. (amiga)


Lesenswert?

Hallo,

 while(1)
  {
     sbi(ADCSRA,ADSC);

     ADMUX=(ADMUX & 0b01100000);// | 0b01000000);
     adc_result0 = ((ADCL) | ((ADCH)<<8));

     ADMUX=(ADMUX & 0b01100001);// | 0b01000000);
     adc_result1 = ((ADCL) | ((ADCH)<<8));

     ADMUX=(ADMUX & 0b01100010);// | 0b01000000);
     adc_result2 = ((ADCL) | ((ADCH)<<8));

     printf( "%d %d %d\n", adc_result0, adc_result1, adc_result2);
  }

was erwartest Du, was hier passieren soll?

Du startest EINE Messung, drehst dann an den MUX-Werten und liest 
irgendwie ADCH und ADCL...

Du wartest nicht auf das Ende der Messung und startest auf einer anderen 
MUX-Einstellung auch keine neue.

PS: die Reihenfolge, in der ADCH und ADCL gelesen werden müssen, steht 
im Datenblatt. Man kann aber das Problem auch dem C-Compiler überlassen 
und einfach ADC lesen.

Warum setzt Du wahllos diverse Flags im ADCSRA?
Du solltest Di die Bedeutung dieser mal im Datenblatt anschauen.

Gruß aus Berlin
Michael

von olaf (Gast)


Lesenswert?

@Michael U.

Warum wahllos? bei der init wird einmal der adc initialisiert. Bei dem 
teil den du raus kopiert hast möchte ich das er nach einander die mux 
eingänge wandelt und in die entsprechenden adc_result speichert, um sie 
später dann auszugeben.

Anscheind ist meine lösung falsch wie müsste ich das den machen? wie 
kann ich sagen warte auf umwandlung?

von Michael U. (amiga)


Lesenswert?

olaf schrieb:
> @Michael U.
>
> Warum wahllos? bei der init wird einmal der adc initialisiert.
  sbi(ADCSRA,ADEN); ADC einschalten
  cbi(ADCSRA,ADFR); FreeRunning ausschalte (war sowieso nach Reset aus)

(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|
(1<<ADEN) hast Du doch oben gerade, doppelt hält besser?
(1<<ADPS0);
Du kennst die Bedeutung der Flags?
(1<<ADIE) wozu gibst Du den Interrupt frei?
(1<<ADIF) wozu löschst Du das Interrupt-Flag?
(1<<ADFR) Du gibst FreeRunning frei, ist ungünstig, wenn man mehrere 
Eingänge samplen will
(1<<ADSC) StartConversion ist auch unsinng bevor MUX und Format gesetzt 
sind.

> Bei dem
> teil den du raus kopiert hast möchte ich das er nach einander die mux
> eingänge wandelt und in die entsprechenden adc_result speichert, um sie
> später dann auszugeben.

Wie im Datenblatt eben oder im Turtorial...
 {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result = ADCW;

Dann MUX umschalten, schauen, was das Datenblatt da zu Wartezeiten sagt, 
bis bis man starten kann usw. usw.
>
> Anscheind ist meine lösung falsch wie müsste ich das den machen? wie
> kann ich sagen warte auf umwandlung?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

Gruß aus Berlin
Michael

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.