Forum: Mikrocontroller und Digitale Elektronik AVR ADC - Merkwürdiges verhalten


von Björn (Gast)


Lesenswert?

Hallo,

ich habe zur Zeit ein Problem mit einem Mega128-A und dessen ADC.

Kurz zum Aufbau:

Vcc, Vcc, AVcc -> 5V
Gnd's -> Gnd
Aref -> 100nF -> Gnd

Dann habe einen 10k Poti an ADC0 angeschlossen.


Laut Multimeter kann ich linear 0V bis 4.5V einstellen.
Wenn ich das ganze jetzt auf den Mega128 loslasse bekomme ich sehr 
merkwürdige ergebnisse.

Ich kann ziemlich weit drehen, bis ich auf einen (10-bit) ADC wert von 
40 komme. Dabei liegen bereits 4.27V an ADC0 an. Wenn ich nur einen 
hauch weiter drehe, stehe ich bei einem ADC Wert von 900 bei 4.4V.


Da kann ja irgendwas nicht richtig laufen.

Hier ein Auszug aus meinem Quellcode:

1
function ADCRead(channel: byte): word;
2
begin
3
  // AVCC benutzen 7:6
4
  // Right Adjust  5
5
  // Channel       4:0
6
  ADMUX := %01000000 or (%00011111 and channel);
7
  
8
  // Aktivieren       7
9
  // Start Conversion 6
10
  // Free running     5
11
  // Interupt         4:3
12
  // Prescaler (128)  2:0
13
  ADCSRA := %11000111;
14
15
  // Initialberechnung
16
  while ADSC_bit = 1 do
17
    nop;
18
19
  // Wert berechnen lassen
20
  ADSC_bit := 1;
21
  while ADSC_bit = 1 do
22
    nop;
23
24
  // Wert lesen. ADCL zuerst!
25
  lo(Result) := ADCL;
26
  hi(Result) := ADCH;
27
  
28
  // ADC deaktivieren
29
  ADCSRA := 0;
30
end;

Hat jemand von euch vllt eine Idee, was da schief läuft?

von Uwe (de0508)


Lesenswert?

He das ist doch Pascal ?

wie heißt der compiler ?

von Björn (Gast)


Lesenswert?

Mikropascal von MikroElektronika

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Für mich bedeutet das, das der Compiler hi und lo nicht richtig 
zusammensetzt. Probier doch mal
Result := 256 * ADCH + ADCL;
Evtl. musst du eine temporäre Variable einführen, um die Lesereihenfolge 
des ADC zu wahren.

von Björn (Gast)


Lesenswert?

Ne, das zusammensetzen klappt in anderen Programmteilen (schieberegister 
etc.) wunderbar.

Ausserdem bekomme ich bei kleinem Widerstand ja auch ein korrektes 
ergebnis.

von Björn (Gast)


Lesenswert?

Jo - Fail


Ich hatte PortF0 als Ausgang definiert und nicht als Eingang.
Deswegen hat der Pullup-Widerstand wohl als Spannungsteiler fungiert.

Jetzt funktioniert es -.-'

von Karl H. (kbuchegg)


Lesenswert?

> Dann habe einen 10k Poti an ADC0 angeschlossen.

Wie hast du das angeschlossen?

> Laut Multimeter kann ich linear 0V bis 4.5V einstellen.

Macht mich stutzig.
Wenn deine Vcc 5V ist und du dein Poti so wie es sein soll als 
Spannungsteiler verschaltet hast, dann muss sich die Spannung von einer 
Potiendstellung zur anderen von 0V bis 5V verändern lassen.

Also: Wie hast du dein Poti verschaltet?

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.