Forum: Analoge Elektronik und Schaltungstechnik Spannung an ATMega8 ADC7 messen


von Chris (Gast)


Lesenswert?

Hallo,
ich möchte eine Analogspannung von maximal 9V an dem Analogeingang ADC7
messen. Dazu habe ich den ATMega8 folgendermasen initialisiert:

  ADCSRA=(1 << ADPS1 |1 << ADPS2 |1 << ADEN |1 << ADFR);
  cbi (ADCSRA,ADPS0);
  ADMUX=(1 << MUX0 |1 << MUX1 |1 << MUX2);

Wenn ich nun aber das ADCW abfrage und mir seriell ausgeben lasse,
stehen dort nur Wirre Zeichen. Der UART-Befehl lautet wie folgt:

        UartPrintF("U: %2.1f",(ADCW*0.009775));

Habe ich etwas falsch initialisiert? Kann mir jemand nen Tip geben?
Gruß
Chris

von Hubert.G (Gast)


Lesenswert?

Ich nehme an das du einen Mega8 in SOIC hast. Woher hast du das ADCW ?
oder ist das selbst definiert?
ADFR ist Freerunnig Mode, wann liest du die Register aus?

von Dennis (Gast)


Lesenswert?

Ich habe den ATMega in SMD, also TQFP.
Das ADCW habe ich in einem anderen Projekt gesehen, hatte es zuvor auch
schon mit
(ADCL + (ADCH<<8))
probiert. War leider genauso!
Ich gehe doch recht in der Annahme das im Freerunning Mode ständig das
Register aktualisiert wird, oder? Ich muß also nur noch wie oben
beschrieben darauf zugreifen?!
Oder habe ich doch vergessen etwas zu initialisieren?

von Hubert.G (Gast)


Lesenswert?

Ich arbeite immer mit Interrupt, sonst kannst du nur abfragen wenn das
ADIF gesetzt ist, so lese ich es in der Doku.
Zum Probieren setze einmal ADLAR und frage nur ADCH ab.

Beschaltung des Mega ist sicher richtig?

von Dennis (Gast)


Lesenswert?

Ja, habe beide GND und VCC leitungen beschaltet sowie auch AGND, AVCC
und AREF...
Kannst Du mir vielleicht ein Beispiel für die Interruppt abfrage geben?
Was alles initialisiert werden muß.
Habe ich nämlich auch schon versucht, sprang aber gar nicht in den
Interrupt. Deshalb glaube ich ja das ich nen Initialisierungsfehler
mache!
Zu erwähnen ist vielleicht noch, ich arbeite mit dem internen
Oszillator auf 8Mhz. Ist ja wichtig für den Vorteiler...

von Hubert.G (Gast)


Lesenswert?

#include <avr/signal.h>
#include <avr/interrupt.h>

für single conversion
ADMUX=(1<<ADLAR)|(1<<REFS0)|(1<<REFS1);  /*ADC-Kanal, ADLAR, interne
Ref. einstellen 0xe0 */
  ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS2)|(1<<ADSC);  /* ADC
initialisieren und starten */

abfrage
SIGNAL(SIG_ADC){      /*Interrupt auslösen wenn ADC-conversion 
komplett*/
Messwert=ADCH;         /*Register auslesen*/

einstellung ist Kanal 0, ergebnis linksbündig, interne Referenzstpg.,
ADC enable, ADC interrupt enable, Teilerfaktor, ADC Start

Da fällt mir gerade auf, wo startest du die Conversion?

von Markus (Gast)


Lesenswert?

Aboniert weil ich morgen auch mit A/D Wandlung starten will ;-)

von (geloescht) (Gast)


Lesenswert?

(Dieser Beitrag wurde geloescht)

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.