Warum wandelt mein AD-Wandler nur 1x

Gast #238018
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
Angehängte Dateien:
Gast #238020
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.
Gast #238021
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.
Gast #238022
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.
Gast #238025
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;
  }

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