Hi, Ich weiß es gibt schon unmengen an Beiträgen zu Problemen mit dem ADC, aber ich konnte den ganzen Mittag keine Lösung finden. Ich benutze das STK500-Kit von Atmel und einen ATMEGA32. Ich habe an Port A ein 5-k Poti zwischen VCC (5V) und GND gelegt und die eingeregelte Spannung auf PA0. _ GND----/ \ | |----PAO VCC----\___/ Den ADC betreibe ich mit 5V Referenzspannung die über AREF des Boards am µC anliegt. Die Werte werden left adjusted ausgegeben und ich möchte über ADCH den 8bit Wert auslesen und über PORTB auf die LEDs des Boards legen. Leider wird egal wie das Poti eingestellt ist der Wert 0 auf Port B gelegt (nach verstellen des Potis führe ich einen Reset aus...). C Code liegt bei. Was für einen Anfängerfehler habe ich begangen, bzw kann mir wer helfen? Liebe Grüße joba
Joba wrote: > Den ADC betreibe ich mit 5V Referenzspannung die über AREF des Boards am > µC anliegt. Das ist schonmal Käse. AVCC kann intern als Referenz ausgewählt werden. An AREF kommt nur ein kleiner Kondensator gegen Masse. Eine Spannung wird grundsätzlich nur dann an AREF angelegt, wenn eine Referenz verwendet werden soll, die der µC intern nicht zur Verfügung stellen kann. > Die Werte werden left adjusted ausgegeben und ich möchte > über ADCH den 8bit Wert auslesen und über PORTB auf die LEDs des Boards > legen. Dem steht nichts im Wege... > Leider wird egal wie das Poti eingestellt ist der Wert 0 auf Port > B gelegt (nach verstellen des Potis führe ich einen Reset aus...). Kommt überhaupt was raus? Sollte mich wundern. Schließlich löschst Du mit dieser Zeile
1 | ADCSRA = (1<<ADSC); |
alle Einstellungen im ADCSRA, die Du vorher gemacht hast. Du schaltest
damit den kompletten ADC ab. Da dürfte sich normalerweise gar nichts
tun. Wenn am Port nichts ankommt, dann liegt das nicht daran, dass der
ADC 0 ausgibt, sondern daran, dass er überhaupt nicht arbeitet.
> C Code liegt bei.
Und warum als .txt und nicht als .c-Datei?
while ( ADCSRA & (1<<ADSC)) //Auf Abschluss warten { ; } ich glaube, das ding wird wegoptimiert. mach mal irgend etwas läuffähiges rein in der while-dings-bums.
Danke Johannes! Natürlich lag es an dieser Zeile
1 | ADCSRA = (1<<ADSC); |
Muss natürlich
1 | ADCSRA |= (1<<ADSC); |
heißen. Bin ich seit heut Mittag um 1 nicht drauf gekommen. naja... Der Rest passt alles. ich weiß, dass ich AREF nicht verwenden müsste. Aber ich wollte es gleich mit Ausprobieren. .txt und nicht .c war ein versehen
roboterbastler wrote: > while ( ADCSRA & (1<<ADSC)) //Auf Abschluss warten > { > ; > } > > ich glaube, das ding wird wegoptimiert. mach mal irgend etwas > läuffähiges rein in der while-dings-bums. Nö. Das darf gar nicht wegoptimiert werden, weil alle I/O-Register (und dazu zählt auch ADCSRA) volatile sind.
Misra meckerts auf jeden fall an wenn nichts in deinen {} hast ;) Wegoptimieren darf es dir der Compiler nicht da wie schon genannt IOs volatile sind. Würde da aber noch ein Nop reinsetzen und gut. Dann bist dir da sicher :)
Johannes M. wrote: >> Den ADC betreibe ich mit 5V Referenzspannung die über AREF des Boards am >> µC anliegt. > Das ist schonmal Käse. Nö, für den STK500 ist das normal. Sonst musst du aufpassen, dass du den AREF-Jumper noch rausziehst, weil die interne Referenz am AREF-Pin rausgeführt wird und dort mit der STK500-eigenen Varef kollidiert.
Manuel Kauf wrote:
> Würde da aber noch ein Nop reinsetzen und gut.
Das ist Quatsch. Ein Befehl mehr, den keiner braucht und der für
nichts gut ist.
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.