Hallo, ich habe hier einen atmega8 und möchte ADC0 bis ADC4 benutzen. ADC0 bis ADC3 liefern mir bereits gute und brauchbare Werte, aber wenn ich an ADC4 Ad-Wandeln will, passiert irgendwie nichts... TWEN hab ich auf 0 gesetzt, daher sollte SDA vom TWI nicht mehr aktiviert sein... TWCR &= ~(1<<TWEN); ADC initialisieren: ADCSRA |= (1<<ADEN); // ADC enable ADCSRA = 0x86; // ADC enabled; no Free Running; no Interrupt; Clock-Prescaler: 64 ADMUX = 0xE0; // Referenz: AVcc; Left Adjusted; Channel 0 ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)) {} result = ADCH; wenn ich jetzt z.B. so etwas mache... ADMUX = (ADMUX & 0xE0) | (0x03 & 0x1F); // channel 3 (ADC4) ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)) {} result = ADCH; // hier steht richtiger Wert drin ADMUX = (ADMUX & 0xE0) | (0x04 & 0x1F); // channel 4 (ADC4) ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADSC)) {} result = ADCH; // hier steht immer der Wert von channel 3 drin... ...wird irgendwie bei channel 4 nicht gewandelt. Weiß jemand wo mein Fehler liegt? Was ist da falsch? ADMUX hab ich schon geprüft nachdem ich den entsprechenden Wert ins Register geschrieben hab... das passt auch! Wäre über jeden sinnvollen Vorschlag dankbar! Gruß vogael
hat denn noch keiner den adc4 oder adc5 auf einem atmega8 (PDIP) verwendet und kann mir evtl. helfen?
Weiß leider nicht genau wie interssant das ist aber: 4. Note that ADC input channel 4 uses digital power. Während: 3. Note that ADC input channel 3 uses analog power. Sonst lese mal TWCR aus nachdem du es beschrieben hast. (Kenne leider die C-Befehle nochtnicht so gut).
ADCSRA=(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); ADCSRA|=(1<<ADEN); ADMUX= 3; //ADC4; ADMUX|=(0<<REFS1)|(1<<REFS0)|(0<<ADLAR); ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC)){}; mess=ADCL; mess+=(ADCH<<8); ADCSRA=(0<<ADEN); Laeuft Problemlos Gruß peter
ADCSRA=(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); ADCSRA|=(1<<ADEN); ADMUX= 4; //ADC4; ADMUX|=(0<<REFS1)|(1<<REFS0)|(0<<ADLAR); ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC)){}; mess=ADCL; mess+=(ADCH<<8); ADCSRA=(0<<ADEN); Sorry ADMUXmuß natürlich 4 sein - geht aber auch ohne Probleme Peter
Warum hast Du Pullup Widerstände am ADC? So misst Du nur 5V = 1023. Warum liegt dein AREF-Pin an 5V? Normalerweise geht der über nen Kondensator an Masse. Schau Dir mal die beiden Bilder an im Anhang. Da siehtst Du wie man es richtig anschließt. Die "Extended" Version sollte dabei bessere Werte liefern, durch den Tiefpass 2.Ordnung am Eingang der Referenz-Spannung. Grüße
funktioniert jetzt... aus unerklärlichen Gründen hats heute morgen funktioniert! Hab dann nochmal getestet, zwischen 4,5 V und 5 V läuft auch adc4 problemlos, sobald die Spannung weiter sinkt tritt genau das oben beschriebene Verhalten auf. Bin mir eigentlich sicher das ich gestern ca. 5V dran hatte. Egal, danke für eure Hilfe, aber am Code lags nicht... Die Pull-Up-Widerstände sind dran weil ich jeweils einen CNY70 Sensor an den ADC-Pins habe und der gegen Masse zieht. AREF hatte ich erst so wie auf deinen Bildern, aber da kam immer 1023 raus! Hab dann versuchsweise mal AREF auf 5 V gelegt und dann funktionierte es wunderbar. Und die Extended Version steht so glaub ich auch im Datenblatt aber die ist hier garnicht nötig, die Sensoren müssen nur schwarz / weiß unterscheiden können, zwischenwerte sind mir relativ egal... Aber danke für deine kritischen Fragen! Gruß vogael
>AREF hatte ich erst so wie auf deinen Bildern, aber da kam immer 1023 >raus! Hab dann versuchsweise mal AREF auf 5 V gelegt und dann >funktionierte es wunderbar. AREF nuss auch als Referenz gewählt sein, sonst geht's nicht!
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.