while Bedingung (und oder) ist vertauscht

Hallo miteinander,

Ich sitze immer noch dran an meinen Motoren Steuerung.
Ich komme eigentlich auch ganz gut voran :-).

Leider macht mir eine while Schleife etwas Kopf zerbrechen.

Was möchte ich machen:
Ich habe zwei Schalter wenn einer oder beide
auslösen möchte ich das die Schleife verlassen wird.

Das ist mein Code dazu:

while(digitalRead(Achse_Z_Endstop_1) == 0 || digitalRead(Achse_Z_Endstop_2) == 0)
{ Achse_Z.move(-1); Achse_Z.run(); }

Jetzt ist es aber so das beide Schalter ausgelöst haben müssen das die Schleife verlassen wird.

Wenn ich den Code so schreibe:

while(digitalRead(Achse_Z_Endstop_1) == 0 and digitalRead(Achse_Z_Endstop_2) == 0)
{ Achse_Z.move(-1); Achse_Z.run(); }

dann reicht es wenn einer der Schalter auslöst.

Bin ich irgend wie auf dem Falschen Dampfer gelandet und || bzw. and haben andere Bedeutungen als die die ich im Kopf habe?

kann mir da jemand etwas Hilfestellung geben?

Gruß Mücke

Probier mal &&
Wüsste jetzt nicht, was der in “and” reininterpretiert :confused:

Ok, das mache ich gleich mal, das merkwürdige ist jedoch das die oder || Verknüpfung auch falsch herum ist, denn die verhält sich wie eine Und Verknüpfung.

Die Standard Operatoren tun genau das was sie sollen.
Eine vollständige Beschreibung der Standard Operatoren findest du in jedem beliebigen C/C++ Buch.
Es gibt auch genügend Online Tutorials, welche dir diese Information liefern könnten.

DerLehmi:
Probier mal &&
Wüsste jetzt nicht, was der in "and" reininterpretiert :confused:

habe es gerade getestet, macht leider keinen unterschiedet.

ich möchte das egal welcher der beiden Schalter auslöst das die Schleife verlassen wird.

Warum ist das bei mir mit dem || && in der Bedeutung vertauscht?

Ich stehe echt auf dem Schlauch.

combie:
Die Standard Operatoren tun genau das was sie sollen.
Eine vollständige Beschreibung der Standard Operatoren findest du in jedem beliebigen C/C++ Buch.
Es gibt auch genügend Online Tutorials, welche dir diese Information liefern könnten.

Standard Operatoren

|| oder
&& und

soweit Richtig? oder liege ich da Falsch?

Man kann anstelle || auch or schreiben
Man kann anstelle && auch and schreiben.

Soweit Richtig?

while(Bedingung)
{ mein Code }

Solange die Bedingung Wahr ist wird der Code in der {} ausgeführt?

Soweit Richtig?

while (digitalRead(Achse_Z_Endstop_1) == 0 ) 
{ mein Code }

Es wird geprüft ob mein Taster das Signal 0 Liefert, wenn Nein wird die Schleife verlassen.

Wenn ich nun zwei Taster habe und möchte das egal welcher Taster auslöst die Schleife verlassen wird dann
muss ich beide Taster mit einer Oder Operator verbinden? oder habe ich das Falsch verstanden?

Somit müsste das dann so ausschauen

while ( (digitalRead(Achse_Z_Endstop_1) == 0) || (digitalRead(Achse_Z_Endstop_2) == 0) ) 
{ mein Code }

wenn ich jetzt das Programm laufen lasse, müssen beide Taster zur selben zeit ausgelöst sein, das die Bedingung verlassen wird.

Was habe ich da nicht verstanden?

ps. ich lese auch C++ sachen im Internet nach. z.B. C++-Programmierung: Kontrollstrukturen – Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

while-Schleife

Die for-Schleife ist ein sehr flexibles Sprachkonstrukt. Theoretisch könnte man in C++ alle Schleifen auf diese Weise formulieren. Aber um die Programmierung zu vereinfachen und die Programme besser lesbar zu machen, gibt es in C++ noch zwei weitere Schleifenarten. Die while-Schleife hat eine einfache Syntax und lediglich eine Schleifenbedingung.

while (bedingung)
{
//Anweisungen
}

Solange die Bedingung wahr ist, wird der Anweisungsblock in den geschweiften Klammern ausgeführt. Sobald die Bedingung falsch ist, fährt das Programm nach der while-Schleife fort.

Fall ||:
er führt solange die Schleife aus, wie 0 oder 1 Taster gedrückt ist. Erst bei 2 Tastern geht er raus.

Fall &&:
er führt solange die Schleife aus, wie kein Taster gedrückt ist. Bei 1 oder 2 Taster geht er raus.

Übersetze Deine ausgelesenen Taster mal mit true oder false, das macht die Geschichte verständlicher :wink:

@DerLehmi, sorry ich kann dir gerade nicht folgen.

Fall 1:

while(Taster_1 == 0 )
{ Bedingung ist wahr; }
nach dem Abbruch;

Wie ich das interpretiere:

Wenn Taster_1 gleich 0 ist dann mache: { Bedingung ist wahr; }
Wenn Taster_1 nicht 0 ist dann mache: nach dem Abbruch;

Fall 2:

while(Taster_1 == 0 || Taster_1 == 0 )
{ Bedingung ist wahr; }
nach dem Abbruch;

Wie ich das interpretiere:

Wenn Taster_1 gleich 0 ist oder Wenn Taster_2 gleich 0 ist dann mache: { Bedingung ist wahr; }

Ach man, das ist doch sch.... ich traue mich das gar nicht zu ende zu schreiben, ich habe verstanden was du mir sagen möchtest.

ARRRRRRR.......

die Vollständige Bedingung muss erfüllt sein und nicht nur ein teil der Bedingung. Arrrrr.....
Das ist manchmal dermaßen verwindend.

Danke euch, jetzt kann ich weiter machen und bin mir auch sicher das ich keinen sch... gebaut habe, hatte schon angst das ich irgend was gemacht habe das alles auf den Kopf gestellt hat.

DANKE, euch.

Gruß Mücke

Was habe ich da nicht verstanden?

Ich weiß nicht wo dein Problem ist!

Auch weiß ich nicht, ob ein betätigter Schalter jetzt true oder false liefert.
Aus deinen Texten kann ich das nicht eindeutig entnehmen.

Ich nehme jetzt mal an:
1: Dass ein betätigter Taster false liefert
2: Dass die Schleife beendet werden soll, wenn einer der Taster betätigt wird

while (digitalRead(Achse_Z_Endstop_1) && digitalRead(Achse_Z_Endstop_2)) 
{
 // tueWas, weil (noch) kein Taster betätigt wurde 
}
// hier kommts erst an, wenn mindestens 1 Taster betätigt wurde

Wichtig für dich und deine Logik:
Doppelte Verneinung
Ich hoffe, dass ich damit deine Verwirrung optimieren kann.

:slight_smile: ich habe jeden Taster als Separate Bedingung betrachtet, und habe das im Kopf mir so zusammen gebaut das wenn eine der Bedingungen nicht erfüllt ist das dann abgebrochen wird.

Dem ist aber nicht so, denn es ist nur ein Bedingung, daher muss der zustand von beiden Tastern betrachtet werden, wie im Beitrag oben schon angedeutet von mir.

ich stehe nun mal Oft auf dem Schlauch. Sorry.

Gruß Mücke

ps. ja ihr habt mir gut geholfen, ich habe schon wider an mir gezweifelt, das konntet Ihr mir aber nehmen, und ich habe die Logik dahinter verstanden. Hoffe ich.

Du bist nicht der einzige, welchem die Boolesche Algebra (anfangs) Probleme bereitet.
Da muss jeder Programmierer, egal ob Profi oder Hobby, durch.
Und auch im echten Leben, ist ein tieferes Verständnis manchmal sehr hilfreich.
(auch wenn längst nicht alles einen Boolean Charakter hat)

combie:
Und auch im echten Leben, ist ein tieferes Verständnis manchmal sehr hilfreich.
(auch wenn längst nicht alles einen Boolean Charakter hat)

Wobei umgangssprachlich UND oft eher die Bedeutung von ODER hat und ODER von XOR.

Gruß Tommy