Spannung an ATMega8 ADC7 messen

Gast #275738
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
Gast #275739
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?
Gast #275740
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?
Gast #275741
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?
Gast #275742
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...
Gast #275743
#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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.