Forum: Compiler & IDEs Lange if Anweisung auch als case ?


von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im Anhang habe ich eine für mich sehr komische if Verzweigung genutz.

Geht das evtl. leichter, übersichtlicher oder sogar mit einer case
Anweisung ?

Wenn "Tick" zwischen zwei Werten liegt, dann ....?

Desweiteren würde ich gerne wissen, od die Schreibweise der einzelnen
Bit-setzen-löschen so ok ist.
Und was ist mit den Definitionen im IO Init?

Danke für Euere Hilfe !!!

Gruß Toby

von Dirk (Gast)


Lesenswert?

Hi,

ich weurde es generell ein bischen anders machen.

Erhoehe nur die Timer0_Cnt variable (bei dir Tick) .... Bei erreichen
einer gewissen Zeit setzt du ein FLAG.... Das Flag fragst du im
Hauptprg ab.

Hier mal ein kleines Beispiel:

SIGNAL(SIG_OVERFLOW1)
{
  timer1cnt++;
  if(!(timer1cnt%20))
  {
    event = EV_KEYSCAN;
    nKeyTime++;
  }
  if(!(timer1cnt%70))
  {
    event = EV_LCDREFRESH;
  }
}

Main z.B. so :


int main(void)
{
  timer0_init;
  sei();
  switch (event)
  {
     case EV_KEYSCAN: scankey();
                      break;
     case EV_LCDREFRESH: refresh();
                         break;
  }


Mfg
Dirk

von Rufus T. Firefly (Gast)


Lesenswert?

Da Du nicht auf Gleichheit mit Konstanten überprüft, kann Dir ein
switch/case-Statement nicht helfen.

Etwas übersichtlicher würde das ganze durch Verwendung einiger returns
und Weglassen vermutlich unnötiger Vergleiche, oder ist beabsichtigt,
daß bei Tick==4, 29 & 34 die Funktion gar nichts macht? Ich vermute
mal, daß Du da irgendwie mit dem else durcheinandergekommen bist.

Außerdem ist der Vergleich if (Tick > 255) ohne Funktion, da tick ein
uint_8 ist.
Zuletzt noch sollte Tick initialisiert werden.

Sieh' Dir mal das hier an:

SIGNAL(SIG_OVERFLOW0)
{
  static uint8_t Tick = 0;
  Tick++;

  if (Tick < 5)
  {
    PORTB |= ((1<<MEINBIT0));
    return;
  }

  if (Tick < 30)
  {
    PORTB &= ~((1 << MEINBIT0));
    return;
  }

  if (Tick < 35)
  {
    PORTB |= ((1<<MEINBIT0));
    return;
  }

  PORTB &= ~((1 << MEINBIT0));
}

von Axos (Gast)


Lesenswert?

Hi Toby!

>>Wenn "Tick" zwischen zwei Werten liegt, dann ....?
Meinst du so ne Schreibweise ? Is auf jeden Fall übersichtlicher.

if (Tick < 5)
  PORTB |= ((1<<MEINBIT0));
else if (Tick > 5 && Tick < 30)
  PORTB &= ~((1 << MEINBIT0));
else if (Tick > 30 && Tick < 35)
  PORTB |= ((1<<MEINBIT0));
else if (Tick > 35)
  PORTB &= ~((1 << MEINBIT0));

Das Gegenteil von && (AND) ist || (OR).

MfG Axos

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo,
und vielen dank für euere Hilfe.

Ich habe erstmal Rufus Version eingesetzt.
Damit bin ich scho sehr zufrieden.

Die Flag Variante finde ich auch sehr Intressant,
aber dazu muß ich mich erstmal weiter mit einzelnen Bits und Flöags
beschäftigen.

Axos, dir auch vielen dank.

Mir ging es um eine übersichtliche Schreibweise,

die habe ich nun, Danke !!

Gruß Toby

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.