mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterschied: IF und SWITCH Abfrage


Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab da wieder ein kleines Problem mit meinem Compiler oder ich bin 
einfach zu dumm. Im Grunde dürften doch beide Abfragen das selber 
bewirken, das bei der Abfrage der Var "display" die jeweilige Function 
aufgerufen wird:
     switch (display) {
           case 1 : display_1(); break;
           case 2 : display_2(); break;
           case 3 : display_3(); break;
           case 4 : display_4(); break;
           case 5 : display_5(); break;
     }

und diese Abfrage:
    
     if (display == 1) display_1();
     if (display == 2) display_2();
     if (display == 3) display_3();
     if (display == 4) display_4();
     if (display == 5) display_5();

Jedoch wird entweder die Switchanweisung ignoriert oder der break kommt 
falsch. Wenn break weg bleibt, dann rennt er die switchanweisung 
logischerweise durch. Mit break bleibt sie stehen und das display bleibt 
dunkel.

Sollte ich das break in die function (display_x()) integrieren?!

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es jetzt um das Multiplexen einer 7-Segmentanzeige ?
Sowas macht man im Timerinterrupt damit die Daten kontinuierlich 
ausgegeben werden.

Ansonsten muss du schon etwas mehr Code zeigen.

Gruss Helmi

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden Codefragmente bewirken nicht das Gleiche:

Bei deinem switch wird immer nur ein case angesprungen und bis zum 
nächsten break oder return abgearbeitet. Das break kannst du NICHT in 
die display_x() Funktionen ziehen.

Die if Anweisungen werden hintereinander geprüft. Sollte display seinen 
Wert in einer der display_x() Funktionen ändern, so kann auch noch ein 
anderer der Zweige ausgeführt werden.

Sollte display sich nicht verändern innerhalb der Funktionen, dann ist - 
bis auf den overhead des wiederholten Vergleiches - das Resultat beider 
Codeschnipsel identisch.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äquivalent wären:
>
>      switch (display) {
>            case 1 : display_1(); break;
>            case 2 : display_2(); break;
>            case 3 : display_3(); break;
>            case 4 : display_4(); break;
>            case 5 : display_5(); break;
>      }
> 

und

>
>      if (display == 1) display_1();
>      else if (display == 2) display_2();
>      else if (display == 3) display_3();
>      else if (display == 4) display_4();
>      else if (display == 5) display_5();
> 

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soweit ich das hier sehe, sollten die beiden gleich sein
(falls display nicht eine globale Variable ist, die in den
Funktionen manipuliert wird).

Der Fehler liegt wohl woanders...

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann mich Tim Seidel nur anschließen. Sofern sich der Wert von 
"Display" während der Laufzeit nicht ändert sollte in beiden Fällen das 
gleiche passieren.

Erläutere bitte deine Aussage:
>Jedoch wird entweder die Switchanweisung ignoriert oder der break kommt
>falsch.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Codeextrapolator sagt mir, der Fehler ist in Zeile 42 deines 
Programms.

Falls du meinem Codeextrapolator nicht vertrauen solltest, poste doch 
bitte deinen Code :)

Autor: Draco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Gut gut, aber erschlagt mich nicht wegen dem Nudelcode :D Ich versuche 
ja mein bestes zu geben, und irgendwann klappt das schon noch g

Da ist übrigens auch gerade mein zweites Problem (Display_4, Calc_Sp) Da 
soll die Spannung berechnet werden, jedoch schaffe ich es nur bis dato 
Ganzzahlwerte zu bekommen. Brauch aber 2 Nachkommastellen :/

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also die Variable display wird in den einzelnen Funktionen schonmal 
nicht verändert. Damit sind deine beiden Code-Varianten eigentlich 
identisch.

was bei einem case statement immer gut kommt zum debuggen, ist ein 
default label, welches sich irgendwie bemerkbar macht, damit zu sieht 
dass was schief gelaufen ist.

Welchen Compiler benutzt du eigentlich? GCC scheints nicht zu sein.

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, ich werfe das default Statement mal mit rein.

Meine Umgebung ist MicroC auf einem EasyAVR6 mit Atmega32.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte als Compiler aber auch keine Skrupel, den folgenden Codeblock 
nicht zu übersetzen:
     if (richtung == 1 && temp_select <= 1) {
                  display++;
                  if(display == 6) display = 1;
                  delay_ms(50);
                  richtung = 0;
     }
     if (richtung == 2 && temp_select <= 1) {
                  display--;
                  if(display == 0 ) display = 5;
                  richtung = 0;
     }

'richtung' wird bei Programmstart auf 0 gesetzt und im 
Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der 
beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion Button() ist nirgendwo definiert.

Und bei:
delay_ms(300);
in einem Interrupt, kräuseln sich jedem Programmierer die Fußnägel.

Nimm besser eine fertige und bewährte Entprellroutine:
http://www.avrfreaks.net/index.php?module=Freaks%2...


Peter

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> 'richtung' wird bei Programmstart auf 0 gesetzt und im
> Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der
> beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.

Ähm doch, oben im Interrupt. Bei Betätigung des Drehgebers wird die 
jeweilige Richtung (2 links, 1 rechts) in diese Variable gegeben. Damit 
bestimme ich ja auch was nun in der IF oder Switch Abfrage wahr ist.

Peter Dannegger schrieb:
> Die Funktion Button() ist nirgendwo definiert.

Braucht es bei MicroC nicht, ist dort in der Standartbibliothek 
definiert.

Peter Dannegger schrieb:
> in einem Interrupt, kräuseln sich jedem Programmierer die Fußnägel.

Ich weiß, ich weiß. Gut die 300 ms bei dem Knopf sind eigentlich 
unnötig. Jedoch komme ich bei den 100 ms des Drehgebers nicht drumrum. 
:/

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Draco schrieb:
> Sven P. schrieb:
>> 'richtung' wird bei Programmstart auf 0 gesetzt und im
>> Hauptprogrammfluss nie wieder verändert, also werden die Bedingungen der
>> beiden if niemals wahr. Daher können sie bedenkenlos ausgelassen werden.
>
> Ähm doch, oben im Interrupt.

Dann informiere dich mal über die Bedeutung von "volatile".

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anders formuliert: Steck den Finger auf den Anfang von main() und 
verfolge den Programmablauf. Du wirst feststellen, dass 'richtung' 
niemals einen neuen Wert erhält.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Draco schrieb:
> Braucht es bei MicroC nicht, ist dort in der Standartbibliothek
> definiert.

Nütz bloß nix, wenn man kein MicroC hat.
Man weiß also nicht, was diese Funktion macht.


Peter

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal in deiner Doku zu MicroC nach, ob man da auch volatile 
braucht. Bei GCC würde es hier definitiv fehlen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.