Lange if Anweisung auch als case ?

Gast #179139
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
Angehängte Dateien:
Gast #179140
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
Gast #179141
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));
}
Gast #179142
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
Gast #179143
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren