Binäres UND oder logisches UND

OP #660163
Lesenswert?

Hallo Leute,
ich habe ein kleines Verständnis Problem.
Ich Frage das 6.Bit von meinem Port ab. Ist dieses gesetzt und die Zeit 
ist noch nicht überschritten mache irgendwas.
Ist doch eigentlich eine Logische Verknüpfung? Wie dies hier :

while((DATA == 64) && (Abbruch <= 2500))

Aber warum um alles in der Welt funktioniert das nur wenn ich die Zeit 
extrem hoch ansetze? 2500 entsprechen rund 2Sekunden.

Wenn ich das binär verknüpfe dann läuft es perfekt, aber warum?

while((DATA == 64)& (Abbruch <= 2500))

Ich bin gerade völlig überfragt!

Danke.
#660165
Lesenswert?

> while((DATA == 64) && (Abbruch <= 2500))

prüft nicht, ob das Bit 2**6 gesetzt ist, sondern ob DATA == 64 ist. Es 
werden alle Bits in die Prüfung einbezogen.

Wenn du nur das Bit 64 testen willst, dann mußt du

   while((DATA & 64) && (Abbruch <= 2500))

schreiben.
#660166
Lesenswert?

Das sollte in dem Fall eigentlich überhaupt keinen Unterschied machen, 
weil die beiden Ausdrücke in den Klammern jeweils einen Wahrheitswert 
zurückgeben. Und ob man den jetzt logisch oder bitweise verundet sollte 
eigentlich fast egal sein (zwei Einsen bitweise miteinander verknüpft 
geben auch ne Eins zurück).

Was für Datentypen sind das überhaupt?

EDIT:
Ansonsten gilt natürlich das, was Uhu anspricht...
#660169
Lesenswert?

Msp 430_crew wrote:

> Ich Frage das 6.Bit von meinem Port ab.
...
> while((DATA == 64)

Nein, genau das machst Du nicht !

Falls DATA 8-bittig ist, fragst Du alle 8 Bit ab, ob sie 0100.0000 sind 
und nichts anderes.


Kann sein, daß der andere Ausdruck ne etwas andere Laufzeit erzeugt und 
damit der erste Test übersprungen wird und der Wert schon 0100.0001 ist, 
also wieder ungleich.

0011.1111 - Test
0100.0000 - CPU gerade busy
0100.0001 - nächster Test: immer noch falsch


Peter
#660177
Lesenswert?

Ernst Bachmann wrote:

> Ist nicht egal, der compiler darf
>
> if (a!=b)
>
> als
>
> if (a-b)
>
> implementieren,

Darf er nicht, das ist Mumpitz.

Er darf für "wahr" immer nur 1 liefern !

Selber muß er aber alle Werte !=0 als wahr auswerten.

Also:
1
c = a != b; // c = 0 oder 1
aber:
1
c = a - b; // c = irgendwas


Er kann natürlich optimieren, wenn der logische Wert nur als 
Sprungbedingung ausgewertet wird und keine Zuweisung erfolgt.

Edit:
Da hab ich mir also selber widersprochen.

Beim if darf er das, sonst nicht.


Peter
OP #660184
Lesenswert?

Sorry ich hab mich falsch ausgedrückt. Also ich definiere Data so, dass 
ich mir das 7.Bit also PORT 1.6 in Data speichere.

Wenn ich das Binäre UND nehme dann geht es, beim logischen nicht.
1
 
2
#define DATA  (P1IN & BIT6)   //Port 1.6 kann nur 1 oder 0 sein
3

4
while((DATA == 64)& (Abbruch <= 2000))//funzt
5
{Abbruch++  //Zählvariable
6
}
7
while((DATA == 64)&& (Abbruch <= 2000))//funzt nicht
8
{Abbruch++  //Zählvariable
9
}

SORRY für meinen erste FALSCHANGABE

Danke für Eure Hilfe
OP #660218
Lesenswert?

Johannes M. wrote:
> Wie wäre es denn, wenn Du endlich mal damit herausrückst, was für
> Datentypen das sein sollen. Und wie "BIT6" definiert ist. Außerdem ist
> unter der Voraussetzung, dass DATA sowieso nur 0 oder 64 sein kann, die
> Abfrage "==64" überflüssig.

Ach man, ich meinte natürlich das ACK meines Sensors kommt soll die 
Datenleitung auf LOW gezogen werden. Die Datenleitung ist an PORT 1.6.

Er soll solange in der while Schleife bleiben, wie noch kein ACK 
gekommen ist.

Abbruch ist ein usigned int und BIT6 = 0x0040.
Ich möchte doch nur das 7.Bit aus meinem Register P1IN Register 
auslesen. Wenn dieses von HIGH auf LOW wechselt möchte ich die Schleife 
verlassen

Ist dies nicht der Fall, so soll die Zeitbedingung greifen.

Normaler weise überprüfe ich doch ob der das BIT gesetzt ist -> also ob 
der linke Part wahr ist. Wenn dies der Fall ist und die Zeit noch 
kleiner als 2500 ist, also wahr ist soll er in der Schleife bleiben.

Hab mich wieder falsch ausgedrückt ...Sorry

Patti
Gast #660253
Lesenswert?

> Aber warum um alles in der Welt funktioniert das nur wenn ich die
> Zeit extrem hoch ansetze? 2500 entsprechen rund 2Sekunden.

Was passiert denn, wenn du eine kleine Zeit ansetzt? Wartezeit null, zu
kurz, zu lang, endlos, Crash?

> while((DATA == 64)& (Abbruch <= 2000))//funzt
> {Abbruch++  //Zählvariable

Jetzt erfahren wir endlich, wo Abbruch hochgezählt wird, nämlich in
der Schleife. Wieso hast du das nicht gleich gepostet? Wenn in deiner
Abfrage die Symbole 'DATA' und 'Abbruch' vorkommen, ist für die
Rätselrater unter uns alles interessant, was mit diesen Symbolen
irgendetwas zu tun hat. Insbesondere folgendes:

- Von welchem Datentyp sind sie, oder sind es Makros?
- Wenn es Variablen sind: Was ist ihr Gültigkeitsbereich? Sind sie
  statisch oder automatisch?
- Wo, wann und wie werden sie initialisiert?
- Wo, wann und wie werden sie geändert?

Die meisten dieser Fragen werden beantwortet, wenn du ein ausreichend
großes Stück von deinem Code postest.

Jetzt wäre es vor allem noch folgende Dinge von Interesse:

- Wird 'Abbruch' außer in der While-Schleife noch woanders verändert,
  bspw. in einer Interruptroutine?

- Was steht sonst noch alles in der Schleife? Je nach Schleifeninhalt
  können 2500 (oder eine andere Anzahl) Durchläufe mal schnell oder
  mal langsam abgearbeitet werden.

- Und jetzt die alles entscheidende Frage: Wo und wie wird 'Abbruch'
  initialisiert? Vielleicht überhaupt nicht? Oder nur ein einziges Mal
  im ganzen Programm?
OP #660309
Lesenswert?

Also bei einer längeren Zeit schafft er es die Schleife zu verlassen. 
Abbruch wird in der Funktion zum Anfang deklariert.

Es scheint nur an dem && Operator zu liegen. Aber das ist mir nich klar.

x == 10 && y==11 ist wahr wenn x=10 und Y=11 aber x==10 & y==11  wäre 
doch sogar der selbe Fall ind der Konstallation?

Wenn die Funktion genau umgedreht wär, wäre mir das klar.
Gast #660317
Lesenswert?

> Abbruch wird in der Funktion zum Anfang deklariert.

Wird sie auch irgendwo vor der Schleife auf 0 gesetzt?

> Es scheint nur an dem && Operator zu liegen.

Soviel kann ich dir sagen: Der &&-Operator ist nicht der eigentliche
Fehler in deinem Programm. Er könnte höchstens der Auslöser der von
dir beschriebenen Symptome sein, die aber letztendlich von einem
Fehler an ganz anderer Stelle verursacht werden.

Aber poste doch mal die komplette Funktion, die die Schleife enthält.
Das führt sicher viel schneller zum Ziel als dieses Frage-und-Antwort-
Spiel, das wir hier gerade praktizieren :-)

Oder steckt in deinem Code so viel hochgeistiges Eigentum, dass du ihn
nicht herausrücken kannst?

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