Forum: Mikrocontroller und Digitale Elektronik elegantere Lösung zu else if.


von Chris D. (chris_gleichda)


Lesenswert?

Moin
Gibt es eine elegantere Lösung um Anweisungen wie if und elwe if 
auszuführen. Ich will nämlich lins am arduino auslesen und falls eine 
Spannung anliegt soll das was in der if Anweisung steht ausgeführt 
werden. Das hab ich so so gemacht.

While (diesdas > 1)
If(digitalRead(pin1 == HIGH)){
//tu etwas
}
Else if(digitalRead (pin2 == HIGH)){
//tu etwas anderes
}

Und so geht das bei mir mit 20 anderen pins weiter. Es sollen so lange 
diese pins anlusgelesen werden bis die Bedingung in der while schleife 
nicht mehr stimmt.
Gibt es dafür elegantere Lösungen oder kann es hierbei zu komplikationen 
kommen?

von osterhase (Gast)


Lesenswert?

Chris D. schrieb:
> Ich will nämlich lins am arduino auslesen

Was sind lins? Ist das ein spezielles Arduino Shield?

Sagt dir "switch" und "case" etwas?

von Chris D. (chris_gleichda)


Lesenswert?

Meinte pins haha

von Chris D. (chris_gleichda)


Lesenswert?

Und das sagt mir etwas.
Wie läuft das mit dem case und so ab? Läuft das so ähnlich wie diese 
else ifs dauernd bis man etwas drückt?

von port (Gast)


Lesenswert?

Wenn man alle portpins nacheinander durchgehen will, nimmt man ein for 
Schleife. In der Schleife braucht man dann nur eine if Abfrage.

von CC (Gast)


Lesenswert?

switch/case wird hierbei nicht helfen, damit kann man nur eine Variable 
auf verschiedene Werte abfragen:

int x = f();
1
switch(x)
2
{
3
  case 1:
4
    do_something();
5
    break;
6
7
  case 2:
8
    do_something_else();
9
    break;
10
11
  default:
12
    do_nothing();
13
}

Dies entspricht in etwa:
1
if(x == 1)
2
  do_something();
3
else if(x == 2)
4
  do_something_else();
5
else
6
  do_nothing();

von BattMan (Gast)


Lesenswert?

Warum liest Du nicht erst einmal die Ports komplett ein und prüfst 
danach
welche Pins gesetzt sind oder nicht.
Das funktioniert allerdings nur dann, wenn die Ports komplett für Deine 
Anwendung reserviert sind.

Bspw. so:
1
if ( a=PINx ) { /* Prüft ob irgend ein Pin gesetzt ist, also NICHT 0 ist*/
2
 
3
            for(i=0; i < 8; i++ ){
4
                if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/

von Chris D. (chris_gleichda)


Lesenswert?

Port schrieb:
Wenn man alle portpins nacheinander durchgehen will, nimmt man ein for 
Schleife. In der Schleife braucht man dann nur eine if Abfrage.

Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck 
übersehen wird. Wie würde diese for schleife dann aussehen??
Und wie kommt man in die auszuführenden befehle??

von port (Gast)


Lesenswert?

Chris D. schrieb:
> Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck
> übersehen wird. Wie würde diese for schleife dann aussehen??
> Und wie kommt man in die auszuführenden befehle??

Dann nimmt man Interrupts.

von Mike (Gast)


Lesenswert?

Chris D. schrieb:
> Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck
> übersehen wird.

Ich fürchte, du überschätzt deine Drückgeschwindigkeit.
Wie lang ist denn dein kürzester Tastendruck?

von BattMan (Gast)


Lesenswert?

BattMan schrieb:
> if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/

Zur weiteren Veranschaulichung:
1
         if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/
2
3
        switch(i){
4
5
        case: 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */
6
                    break;
7
        usw...

von BattMan (Gast)


Lesenswert?

BattMan schrieb:
> case: 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */

Schreibfehler von mir:

Richtig ist:
1
         case 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */

Der Doppelpunkt nach dem case war falsch!

von Kein Name (Gast)


Lesenswert?

Warum willst du überhaupt eine andere Lösung?

Ein Programm soll funktionieren und es soll einfach und verständlich 
sein. Damit man bei einem Fehler sofort sieht, was man ändern muss.

So gesehen ist das Programm ideal.

Natürlich kann sich heraus stellen, das es nicht so einfach geht, dass 
du z.B. einen Tastenentprellung in einer Interruptroutine brauchst.

Aber warum anders machen, wenn es funktioniert?

P.S. Beispiele für elegante Lösungen findest du recht einfach. Suche 
nach umfangreichen Open-Source-Projekten, an denen nur 1 oder 2 Leute 
arbeiten.

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.