AVR: Testschaltung mit ADC funktioniert nicht

OP #3132078
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
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!
Gast
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
Persönliche Seite
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
OP
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
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
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!?
Persönliche Seite
@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.
OP
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.