Forum: Mikrocontroller und Digitale Elektronik Binäres UND oder logisches UND


von Msp 4. (msp430_crew)


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.

von Uhu U. (uhu)


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.

von Johannes M. (johnny-m)


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...

von Εrnst B. (ernst)


Lesenswert?

Da brauchen mir mehr code...

Erste Ideen:

Vielleicht "while((DATA = 64)& (Abbruch <= 2500))" geschrieben?
Evtl Abbruch nicht volatile, und wird in der Schleife nur von einem IRQ 
verändert?

von Peter D. (peda)


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

von Εrnst B. (ernst)


Lesenswert?

@johnny:

Ist nicht egal, der compiler darf

if (a!=b)

als

if (a-b)

implementieren,

und

if ((a-b) & 0x01)

ist was ganz anderes als

if ((a-b) && 0x01)

/Ernst

von Johannes M. (johnny-m)


Lesenswert?

Ernst Bachmann wrote:
> @johnny:
>
> Ist nicht egal, der compiler darf
>
> if (a!=b)
>
> als
>
> if (a-b)
>
> implementieren,
Ah so. wieder was gelernt.

> und
>
> if ((a-b) & 0x01)
>
> ist was ganz anderes als
>
> if ((a-b) && 0x01)
Da hast Du wohl Recht...

von Peter D. (peda)


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

von Johannes M. (johnny-m)


Lesenswert?

Peter Dannegger wrote:
> Ernst Bachmann wrote:
>
>> Ist nicht egal, der compiler darf
>> [...]
>> implementieren,
>
> Darf er nicht, das ist Mumpitz.
Hmmm... Wat denn nu?

von Msp 4. (msp430_crew)


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

von Andreas K. (a-k)


Lesenswert?

Funzt bei mit auch nicht: Syntaxfehler.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Msp 4. (msp430_crew)


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

von yalu (Gast)


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?

von Msp 4. (msp430_crew)


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.

von yalu (Gast)


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?

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.