free running mode Mega32

Gast #285120
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
Gast #285123
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?
Gast #285125
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.
Gast #285126
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
Moderator Persönliche Seite #285131
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.
Moderator Persönliche Seite #285133
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.
Gast #285134
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
Angehängte Dateien:
Persönliche Seite #285137
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren