Lange if Anweisung auch als case ?

Gast #179139
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.