Forum: Mikrocontroller und Digitale Elektronik [avrasm] if / else Mehrfachverzweigung


von Kai L. (Firma: privat) (elocki)


Lesenswert?

Hallo,
als Neuling in der ARDUINO-Programmierung versuche ich mich an einem 
kleinen Projekt -und scheitere trotz zeitraubender Forum-Studie.
Ich bitte um fachkundige Hilfe ...

Habe das ganze Programm bis auf eine LED zu schalten abgespeckt - esgeht 
um den Grundsatz.
Die Erklärung steht im Programm

/*
 TEST
 ... für
 wenn diese SchalterKombination, dann LED A
 wenn diese SchalterKombination, dann LED B
 ansonsten LED C

Der Aufbau:
 * LED`s mit Pin`s und GND verbinden
 * Die Taste an Pin 24 und +5V
   10K Widerstand an Pin 24 und GND

   Die  Mehrfachverzweigung wird mit einer mehr oder weniger 
komplizierten Schachtelung von if-Anweisungen realisiert.
   So lautete eine Toturial-Beschreibung....
.....
if(Bedingung 1){
  //Anweisungsteil für die Option 1
}
else {
  if (Bedingung 2){
    //Anweisungsteil für die Option 2
  }
  else {
    if (Bedingung 3){
      //Anweisungsteil für Option 3
    }
    else {
      //Anweisungsteil für die Option 4
    }
  }
}
....

*/

const int ledA = 40;         // LED/gn = Pin 40
const int ledB = 41;         // LED/bl = Pin 41
const int ledC = 42;         // LED/rt = Pin 42
const int Taste = 24;        // Taste  = Pin 24
const int Zeit1 = 32;        // Dipp-Schalter 1 Minute = Pin 32
const int Zeit2 = 33;        // Dipp-Schalter 2 Minute = Pin 33
const int Zeit4 = 34;        // Dipp-Schalter 4 Minute = Pin 34
       // Durch die Kombinationen der Schalter lassen sich Zeiten von 
1-8 Minuten realisieren
       // 8 Minuten = wenn alle Schalter LOW

int buttonState = 0;         // variable for reading the pushbutton 
status

void setup() {
  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  pinMode(Taste, INPUT);
  pinMode(Zeit1, INPUT);
  pinMode(Zeit2, INPUT);
  pinMode(Zeit4, INPUT);
}

void loop() {

  if (digitalRead(Zeit1 == HIGH) && (Zeit2 == LOW) && (Zeit4 == LOW)); { 
// Taster-Bedingung für 1 Minute

  buttonState = digitalRead(Taste);   // read the state of the 
pushbutton value:

    if (buttonState == HIGH) {   // Prüfung, ob StartTaster gedrückt 
wurde
    digitalWrite(ledA, HIGH);    // grüne LED wird eingeschaltet
    delay(1500);                 // 1,5s warten
    digitalWrite(ledA, LOW);     // grüne LED wird ausgeschaltet
    delay(300);
   }

     else {                      // wenn Taste NICHT betätigt wurde, 
werden alle Ausgänge auf LOW geschaltet
     digitalWrite(ledA, LOW);

  }

      else { 
// wenn vorherige Bedingungen nicht erfüllt wurden, dann ...
      if (digitalRead(Zeit1 == LOW) && (Zeit2 == HIGH) && (Zeit4 == 
LOW)) {  // Taster-Bedingung für 2 Minute

      buttonState = digitalRead(Taste);   // read the state of the 
pushbutton value:

    if (buttonState == HIGH) {   // Prüfung, ob StartTaster gedrückt 
wurde
    digitalWrite(ledB, HIGH);    // blaue LED wird eingeschaltet
    delay(1500);                 // wartet 1,5 s
    digitalWrite(ledB, LOW);     // blaue LED wird ausgeschaltet
    delay(300);
   }

  else {                         // wenn Taste NICHT betätigt wurde, 
werden alle Ausgänge auf LOW geschaltet
    digitalWrite(ledB, LOW);
  }
  }

    else { 
// wenn vorherige Bedingungen nicht erfüllt wurden, dann ...

    if (buttonState == HIGH) {   // Prüfung, ob StartTaster gedrückt 
wurde
    digitalWrite(ledC, HIGH);    // rote LED wird eingeschaltet
    delay(1500);                 // 1,5s vor Ablauf warten
    digitalWrite(ledC, LOW);     // rote LED wird ausgeschaltet
    delay(300);
  }

      else {                     // wenn Taste NICHT betätigt wurde, 
werden alle Ausgänge auf LOW geschaltet
      digitalWrite(ledC, LOW);
    }                            // Ende für Zeile 88
   }
  }
 }
}                                // Ende für Zeile 34 (void setupü)

Beim Kompillieren erhalte ich trotz diverser Versuche immer bei der 
zweiten bzw. dritten else-Verzweigung den Fehler:
error: 'else' without a previous 'if'

Wer kann mir und meinem kleinen Scetch helfen ?
Möglich wäre dies ja auch mit switch - case. Hier scheitere ich aber an 
der Definition der Variablen ...

: Verschoben durch Moderator
von Alexander F. (alexf91)


Lesenswert?

Diese komplizierte Schachtelung muss nicht sein.

Du kannst das nächste if direkt nach einem else schreiben und musst 
nicht immer gleich explizit einen neuen Block aufmachen.
1
if(var1) {
2
3
}
4
else if(var2) {
5
6
}

Der Fehler ist übrigens das Semikolon beim ersten if, zumindest ist es 
einer davon, falls mehrere vorhanden sind.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Kai L. (Firma: privat) (elocki)

>als Neuling in der ARDUINO-Programmierung versuche ich mich an einem
>kleinen Projekt -und scheitere trotz zeitraubender Forum-Studie.
>Ich bitte um fachkundige Hilfe ...

Was hat das mit dem Titel deines Beitrags zu tun?

>Habe das ganze Programm bis auf eine LED zu schalten abgespeckt - esgeht
>um den Grundsatz.

Lies ein C-Buch!

>Die Erklärung steht im Programm

Die Erklärung steht im Buch!

von Walter S. (avatar)


Lesenswert?

Kai L. schrieb:
> if (digitalRead(Zeit1 == HIGH) && (Zeit2 == LOW) && (Zeit4 == LOW)); {

sorry, aber diese Zeile zeigt dass Du ganz von vorne anfangen solltest
(wir haben alle mal klein angefangen)

von Heinz L. (ducttape)


Lesenswert?

Löse das Ganze über eine Subroutine. Dann kannst Du Dir den ganzen 
"else" Krempel sparen, sobald eine Bedingung erfüllt ist, einfach mit 
return aus der Subroutine raus.

Sieht in etwa so aus:
1
//Hauptprogramm:
2
void main()
3
{
4
  DatDingWatTut();
5
}
6
7
void DatDingWatTut();
8
{
9
  if (bedingung1)
10
  {
11
    //hier was passieren soll.
12
    return; //hier bricht es ab wenn Bedingung1 erfüllt ist.
13
  }
14
  if (bedingung2) //else können wir uns sparen, wenn bedingung1 erfüllt war kommen wir hier gar nicth her.
15
  {
16
    //hier was passieren soll.
17
    return;
18
  }
19
  //restlicher code
20
  
21
  //Hier noch was passieren soll wenn gar nix davon zutrifft
22
  return;
23
}

von Pandur S. (jetztnicht)


Lesenswert?

Mein Tip. Blockierend zu Arbeiten bedeutet schwieriges Debuggen. Arbeite 
generell nicht blockerend. Schmeiss die delays raus, arbeite mit einer 
Zustandmaschine und einem Timer interrupt. Dann weiss man immer wo das 
Programm steht. Kann sich den Zustand ausgeben lassen, und weiss wann 
das naechste Ereigniss eintreten muss.

von Heinz L. (ducttape)


Lesenswert?

Jetzt Nicht schrieb:
> Mein Tip. Blockierend zu Arbeiten bedeutet schwieriges Debuggen. Arbeite
> generell nicht blockerend. Schmeiss die delays raus, arbeite mit einer
> Zustandmaschine und einem Timer interrupt. Dann weiss man immer wo das
> Programm steht. Kann sich den Zustand ausgeben lassen, und weiss wann
> das naechste Ereigniss eintreten muss.

Von der Idee her prima, nur glaub ich wird das der Threadersteller nicht 
umsetzen können.

Herr im Himmel, Freunde, wenn Ihr sowas vorschlagt bei einem der sehr 
offensichtlcih grad mal eben irgendwie Code zusammenkleistern kann müßt 
Ihr mehr liefern als ein paar Schlagworte. Weil wenn er mit dem Begriff 
einer State Machine was anfangen könnt hätt er's wahrscheinlich eh so 
realisiert.

von Pandur S. (jetztnicht)


Lesenswert?

Von der Moeglichkeit, debuggen zu Verinfachen einmal gehoert zu haben 
ist ja schon mal etwas. Vielleicht kommt der Poster ja auch einmal, in 
vielen Jahren, an einer Zustandsmaschine (State Machine) vorbei und 
erinnert sich dann...  ... das waer dann die mit Null Zylindern und ohne 
Schlaeuche.

vielleicht wagt der Poster sich auch irgendwann das Suchwort bei Gurgel 
einzugeben.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?


von Kai L. (Firma: privat) (elocki)


Lesenswert?

Vielen Dank für die schnellen Antworten ...
An Heinz ein besonderes DANKE, da er die Sache nicht noch 
verkompliziert, sondern sogar einen machbaren Lösungsansatz gegeben hat.
Ich werde dann malkurzfristig eine Rückmeldung dazu geben.

Macht alle weiter so im Forum.

von public (Gast)


Lesenswert?

Kai L. schrieb:
> if(Bedingung 1){
>   //Anweisungsteil für die Option 1
> }
> else {
>   if (Bedingung 2){
>     //Anweisungsteil für die Option 2
>   }
>   else {
>     if (Bedingung 3){
>       //Anweisungsteil für Option 3
>     }
>     else {
>       //Anweisungsteil für die Option 4
>     }
>   }
> }

War das nicht deine aufgabe?

Es würde dir helfen den code symmetrischer zu gestalten, in etwa so
1
if (bedingung1)
2
{
3
  if (bedingung2)
4
  {
5
6
   ...
7
8
  }
9
  else
10
  {
11
12
  ...
13
14
15
  }
16
}

Jetzt sieht man genau wo eine block anfängt und wo er endet...

beste grüsse
public

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.