Forum: Mikrocontroller und Digitale Elektronik ADC-Wandlung AVR Interrupt Flag Bit


von Peter (Gast)


Lesenswert?

Moin,

ich arbeite mich gerade in die A/D Wandlung ein und durch die vielen 
Code-Schnipsel läuft das ganze auch. (Single Conversation, keine 
Interrupts)

Aber an einer Stelle habe ich wohl den Hintergrund noch nicht ganz 
verstanden.
1
while (!(ADCSRA & (1 << ADIF)));  
2
ADCSRA |= (1 << ADIF);

Laut Datenblatt wird das IF-Flag gesetzt wenn die Wandlung fertig ist. 
Warum wird dann so lange gewartet bis ADIF auf 0 ist?

Das ausschalten des IF-Flags erfolgt durch setzten den Bits.. muss ich 
das so verstehen, dass 0 = gesetzt und 1 = nicht gesetzt bedeutet?


Grüße..

von Stefan E. (sternst)


Lesenswert?

Peter schrieb:
> Warum wird dann so lange gewartet bis ADIF auf 0 ist?

Wird es nicht.
"while !" = "solange gleich 0" = "bis ungleich 0"

Peter schrieb:
> Das ausschalten des IF-Flags erfolgt durch setzten den Bits.. muss ich
> das so verstehen, dass 0 = gesetzt und 1 = nicht gesetzt bedeutet?

Nein.

von Hmm (Gast)


Lesenswert?

>Single Conversation
Das reicht dann aber nicht für eine Beziehung.

von Peter (Gast)


Lesenswert?

Danke!

Ok, den Denkfehler mit der While Schleife habe ich verstanden, aber 
warum wird das Bit dann nocheinmal auf 1 gesetzt?
"ADIF is cleared by writing a logical one to the flag."

von Martin K. (maart)


Lesenswert?

Peter schrieb:
> aber
> warum wird das Bit dann nocheinmal auf 1 gesetzt?
> "ADIF is cleared by writing a logical one to the flag."

Die Begründung hast du doch schon hingeschrieben.
Das ist eben so eine Eigenart des Controllers.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Danke!
>
> Ok, den Denkfehler mit der While Schleife habe ich verstanden, aber
> warum wird das Bit dann nocheinmal auf 1 gesetzt?
> "ADIF is cleared by writing a logical one to the flag."

Genau aus dem Grund.
Weil eben derartige Interrupt Flags gelöscht werden, indem man sie mit 
einer 1 beschreibt.

Und wenn du statt dem ADIF Flag das ADSC Flag benutzen würdest, könntest 
du dir den ganzen Häck-Mäck sparen

AVR-GCC-Tutorial/Analoge Ein- und Ausgabe: Nutzung des ADC

Du setzt das ADSC Bit um den ADC zu starten und wenn der ADC fertig ist, 
zieht er es wieder auf 0 zurück. Fertig.

von Rolf Magnus (Gast)


Lesenswert?

Martin Kreiner schrieb:
> Das ist eben so eine Eigenart des Controllers.

Die gibt es nicht nur bei dem und hat auch ihren guten Grund.

von Peter (Gast)


Lesenswert?

Danke für die schnelle und ausführliche Lösung!

Die alternative, das nur über den ADSC durchzuführen werde ich dann das 
nächste mal Probieren, wenn ich ein Board zur Hand habe..


Schönen Samstag noch!

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.