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
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
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
@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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.