Hallo zusammen, ich bin schon seit paar Tagen mit einem Problem beschäftigt. Es geht um den AD-Wandler bei meinem Mega32. So wie es im Datenblatt steht gibt es zwei Modi beim ADC: Single conversion und Free running. Da es bei mir kontinuierlich gemessen werden soll, wollte ich auch den entsprechenden Modus aktivieren. Aber dabei krieg ich nur die Nullen vom ADC geliefert!!! Der Single-Conversion-Mode funktioniert einwandfrei. Hier ist mein Code für single conversion: SIGNAL (SIG_OUTPUT_COMPARE1A) {// Interrupt durch Compare Match ausgelöst ADCSRA |= (1<<ADSC); // Start einer Konvertierung while (ADCSRA & (1<<ADIF)) {}// warte, bis ADSC gelöscht wird --> Ende der Konvertierung Adwert_spannung = ADC; ADCSRA |= (1<<ADIF); ..... } // SIGNAL (SIG_OUTPUT_COMPARE1A) void messung_starten(void){ .... //SFIOR |= (0<<ADTS2) |(0<<ADTS1) | (0<<ADTS0); // freilaufenden Modus aktivieren, (ging nicht!!!) ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); // ADEN - ADC aktivieren, Teilungsfaktor 64 -> 125KHz ADC-Clock ADMUX |= (0<<REFS1) | (1<<REFS0); // ADC0-Pin auswählen und 5V referenz intern ADCSRA |= (1<<ADSC); // Start einer Konvertierung bzw des freilaufenden Modes, while (ADCSRA & (1<<ADIF)) {} //warte, bis ADSC gelöscht wird --> Ende der Konvertierung, weil der erste Wert = 0; .... timer16bit_start1();// Timer starten while(Anzahl_jetzt<Anzahl) // Messen { } // while() timer16bit_stop(); // Timer anhalten und Interrupts ausschalten ADCSRA &= ~(1<<ADEN); //ADC deaktivieren ..... } //messung_starten() Was soll hier geändert werden, damit der free runnig mode funktioniert? Wäre dankbar für Eure Tipps Anton
Ich kann dir leider auch nicht helfen, wollte dir nur sagen, dass du nicht alleine damit bist :). Ich versuche nämlich mittels der AD-Wandlung und der Referenzspannung eines Atmega32 eine Ladestandsanzeige zu realisieren und scheitere auch schon bei dem AD-Wandler. Mich wundert vor allem auch, dass sich anscheinend kaum jemand mit diesem Problem beschäftigt hat. Oder ist es so simpel, dass man darüber nicht reden braucht?
Ich hatte mit nem AtMega48 auch mal nen Problem mit dem AD-Wandler, der Controller misste/mass (?) also er maß einmal beim einschalten, danach passierte einfach nix mehr. MfG
'maß' war schon richtig ;) Marian schrieb: "Ich versuche nämlich mittels der AD-Wandlung und der Referenzspannung eines Atmega32 eine Ladestandsanzeige zu realisieren und scheitere auch schon bei dem AD-Wandler." Was genau ging denn bei dir nicht? Mein Programm funktioniert soweit, der Wandler misst auch gut, mich stört nur die Tatsache, dass ich bei jedem Interrupt-Aufruf die Wnadlung wieder anstossen muss (single conversion halt). mit dem free runnig konnte ich mir einfach paar Befehle einsparen.
Hey Leute, machen wir nen Club auf? Ich habe eine AVR-Schaltung die mit 3,6V aus einem Handyakku betrieben wird. Wenn die Akkuspannung auf 2,8V gefallen ist, möchte ich einen Befehl über UART wegsenden. Die UART-Kommunikation klappt einwandfrei, nur wie bekomme ich jetzt die 2,8V als Wert in meinen ATMEGA32? Das Teil hat ja einen ADC und den wollte ich mit 1,8V beschalten, so dass er 1,8V mit der (absinkenden) Versorgungsspannung 3,6V -> 2,8V vergleichen kann. Schalte ich die 1,8V nun an Pin A0? Und, wie lese ich dann den Wert aus? Ich habe gegoogelt und Datenblatt gelesen bis zum Umfallen. Also entweder ich bin zu blöd oder es steht nicht drin. Gebt mir bitte mal einen Denkanstoß. Danke, Daniel
Hm, und schonen stehen fünf Leute vor einer großen großen Wand...:) Mag uns wirklich keiner drüberhelfen?
Wo setzt du eigentlich das ADATE-Bit (ADC auto trigger enable)? Das mit dem SFIOR kannste klemmen, alle drei Bits auf 0 (also free running mode) sind eh' der Default. Btw., lass die umständlichen Nullen der Form (0 << XXXX) lieber weg, die machen die Sache nur unübersichtlicher. Wer nicht weiß, dass ein nicht gesetztes Bit ein gelöschtes Bit ist, der sollte wohl besser keine Computer programmieren. Ich habe gerade einen free running ADC in einem ATmega8 in Betrieb genommen, das Programm funktionierte auf Anhieb. Allerdings bevorzuge ich den Interrupt-Betrieb des ADC, das macht die Sache eigentlich einfacher als die blöde Pollerei.
Danke Jörg für die guten Tipps, Das ADATE-Bit habe ich übersehen. Im AVR-GCC-Tutorial kommt es gar nicht vor. Und der Interupt-Betrieb werde ich auch realiesieren, ist ja viel einfacher! gut, dass es Profis gibt Anton
> Das ADATE-Bit habe ich übersehen. Im AVR-GCC-Tutorial kommt es gar > nicht vor. Bei den Vorgängerversionen hieß dieses Bit noch ADFR (ADC free-running mode). Mittlerweile ist es via ADATE (ADC auto-trigger enable) mehrfach belegt worden, da der free-running mode nur eine der auto-trigger Möglichkeiten geworden ist. Allerdings der Default, d.h. wenn man ADATE setzt ohne sonst etwas zu ändern, hat man den free-running mode, ist also praktisch bis auf den anderen Namen rückwärtskompatibel geblieben.
das ist alles sehr logisch, aber ich sitze schon seit zwei Tagen, und mein ADC will nicht laufen!!! ;( Ich habe erstmal die fehlenden ADATE und ADIE gesetzt, und SFIOR unverändert gelassen. (siehe temp2.c) Jetzt sollte doch bei jedem "conversion complete" ein interrupt ausgelöst werden? aber nicht bei mir... kannst Du mir vielleicht dein Code-Beispiel posten? danke Anton
Die erste Konvertierung auch im free-running mode musst du durch Setzen des ADSC-Bits starten. Danach läuft er dann von selbst weiter und konvertiert immer wieder. Steht doch alles im Datenblatt. :-))
jetzt hab ich den!!! ADC im Interrupt-Betrieb bzw. free running!!! hier der Code Danke noch mal
Hallo zusammen, Jörg schrieb: > Btw., lass die umständlichen Nullen der Form (0 << XXXX) lieber > weg, die machen die Sache nur unübersichtlicher. Ich mag es lieber in dieser umständlichen Schreibweise, zumindest, wenn Steuerregister beschrieben werden. Dann sehe ich auf den ersten Blick, daß ich bspw. "U2X" oder "ADIE" NICHT gesetzt habe. Und wenn ich es später doch noch setzen will, ändere ich einfach 0->1. > Wer nicht weiß, dass ein nicht gesetztes Bit ein gelöschtes Bit > ist, der sollte wohl besser keine Computer programmieren. Klar. Aber wer nicht weiß, daß "UP_CLK_EN" im RF Configuration Register steht, darf das dennoch ;-) Gruß, Falk
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.