Hallo, ich versuche nun schon seit einer Woche, ohne Erfolg, den ADC des Atmega32 zu Laufen zu bringen. Tutorials bin ich vorher schon alle durchgegangen, die Register hab ich mir aus dem Datenblatt rausgesucht. Hier der Teil des Codes, der den ADC betrifft: // init the whole adc service void init_adc() { uint16_t result; ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0); ADCSRA = (1<<ADSC); while(ADCSRA & (1<<ADSC)) { } result = ADCL; result = result | (ADCH<<8); return; } int main(void) { int result=0; char resultc[50]; while(1) { ADCSRA = (1<<ADSC); while (ADCSRA & (1<<ADSC)) { } result = ADCL; result = result | (ADCH<<8); itoa(result,resultc,10); uart_puts(resultc); _delay_ms(5000); } return(0); } Die Formatierungen stimmen jetzt nicht 100%, weil die Tab-Taste in diesem Editor irgendwie nicht funktioniert hat. Danke in vorraus
Ich hab mir den Beitrag mal schnell angeschaut, und muss zugeben, nicht alles von dem mitgekriegt zu haben. Aber soll das jetzt heissen, dass das nicht funktioniert, weil ich bei dem Setzen der Bits in den Registern, anstatt von |=, = geschrieben habe? Danke im vorraus
Beim ersten Beschreiben des Registers darf man = schreiben, beim zweiten Beschreiben des selben Registers muss man verodern, oder alle die bereits gesetzten Bits werden auf 0 gesetzt. Fabian K. schrieb: > ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | > ADCSRA = (1<<ADSC);
in deinem main wir init_adc() gar nicht aufgerufen?
Außerdem, selbst wenn, wird das ADCSRA mit dieser Aktion fast
vollständig auf null gesetzt:
> ADCSRA = (1<<ADSC);
Daher der Wink zur Bitmanipulation.
PS.: Schau dir doch einfach die Funktionen im Tutorial an. Hundertfach
geprüft, funktionierend. Vergleich das mal mit deiner Lösung.
OK, also wäre das dann: ADCSRA |= (1<<ADSC); oder ADCSRA = ADCSRA | (1<<ADSC); Stimmt das so? (Ich hab sowas leider noch nicht gemacht in der Schule, uC kommen erst nächstes Jahr (: ) Danke im vorraus
Das Aufrufen von init_adc wird gemacht, hab allerdings vergessen es oben hinzuschreiben (ist ein längerer Code, wo nur herauskopiert ist) Sorry
Danke!!! Danke!!! Danke!!! Danke!!! Danke!!! Danke!!! Danke!!! es funktioniert! So bloed wie ich bin vergess ich das Unterprogramm zum initialisieren aufzurufen, und ich hab den = Operator durch |= ersetzt. Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine Einheit? mV? Ich hab ein EasyAVR-Board, mit nem Poti drauf.
Fabian K. schrieb: > Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine > Einheit? mV? Ich hab ein EasyAVR-Board, mit nem Poti drauf. Das ist ein Einheitenloser Wert. 1024 bekommst du wenn am ADC-Eingang eine Spannung anliegt, die der Referenzspannung entspricht. Dies sind aber Grundlagen eines ADC und das wird auch hier im Tutorial beschrieben. Wieso also glaube ich dir grade nicht, dass du die Tutorials dir angeschaut hast wie du es im Eröffnungspost geschrieben hast?
Fabian K. schrieb: > Eine Frage noch: Ich bekomme Werte bis 995, was ist das füer eine > Einheit? mV? Nein. 995 von 1024 Digitalstufen (bei 10-Bit ADC). 1024 Stufen entsprechen deiner Referenzspannung. Die Umrechnung Digitalstufen nach V oder mV bei gegebener Bitzahl des ADC und Referenzspannung ist im Tutorial zum ADC erklärt.
Der ATmega32 hat einen 10-bit ADC, kann also zwischen 1024 verschiedenen Spannungsstufen unterscheiden. Das heißt allerdings, dass er Werte zwischen 0 und 1023 ausgibt, nicht bis 1024!
Nils schrieb: > Das heißt allerdings, dass er Werte zwischen 0 und 1023 ausgibt, nicht > bis 1024! Stimmt, aber auch das steht ja hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29
Ich wollte nur die Aussagen von Stefan und dir richtig stellen, dass der ADC 1024 ausgeben kann.
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.