www.mikrocontroller.net

Forum: Compiler & IDEs free running mode Mega32


Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Anton (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
blöde sache, zeilen zu lang, hier nochmal als datei

anton

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat noch keiner AD-Wandler im free running mode betrieben?

;(

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dennis Strehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'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.

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch grad den ADC nich ganz versteh deswegen thread abonnier

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*abo

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber irgendwie kann/mag uns niemand weiterhelfen. :(

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, und schonen stehen fünf Leute vor einer großen großen Wand...:)

Mag uns wirklich keiner drüberhelfen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Anton (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. :-))

Autor: Anton (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetzt hab ich den!!!

ADC im Interrupt-Betrieb bzw. free running!!!


hier der Code


Danke noch mal

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.