Logische und / oder Abfrage

Hallo zusammen
freut mich das wir hier auch einen deutschen teil haben
das macht die sache hoffentlich einfacher.

folgende situation bereitet mir momentan kopfzerbrechen.

ich arbeite mit mehreren Arduino Mega 2560 über I2C Bus.

das programm funktioniert sehr gut.

aus einem arduino werden pins eingelesen im master wird verarbeitet andere arduinos geben die befehle an pin ausgänge weiter.

nur jetzt bekomme ich gerade graue haare die oder Abfrage funktioniert einfach nicht.

UND abfrage funktioniert perfekt auch mit vielen variabeln.
der unten genannte code: lese aus buffer variable E_SIGR_ASR5_HALT und E_SIGR_ASR3_HALT , wenn beide 1 sind dann setze ausgangs buffer Variabel A_SIGS_ASH4_HALT auf 1
getestet funktioniert in der anwendung.

Bsp:

if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) && HIGH==master_x.dio_get(E_SIGR_ASR3_HALT))
  {
   master_x.dio_set(A_SIGS_ASH4_HALT,HIGH);
  }

ODER abfrage leider gar nicht
Wenn ich jetzt statt und eine oder verknüpfung dann fangen die probleme an
nur wenn beide variablen 1 sind wird der ausgang gesetzt und sonst nicht. also macht auch in dem unten genannten beispiel der compiler ein und Gatter draus was nicht sein darf.

if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))
  {
   master_x.dio_set(A_SIGS_ASR4_HALT,HIGH);
  }

Hat jemand von euch schon mal so ein problem gehabt
weil ich hab momentan keine idee wo das problem liegt.

lg
Thomas

ich hab momentan keine idee wo das problem liegt.

Bis auf die falschePosition von "HIGH==" ich auch nicht.

Da HIGH das gleiche ist wie true und 1 kannst du das HIGH == einfach weglassen, wenn deine Methode dio_get nur true/false zurückliefert.

Wie mein Vorredner sagt, stimmt die Position von "HIGH==" nicht:
DIe richtige Schreibweise ist folgende:

Einfache Bedingung:
if (variable == HIGH) {
tue was
}

UND-Verknüpfung:
if (variableA == HIGH && variableB == HIGH) {
tue was
}
Kurzform:
if(variableA && variableB) {
tue was
}

ODER:
if (variable == HIGH || variableB == HIGH) {
tue was
}
Kurzform:
if(variableA || variableB) {
tue was
}

ja ich werde das testen ob das die ursache ist

bei der && Verknüpfung ist es egal

der hintergrund daran liegt einfach daran

variable == high -> abfrage
variable = high -> zuweisung

die überlegung war im code
somit kann ein programmierfehler im code erkannt werden.

High == variable -> abfrage
high = variable -> fehlermeldung des compilers.

auf alle fälle guter tip
wenns das wirklich ist geb ich ein bier aus :smiley:

Soll das nicht anstatt if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || master_x.dio_get(HIGH==E_SIGR_ASR5_HALT)) so sein: if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))??

Die Position des HIGH ist meiner Ansicht nach nicht relevant.
Das Voranstellen ist von Vorteil um die Verwechslung von = und == einzuschränken.

@ mde ja sorry war nur ein tipfehler hier von mir.

jemhadar:
if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH==master_x.dio_get(E_SIGR_ASR5_HALT))

Es wird der Code ausgeführt, den Du programmiert hast und nicht der Code, den Du (vermutlich) beabsichtigt hast.

Wenn ich mal die Klammern setze, so wie es ausgeführt wird, dann steht da:
if(HIGH== (master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH) ==master_x.dio_get(E_SIGR_ASR5_HALT))

Dieser Ausdruck ist wahr, wenn "master_x.dio_get(E_SIGR_ASR5_HALT) || HIGH" wahr ist und ebenfalls "master_x.dio_get(E_SIGR_ASR5_HALT)".

Beabsichtigt von Dir war vermutlich:
if((HIGH==master_x.dio_get(E_SIGR_ASR5_HALT)) || (HIGH==master_x.dio_get(E_SIGR_ASR5_HALT)))

Du darfst die Klammern um die einzelnen logischen Ausdrücke nicht weglassen!

in den programmierbeispielen sind aber auch keine klammern ?

|| (logical or)

True if either operand is true, e.g.

if (x > 0 || y > 0)
{
// ...
}

jemhadar:
in den programmierbeispielen sind aber auch keine klammern ?

Stimmt, die Wertigkeit der Vergleichsoperatoren ist höher als die Wertigkeit der || und && Operatoren, also vergiss meinen letzten Beitrag.

Wie sieht es denn mit den Funktionen aus, was liefern die zurück? Sind die Funktionen so programmiert, dass sie einen logischen Wert (true, false, HIGH, LOW) zurückliefern, oder können diese irgendwelche anderen Werte zurückliefern?

die funktionen liefern nur 0 od 1 also High oder Low zurück
gelesen wird aus einem bitbuffer.

bei && funktioniert ja komischer weise alles
nur || macht zicken

das ist das was mich so stuzig macht.

Dann hole dir die Werte mal vor dem Vergleich in zwei Bool Variablen. Um zu sehen, was passiert, schreibst du sie mit Serial.print an den Monitor.
Im Vergleich Sollte auch ein Serial.print("TRUE") sein um zu sehen wann IF TRUE.
Das gleiche kommt dann noch in die ELSE rein: Serial.print("FALSE")

Dann poste nochmal deinen Code und das Monitor ergebnis.

jurs:
Es wird der Code ausgeführt, den Du programmiert hast und nicht der Code, den Du (vermutlich) beabsichtigt hast.

:grin:

hallo mahlzeit

habe heute einige versuche gestartet alle mit dem selben ergebnis das ich mit oder ohne klammern nicht zu dem gewünschen erfolg komme.
oder HIGH vorangestellt oder hinten ist auch egal.
somit kann ich trotz der guten tips kein bier ausgeben.

@ mde
deinen oben genannten vorschlag werde ich noch testen das habe ich noch nicht probiert.

lg
Thomas

Kannst Du mal die Deklaration von master_x.dio_get() posten?

Hallo zusammen hier ist die Lösung

es war ein einfacher ganz dummer programmierfehler meinerseits.

Der Fehler war nicht im Setzbefehl sondern beim Rücksetzen.

wenn ich

A==1 || B==1 dann setze C==1 dann muss ich natürlich beim Rücksetzen A==0 && B==0 Rücksetze C==0 verwenden.

ich hatte auch beim rücksetzen :blush: A==0 || B==0 Rücksetze C==0 .....kann einfach nicht funktionieren

lg

Vor allem funktioniert das nicht wenn man C==0 zum rücksetzen verwendet. Man muß C=0 schreiben.

Hab nochmal aufmerksam die ganze Diskussion gelesen und finde keinen Hinweis auf das wirkliche Problem.

Du schreibst als Fehlerbeschreibung:

UND abfrage funktioniert perfekt auch mit vielen variabeln.
der unten genannte code: lese aus buffer variable E_SIGR_ASR5_HALT und E_SIGR_ASR3_HALT , wenn beide 1 sind dann setze ausgangs buffer Variabel A_SIGS_ASH4_HALT auf 1
getestet funktioniert in der anwendung.
....
ODER abfrage leider gar nicht
Wenn ich jetzt statt und eine oder verknüpfung dann fangen die probleme an
nur wenn beide variablen 1 sind wird der ausgang gesetzt und sonst nicht. also macht auch in dem unten genannten beispiel der compiler ein und Gatter draus was nicht sein darf.

und dann als Lösung:

dann muss ich natürlich beim Rücksetzen A==0 && B==0 Rücksetze C==0 verwenden.

Es wäre schön gewesen wenn das Problem überhaupt behandelt worden wäre.
ODer-Verknüpfungen um zu kontrollieren ob beide Variablen LOW sind funktionieren nicht aber davon hastt Du nichts geschreiebn.

Grüße Uwe