Forum: Mikrocontroller und Digitale Elektronik AVR: Testschaltung mit ADC funktioniert nicht


von J. W. (ontheway)


Lesenswert?

Hi,

ich bin absolut neu bei ADC und habe mir mit einem Breadboard was 
zusammengestöpselt. Ich habe den Atmega16, habe Port A als Ausgang und 
als Eingang für ADC (wenn das nicht schon Quark ist, sollte aber gehen).
An Pin 1 und 6 ist eine LED, an Pin 3 soll der AVC-Eingang sein.

Hier mein Code:

int main(void) {
  //DDRA = 0xFF;

  DDRA  |= (1 << DDA0) | (1 << DDA5);
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
  ADMUX = 0x04;
  ADMUX |= (1 << REFS0);

  uint16_t analogWert = 0;

    while(1)
    {
    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
    analogWert = ADCW;
    if (analogWert > 600) {
      PORTA |= (1 << PA5);
    }
    else if (analogWert > 300) {
      PORTA |= (1 << PA0);
    }
    ADCSRA &= ~(1 << ADEN);

    }
}

Da ich durch einen Drehpoti die Spannung zwischen 0 und 5 Volt regeln 
kann, dachte ich, da müsste ich doch jeden Wert zwischen 0 und 1023 
einpegeln können!? Daher die 300 und 600, nur mal testhalber. Nun hatte 
ich gedacht, da brennt unter 300 nichts, über 600 die LED an Pin 6 und 
dazwischen die LED an Pin 1...
das Verhalten ist wie folgt: Wenn ich das Netzsteil des Pollin-Board 
reinstecke, das mit dem Breadboard verbunden ist, sind alle LED aus, 
egal welchen Pegel ich eingestellt habe. Wenn ich Reset drücke, dann 
brennt immer die LED an Pin 1... niemals die andere Led und niemals 
keine!

Danke für Tipps!

LG
Jens

von holger (Gast)


Lesenswert?

ADCSRA &= ~(1 << ADEN);

Was machst du da wohl? Den AD Wandler abschalten?

von Steven (. (ovular) Benutzerseite


Lesenswert?

lass die Zeile weg.

ADCSRA &= ~(1 << ADEN);

von J. W. (ontheway)


Lesenswert?

Ja, okay, aber ich schalte ja ab, nachdem ich schon einmal gelesen 
habe... aber okay, habe ich weggelassen... geht trotzdem nicht, genau 
das gleiche. Ich möchte ja eigentlich erreichen, dass ich am Poti drehe, 
und dann die Leds umschalten... passiert nicht. Es ist wohl das Register 
nicht im erwarteten Wertebereich... ich habe das so ein bisschen 
übernommen aus AVR von Florian Schäffner, und ADMUX |= (1 << REFS0) 
müsste ja passen für interne Referenz.
Danke für weiteres!

von Spess53 (Gast)


Lesenswert?

Hi

>dass ich am Poti drehe, und dann die Leds umschalten... passiert nicht.

Dann solltest du auch eine Stelle einbauen an der die LEDs auch wieder 
ausgeschaltet werden.

MfG Spess

von Steven (. (ovular) Benutzerseite


Lesenswert?

veruschs mal mit

ADMUX = 0x03;
oder 0x02

Wo auch immer Du es angeschlossen hast.

und Spess hat recht. Du kannst auch den hier machen:
1
if (analogWert > 600) {
2
      PORTA = (PORTA&~(1 << PA5)) | (1 << PA5);
3
    }
4
    else if (analogWert > 300) {
5
      PORTA = (PORTA&~(1 << PA0)) | (1 << PA0);
6
    }

Edit: Fehler korrigiert

von Walter S. (avatar)


Lesenswert?

J. W. schrieb:
> an Pin 3 soll der AVC-Eingang sein

wenn du damit AVcc meinst ist das falsch,
und an welchem Pin ist das Poti angeschlossen

von Walter S. (avatar)


Lesenswert?

Steven () schrieb:
> PORTA = (PORTA&~(1 << PA5)) | (1 << PA5);

das lässt sich vereinfachen zu
PORTA = PORTA | (1 << PA5);

von J. W. (ontheway)


Lesenswert?

deshalb schreibe ich ja wie folgt:

    while(1)
    {
    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
    analogWert = ADCW;
    if (analogWert > 600) {
      PORTA |= (1 << PA5);
    }
    else if (analogWert > 300) {
      PORTA |= (1 << PA0);
    }
    else {
      PORTA &= ~(1 << PA0);
      PORTA &= ~(1 << PA5);
    }
    //ADCSRA &= ~(1 << ADEN);

    }

Ich habe außerdem die Abtastrate mal auf Minimum gesetzt:
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Das verhalten ist bizarr. Drehe ich jetzt am Poti, dann geht Led 1 
teilweise aus und nach 1 Sekunde oder so wieder an, aber die andere geht 
nie an!

von J. W. (ontheway)


Lesenswert?

Walter S. schrieb:
> J. W. schrieb:
>> an Pin 3 soll der AVC-Eingang sein
>
> wenn du damit AVcc meinst ist das falsch,
> und an welchem Pin ist das Poti angeschlossen

Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll, da ist das 
Poti dran, und AREF habe ich natürlich auf AVCC geschaltet (ohne 
Kondensatoren und so, kommt ja nicht auf Präzision an), wegen interner 
Referenzspannung... und das Poti habe ich als Laie mit einem Voltmeter 
vermessen, die Spannung geht von 0 bis +5, so wie es sich gehört...

von Walter S. (avatar)


Lesenswert?

zeigst du doch bitte bitte Mal die Schaltung?

von Walter S. (avatar)


Lesenswert?

J. W. schrieb:
> AREF habe ich natürlich auf AVCC geschaltet

obwohl im Datenblatt steht:
 external capacitor at AREF pin (und sonst nix!)

J. W. schrieb:
> Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll

Pin 3 ist PB2

von Steven (. (ovular) Benutzerseite


Lesenswert?

Walter S. schrieb:
> das lässt sich vereinfachen zu
> PORTA = PORTA | (1 << PA5);

Das geht leider nicht. Wenn Pin PA5 gesetzt ist bleibt er gesetzt.
Bzw. entspricht es nicht meinem Code...

von J. W. (ontheway)


Lesenswert?

Walter S. schrieb:
> J. W. schrieb:
>> AREF habe ich natürlich auf AVCC geschaltet
>
> obwohl im Datenblatt steht:
>  external capacitor at AREF pin (und sonst nix!)
>
> J. W. schrieb:
>> Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll
>
> Pin 3 ist PB2

Ja, sorry, natürlich meine ich die Belegung an J4 des Pollin-Board, die 
geht bei den Pins umgekehrt raus. Pin 40 des Prozessors ist da Pin 1 
etc. Das mit den Pins passt schon, ist ja nicht so, dass die Leds NICHT 
leuchten würden, das habe ich natürlich auf dem Breadboard schon längst 
getestet.

Und die Schaltung ist eine ganz einfache Spannungsteilerschaltung und 
einen Kondensator brauche ich nicht, habe ich hier gelesen, kann ich 
gerne mal raussuchen!?

von Steven (. (ovular) Benutzerseite


Lesenswert?

@J.W.
Aus deinem geschriebenen kann ich leider immernoch nicht herrauslesen ob 
Du überprüft hast, dass du wirklich den ADC4 also den 5.Portpin, welchen 
Du hier

>>ADMUX = 0x04;

eingestellt hast, auch als Eingang verwendest.

Wenn es tatsächlich PB2 ist also der 3. Pin, dann müsste man 2 in den 
MUX schreiben.

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:
> @J.W.
> Aus deinem geschriebenen kann ich leider immernoch nicht herrauslesen ob
> Du überprüft hast, dass du wirklich den ADC4 also den 5.Portpin, welchen
> Du hier
>
>>>ADMUX = 0x04;
>
> eingestellt hast, auch als Eingang verwendest.
>
> Wenn es tatsächlich PB2 ist also der 3. Pin, dann müsste man 2 in den
> MUX schreiben.

AUA! Habe ich auch gerade gesehen, natürlich, ich habe jetzt 0x02 
gesetzt, jetzt geht es auf Anhieb! wallbash
Danke... mal wieder echt peinlich...

von tobi (Gast)


Lesenswert?

oben hast gesagt: interenbe reefrebz.
DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest 
vielleicht diese Referenz.

von Steven (. (ovular) Benutzerseite


Lesenswert?

J. W. schrieb:
> Danke... mal wieder echt peinlich...

:) nicht so schlimm. Aber zukünfig öfters mal die Augen aufmachen ;)

von J. W. (ontheway)


Lesenswert?

tobi schrieb:
> oben hast gesagt: interenbe reefrebz.
> DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest
> vielleicht diese Referenz.

Hi Tobi,
danke, muss ich noch gerade machen, Du hast recht, ich habe einfach Aref 
mit VCC und NICHT AVCC verbunden! Hat Aref zwar bisweilen überlebt aber 
das mache ich mal lieber noch, ist ja eh nur eine Testschaltung, wäre 
aber schade um den Atmega16.

von J. W. (ontheway)


Lesenswert?

tobi schrieb:
> oben hast gesagt: interenbe reefrebz.
> DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest
> vielleicht diese Referenz.

also jetzt habe ich gerade mal beim Pollin-Board nachgeschaut, da geht 
doch AVCC und VCC an denselben Pins über den Flachbandstecker nach 
draußen! Hmmm, dann kann ich das mit dem Board ja so eh nicht anders 
machen... beim Board sind wohl am Kabel Pin 36, 38 und 40 AVCC UND 
VCC... das ist ja seltsam!

von Walter S. (avatar)


Lesenswert?

Walter S. schrieb:
> obwohl im Datenblatt steht:
>  external capacitor at AREF pin (und sonst nix!)

also auch nicht AVcc!!

von Steven (. (ovular) Benutzerseite


Lesenswert?

Moment,

AVCC ist die Versorgungsspannung des Analogteils im µC. In Deinen 
Anwendungsbereichen kannst du AVCC getrost mit VCC verbinden. AREF 
jedoch musst Du je nach dem was Du vorhast entsprechend deinem 
Registereintrag verbinden. Steht entsprechend im Datenblatt beim 
ADMUX...

Zudem liegt AVCC doch auch Pin 34 des Pfostensteckers oder hast Du ein 
anderes Pollinboard als ich?


Gruß Steven

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:

>
> Zudem liegt AVCC doch auch Pin 34 des Pfostensteckers oder hast Du ein
> anderes Pollinboard als ich?

Habe 2.0.1, da ist auf 34 bei J4 AREF, auf 36, 38 und 40 AVCC und VCC. 
Schau mal noch mal nach!

von J. W. (ontheway)


Lesenswert?

Habe gerade im Schaltplan geschaut, da ist AVCC und VCC verbunden.

von Steven (. (ovular) Benutzerseite


Lesenswert?

Ja jetzt, hab mich verguckt.

AVCC ist mit VCC verbunden. Aber das ist auch in Ordnung so.

Du sollst nur nicht, wenn du im ADMUX eine interne Referenz eingestellt 
hast, außen VCC bzw AVCC anlegen. Und mit außen ist AREF gemeint. Das 
ist was dir Walter und tobi zu sagen versuchen.


Gruß Steven

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.