If befehl wird nicht ausgeführt

Hallo zusammen,

ich habe einen If befehlen womit ich später ein Drehimpulsgeber erkennen möchte.

Dabei müsste ich Ständig abfragen ob PIN_A oder PIN_B HIGH ist oder LOW und wenn ja dann sollte er … tun.

Zum üben des If befehls habe ich dann ein einfaches Programm geschriebn womit ich einen LCD Dispay ansteuere.

Ziel: Wenn PIN_7 High ist soll auf dem LCD das Wort HIGH erscheinen.

Ich bekomme keine Fehlermeldung, aber auf den Display erschien immer das Wort HIGH. Unabhängig davon ob PIN_7 High oder Low ist.

Mein Code

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
lcd.begin(20, 4);
pinMode (7, INPUT);
}

void loop() {
if (7, HIGH)
{
lcd.print (“HIGH”);
lcd.setCursor(0, 0);
}

}

 if (7, HIGH)

tut ja auch nicht, was Du meinst, dass es tut. (Ehrlich gesagt weiß ich gar nicht, was es in C tut, hätte einen Error erwartet.)

Ich schreibe absichtlich nicht, wie das geht, weil die Tatsache, dass Du es schreibst, zeigt, dass Du Dir das ganze Kapitel nochmal gründlich ansehen solltest, und nicht nur die richtige Lösung hier rauskopieren.

Ja ich hatte das vorher auch wie in C geschrieben

if (7 == HIGH)
{
...
}

aber das hat auch nichts gebracht

Frotzzi:
aber das hat auch nichts gebracht

Kann auch nicht.
Du musst vorher den Zustand des Pin auslesen und mit der entsprechenden Variablen vergleichen.

Lerne die Grundlagen.
Ist in den Beispielen der IDE sehr ausführlich beschrieben.

aber das hat auch nichts gebracht

Weil es auch falsch ist. Es war noch nie besonders erfolgsversprechend, sich einfach irgendwas neues auszudenken und es hinzuschreiben (wie "(7,HIGH)"), wenn der erste Versuch nicht funktioniert.
Wenn man einen Affen an eine Schreibmaschine setzt, wird er zwar irgendwann Shakespeares gesammelte Werke tippen, aber das dauert doch länger, als sich mit den Grundlagen der Programmiersprache zu befassen.

"HIGH" ist AFAIR eine constante für den Integer 1. Dein erstes Beispiel ist überhaupt nicht korrekt (oder obskur, müsste mal jemand bestimmen, der besser in allgemeinem C ist als ich). Dein zweites Beispiel schaut, ob die Zahl 1 gleich der Zahl 7 ist. Das wird übrigens schon vom Compiler als immer falsch erkannt und landet überhaupt nicht im Binärcode.

if (7 == HIGH)

LOW = 0
alles was >0 ist, ist HIGH, somit ist 7 immer HIGH und dein Programm arbeitet richtig.
Außerdem solltest du bedenken, das du einen externen Pulldown Widerstand verbaust, oder den internen Pullup Widerstand aktivierst und auf LOW abfragst.

Naja, er sollte zuerst sein ProgrammierProblem erkennen, bevor du auf die Widerstände eingehst.

(Ehrlich gesagt weiß ich gar nicht, was es in C tut, hätte einen Error erwartet.)

(oder obskur, müsste mal jemand bestimmen, der besser in allgemeinem C ist als ich)

Es gibt in C/C++ das Wort/Begriff: Ausdruck
Oder im englischen “Expression”.

Der “Ausdruck Verkettungsoperator” ist das Komma .
Es dient dazu, Ausdrücke zu verketten.

Überall, wo Ausdrücke erlaubt sind, darf man sie auch verketten.
Das hält den Kompiler einfach.

Was in Köpfen von z.B. for Schleifen gut, gerne, und rel. häufig Sinn macht, ist an anderen Stellen, eher Sinnfrei.
Z.B. dieses:

void setup()
{
   14+5, 77, Serial.print("bla"), millis(), 88<23;
}

Das if nutzt den Wert eines Ausdrucks.
Es wird immer das Ergebnis/Wert des letzten Ausdrucks verwendet.
if (7, HIGH)
Hier kommt also nur das HIGH zur Geltung.
Die Bedingung ist also immer wahr.
Auch if(LOW,HIGH) ist immer wahr.

Es ist also durchaus vom Sprachstandard abgedeckt, so dass der Kompiler bei dem Ausdruck in Posting #1 keinen Fehler meldet.
Das macht ihn aber noch lange nicht sinnvoll.

Bei dir fehlt

  • die Abfrage des Physikalischen Pins Tip: digitalRead()
  • was das Display machen soll wenn der Pin LOW ist.
  • Reihenfolge des Display Handlings erst Cursor Positionieren und dann schreiben.

Mit diesen Tips solltest du was lauffähiges hinbekommen
Gruß
DerDani

Ach kommt Leute, man kann doch einfach sagen, dass der Status mit digitalRead() ausgelesen werden muss. Manchmal eiert ihr echt gewaltig rum. >:(

ardubu:
LOW = 0
alles was >0 ist, ist HIGH, somit ist 7 immer HIGH und dein Programm arbeitet richtig.

Das ist nicht korrekt. Es mag zwar definiert sein, dass HIGH alles alles über 0 sein kann, die Konstante hat aber trotzdem eine bestimmte Zahl, nicht ">0", so dass HIGH==7 im allgmeinen zu false evaluiert werden wird.

Frotzzi:
Ich bekomme keine Fehlermeldung, aber auf den Display erschien immer das Wort HIGH. Unabhängig davon ob PIN_7 High oder Low ist.

Und damit du im Display auch eine Meldung "Low" bekommst, musst du diese auch auf das Display schreiben.
Das machst du in der "if-Abfrage" im Anschluss mit "else".
Und die Cursor-Position des Displays solltest du vor dem Schreiben auf das Display setzen.

combie:
Was in Köpfen von z.B. for Schleifen

Meinst Du damit

for(int i = 0; i<10; i++)

?
Ist das wirklich der gleiche Ausdruck? “int i = 0” wird ja nur einmal ausgeführt, die anderen beiden dagegen bei jedem Durchlauf. Wie funktioniert das, wenn das einfach nur ein Haufen verketteter Befehle ist?

int i = 0;
while(i++;i<11) {}[code]
müsste dagegen die obige for-Schleife nachbauen, wenn ich Dich richtig verstehe.

Meinst Du damit
Code:
for(int i = 0; i<10; i++)

Nein!

Manchmal muss man in einer for Schleife nicht nur i hochzählen, sondern zusätzlich noch einen Pointer weiter setzen

void tuwas(unsigned long * pointer)
{
  for(int i = 0;i < 42; i++, pointer++)
  {
    // tuwas mit i und pointer
  }
}

Dann ist die Verkettung ganz nett.

while(i++;i<11) {}
müsste dagegen die obige for-Schleife nachbauen, wenn ich Dich richtig verstehe.[/code]

Ich spreche von Komma und du nutzt Semikolon.
Das ist zwar ein kleiner, aber doch gewichtiger Unterschied.

combie:
Das ist ein kleiner, aber gewichtiger Unterschied.

Ups! Eigentlich dachte ich, ich hätte Kommata gesetzt. Bei der for-Schleife hat da aber wohl die Interne Autokorrektur zugeschlagen und das direkt in die while-Schleife durchgeschleppt.
Danke!

combie:
Der "Ausdruck Verkettungsoperator" ist das Komma .
Es dient dazu, Ausdrücke zu verketten.

Genaugenomen werde alle Teile ausgeführt und der letzte wird zurückgegeben.

Auf der Wiki Seite gibt es mehr Beispiele dazu:

Das fängt auch schon mit trivialen Sachen an:

int a, b, c;

Genaugenomen werde alle Teile ausgeführt und der letzte wird zurückgegeben.

Das ist richtig.
Der jeweils letzte Wert, ist der Wert des Gesamtausdrucks.

Interessanter Weise, ist aber die Ausführungsreihenfolge nicht garantiert, sondern Plattformspezifisch.
Das führt u.U. zu unerwünschten Seiteneffekten, z.B. wenn globale Variablen mit im Spiel sind.
sagt eine alte Erinnerung

combie:
Das ist richtig.
Der jeweils letzte Wert, ist der Wert des Gesamtausdrucks.

Interessanter Weise, ist aber die Ausführungsreihenfolge nicht garantiert, sondern Plattformspezifisch.
Das führt u.U. zu unerwünschten Seiteneffekten, z.B. wenn globale Variablen mit im Spiel sind.
sagt eine alte Erinnerung

Da trügt dich die alte Erinnerung :slight_smile: Der Komma-Operator ist ein "sequence point" (kenne den deutschen Ausdruck nicht). Das garantiert die Reihenfolge der Ausführung von links nach rechts

Unter der Voraussetzung, dass nicht jedes Komma in C/C++ ein Komma Operator ist, hast du natürlich recht.
War in dem Punkt nicht konkret genug, meine alte Erinnerung.

tuwas(a(),b(),c());

Hier ist nicht festgelegt, welche der a() b() c() Funktion zuerst aufgerufen wird.
In diesem konkreten Fall bleibt dieses hier wahr:

Interessanter Weise, ist aber die Ausführungsreihenfolge nicht garantiert, sondern Plattformspezifisch.
Das führt u.U. zu unerwünschten Seiteneffekten, z.B. wenn globale Variablen mit im Spiel sind.

Wie kommt Ihr vom IF-Problem zum FOR und Beistrich?
Grüße Uwe