Forum: Mikrocontroller und Digitale Elektronik C Code frage


von Bergie B. (bergie)


Lesenswert?

Moin moin!

Ich komme gerade nicht drauf, und bevor ich mist progge wollte ich 
nochmal nachfragen.

 while ((EadcBUSY & UCBUSY)==0x01)

ist doch genau das gleiche wie

 while (EadcBUSY & UCBUSY);



oder stimmt das nur wenn UCBUSY==0x01 ?

LG

von Karl H. (kbuchegg)


Lesenswert?

Bergie B. schrieb:
> Moin moin!
>
> Ich komme gerade nicht drauf, und bevor ich mist progge wollte ich
> nochmal nachfragen.
>
>  while ((EadcBUSY & UCBUSY)==0x01)
>
> ist doch genau das gleiche wie
>
>  while (EadcBUSY & UCBUSY);
>
>
>
> oder stimmt das nur wenn UCBUSY==0x01 ?

Wenn UCBUSY nicht 0x01 ist, dann wird das Ergebnis der UND Verknüpfung 
niemals 0x01 sein können. In diesem Sinne wird bei der ersten Variante 
von einer impliziten Annahme ausgegangen. Und das kann ins Auge gehen.
(Vorausgesetzt, UCBUSY ist eine Maske, mit der genau 1 Bit und nicht 
mehr extahiert werden soll. Aber davon gehe ich mal aus)

Daher ist es besser nicht auf explizit 0x01 abzufragen, sondern entweder

   while ((EadcBUSY & UCBUSY) != 0)

oder

   while ((EadcBUSY & UCBUSY) == UCBUSY)

Aber gerade bei Vergleichen ist man des öfteren in der paradoxen 
Situation, dass Tipp-Faulheit belohnt wird.

    while (EadcBUSY & UCBUSY);

macht genau dasselbe

von Gast (Gast)


Lesenswert?

Es ist nicht das Gleiche.

Zum Testen eines Bits schreibt man eigendlich:

while ((EadcBUSY & UCBUSY) != 0)

Verkürzen kann man das als:

while (EadcBUSY & UCBUSY)

von Philipp (Gast)


Lesenswert?

Nein, denn ...

while ((0xF8 & 0xF8)==0x01) -> FALSE

while (0xF8 & 0xF8); -> 0xF8 -> "TRUE"


Philipp

von Uhu U. (uhu)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn UCBUSY nicht 0x01 ist, dann wird das Ergebnis der UND Verknüpfung
> niemals 0x01 sein können.

Doch, z.B. wenn UCBUSY == 3 und EadcBUSY == 1

von Karl H. (kbuchegg)


Lesenswert?

Uhu Uhuhu schrieb:
> Karl heinz Buchegger schrieb:
>> Wenn UCBUSY nicht 0x01 ist, dann wird das Ergebnis der UND Verknüpfung
>> niemals 0x01 sein können.
>
> Doch, z.B. wenn UCBUSY == 3 und EadcBUSY == 1

Ja, du hast recht. Hatte die Antwort dahingehend schon korrigiert.

von Bergie B. (bergie)


Lesenswert?

Danke euch allen für eure mühen mir etwas bei zu bringen!

Werde nun die Kurze Variante versuchen.


while ((EadcBUSY & UCBUSY) != 0)
{
//warten
}

while (EadcBUSY & UCBUSY);

wobei ich bei dieser Variante jedes BIT testen kann egal ob mein UCBUSY 
nun eine
0x01 == 00000001b
ist oder
0x03 == 00000010b

und wenn ich in der Schleife warten möchte bis das BIT1 wird würde ich:

while (!(EadcBUSY & UCBUSY));

benutzen?

von Johnny B. (johnnyb)


Lesenswert?

Ja genau.

von Bernhard M. (boregard)


Lesenswert?

Und wenn UCBUSY == 3 und EadcBUSY == 5??

Solange nicht klar ist, daß das eine davon eine Maske mit genau einem 
gesetztem Bit ist....

von Bergie B. (bergie)


Lesenswert?

UCBUSY ist bei mir eine Maske mit genau nur einem gesetzten BIT

Also kann es die HEX Werte:
0x0001,
0x0002,
0x0004,
0x0008,
0x0010,
0x0020,
0x0040,
0x0080,

haben.




D a n k e

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.