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