AVR: Testschaltung mit ADC funktioniert nicht

OP #3132078
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
OP #3132093
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!
OP #3132136
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!
OP #3132145
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...
OP #3132160
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!?
OP #3132194
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...
OP #3133533
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.
OP #3133563
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!
Persönliche Seite #3133600
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren