Forum: Compiler & IDEs Warum wandelt mein AD-Wandler nur 1x


von MidasX (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Steige gerade mit WinAVR ein und bin noch Anfänger
Ich will mit einem ATMega16 den AD-Wandler lesen und auf  Port den
Low-Wert ausgeben. Mit Assembler habe ich das erreicht nur mit C
nicht.

Er wandelt nur 1x. Jedesmal wenn ich den Controller resete zeigt er den
aktuellen Wert an.


Gruss


MidasX

von Alex (Gast)


Lesenswert?

ADSC steht für single conversion ...

Entweder du stößt ständig neue Wandlungen an oder du benutzt den
Free-Running Mode.

von Rolf Magnus (Gast)


Lesenswert?

ADSC steht nicht für "single conversion", sondern für "start
conversion".

Auch im "free running mode" muß die erste Konvertierung per ADSC
angestoßen werden.

@MidasX: Warum hast du den ADC-Interrupt eingeschaltet? Du hast keinen
Handler dafür definiert.

von Alex (Gast)


Lesenswert?

OK, da hast du recht.

Allerdings aktiviert man den Interrupt via ADIE, er setzt
unsinnigerweise lediglich das Flag.

Abgesehen davon fehlt das sei(), welches erst für kurioses Verhalten
sorgen würde. Sonst würde nichts passieren.

von Rolf Magnus (Gast)


Lesenswert?

> Allerdings aktiviert man den Interrupt via ADIE, er setzt
> unsinnigerweise lediglich das Flag.

Auch nicht ganz. Eigentlich löscht er das Flag ("Alternatively, ADIF
is cleared by writing a logical one to the flag").

> Abgesehen davon fehlt das sei(), welches erst für kurioses
> Verhalten sorgen würde.

Och, was heißt "kurioses Verhalten"? Wenn keine ISR definiert ist,
wird per Default das Programm von vorne gestartet.Es würde dann
zufälligerweise das machen, was MidasX wollte, nämlich immer wieder
neue Konvertierungen starten.

von Alex (Gast)


Lesenswert?

Da ADIF allerdings nach einem Reset per default gelöscht ist, setzt er
das Flag.

Genug der Haarspalterei?

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


Lesenswert?

> Da ADIF allerdings nach einem Reset per default gelöscht ist, setzt
> er das Flag.

Nein, ADIF ist eins von den Flags, die man nicht selbst setzen kann
(das kann nur die Hardware), und die durch Schreiben einer 1 gelöscht
werden.

von MidasX (Gast)


Lesenswert?

Hallo

Zuerste mal danke für die vielen Antworten.

Aber ein bisschen überfordert bin ich nun schon.
Ich habe nun den Code geändert.
Das Programm läuft jetzt.
Ist dan nun richtig oder kann man es besser machen.
Free Running will ich nicht machen.


Gruss

MidasX

while (1)
  {


    //Warten bis die AD-Wandlung abgeschloßen ist
    //while(!(ADCSRA & (1<<ADIF)));
    ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF);
    while(!(ADCSRA & (1<<ADIF)));


    //AD-Wert auslesen
    //buffer = (ADCH<<8) | ADCL;

    ValLo = ADCL;
    ValHi = ADCH;

    //buffer = buffer / 4;
    //ValLo  = buffer;

    PORTB = ValLo;
  }

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.