Pages: [1]   Go Down
Author Topic: Logische und / oder Abfrage  (Read 1565 times)
0 Members and 1 Guest are viewing this topic.
AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:

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.

Code:
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


« Last Edit: January 19, 2013, 01:46:06 pm by jemhadar » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
}
« Last Edit: January 19, 2013, 11:43:31 am by markbee » Logged


AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 3
Posts: 294
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Soll das nicht anstatt
Code:
if(HIGH==master_x.dio_get(E_SIGR_ASR5_HALT) || master_x.dio_get(HIGH==E_SIGR_ASR5_HALT))
so sein:
Code:
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.
« Last Edit: January 19, 2013, 01:28:47 pm by mde110 » Logged

Arduino 1.0.3|MEGA|UNO|MICRO|PRO MINI3.3
SSD1289 TFT Touch|DS18B20|DS1307
ADNS2610|RFM12|OOK|SSD1303|DHT22
SSD1306 Crius CO-16 OLED|UGUI|SD
SSD1352|

AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2854
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in den programmierbeispielen  sind aber auch keine klammern ?

|| (logical or)

True if either operand is true, e.g.

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2854
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany, BW
Offline Offline
Sr. Member
****
Karma: 3
Posts: 294
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


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

 smiley-mr-green
Logged

Arduino 1.0.3|MEGA|UNO|MICRO|PRO MINI3.3
SSD1289 TFT Touch|DS18B20|DS1307
ADNS2610|RFM12|OOK|SSD1303|DHT22
SSD1306 Crius CO-16 OLED|UGUI|SD
SSD1352|

AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Chemnitz/Saxony/Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 107
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

AUT
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-red  A==0 || B==0  Rücksetze C==0    .....kann einfach nicht funktionieren

lg
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Quote
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:
Quote
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
Logged

Pages: [1]   Go Up
Jump to: