Forum: Compiler & IDEs free running mode Mega32


von Anton (Gast)


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

von Anton (Gast)


Angehängte Dateien:

Lesenswert?

blöde sache, zeilen zu lang, hier nochmal als datei

anton

von Anton (Gast)


Lesenswert?

hat noch keiner AD-Wandler im free running mode betrieben?

;(

von Marian (Gast)


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?

von Dennis Strehl (Gast)


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

von Anton (Gast)


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.

von Daniel (x2) (Gast)


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

von Markus (Gast)


Lesenswert?

Auch grad den ADC nich ganz versteh deswegen thread abonnier

von daniel (Gast)


Lesenswert?

*abo

von Daniel (x2) (Gast)


Lesenswert?

Aber irgendwie kann/mag uns niemand weiterhelfen. :(

von Daniel (x2) (Gast)


Lesenswert?

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

Mag uns wirklich keiner drüberhelfen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Anton (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Anton (Gast)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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. :-))

von Anton (Gast)


Angehängte Dateien:

Lesenswert?

jetzt hab ich den!!!

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


hier der Code


Danke noch mal

von Falk W. (dl3daz) Benutzerseite


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

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.