mikrocontroller.net

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


Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
c = a != b; // c = 0 oder 1
aber:
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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht 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.
 
#define DATA  (P1IN & BIT6)   //Port 1.6 kann nur 1 oder 0 sein

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

SORRY für meinen erste FALSCHANGABE

Danke für Eure Hilfe

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funzt bei mit auch nicht: Syntaxfehler.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.