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
ADSC steht für single conversion ... Entweder du stößt ständig neue Wandlungen an oder du benutzt den Free-Running Mode.
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.
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.
> 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.
Da ADIF allerdings nach einem Reset per default gelöscht ist, setzt er das Flag. Genug der Haarspalterei?
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.