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
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?
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?
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?
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...
#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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.