Forum: Compiler & IDEs ADC mit STK500-Kit


von Joba (Gast)


Angehängte Dateien:

Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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?

von roboterbastler (Gast)


Lesenswert?

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.

von Joba (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Manuel K. (mkauf)


Lesenswert?

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 
:)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.