Kippschalter in AVR

Gast #1149072
Moin,

möchte in AVR die Abfrage eines Kippschalters realisieren. Habe hierzu 
folgenden Code verfaßt:

void vrFahrt(void)
{


  // SCHALTERSTELLUNG ABFRAGEN
  if ( ( ( Schalter & (1<<Vor) | (1<<Zur);) ) ==0 )  // BEIDE SIGNALE 
NULL
  {
    verzoeger_ms(DebZeit);

    if ( ( ( Schalter & (1<<Vor) | (1<<Zur); ) ==0)  // BEIDE SIGNALE 
NULL
    {
      Richtung = (1<<InpVor) | (1<<InpZur);  // BEIDE SIGNALE IMMER NOCH 
NULL
      return;
    }
  }

  if ( (Schalter & (1<<Vor)) !=0 )      // IST VORWÄRTS 1?
  {
    verzoeger_ms(DebZeit);

    if ( (Schalter & (1<<Vor)) !=0 )    // IST IMMER NOCH VORWÄRTS 1?
    {
      Richtung = (1<<InpVor);      // VORWÄRTSFAHRT FÜR H-BRÜCKE
      return;
    }
  }

  if ( (Schalter & (1<<Zur)) !=0 )      // IST RÜRCKWÄRTS 1?
  {
    verzoeger_ms(DebZeit);

    if ( (Schalter & (1<<Zur)) !=0 )    // IST IMMER NOCH RÜCKWÄRTS 1?
    {
      Richtung = (1<<InpZur);      // RÜCKWÄRTSFAHRT FÜR H-BRÜCKE
      return;
    }
  }


  return;


}

Der Compiler meckert jedesmals bei den if-Kriterien, z. B. (Schalter & 
(1<<Vor)) !=0.
Gibt es vllt für sowas eine fertige Routine? ( Handelt sich um einen 
AN-AUS-AN-Kippschalter).
Oder wie kann ich andersweitig realisieren ...

Grüße
Gast
Sry, der Code sieht auch inzwischen so aus ... ( ohne die ; !  ;) )

void vrFahrt(void)
{


  // SCHALTERSTELLUNG ABFRAGEN
  if ( Schalter & (1<<Vor) | (1<<Zur) ==0 )  // BEIDE SIGNALE NULL
  {
    verzoeger_ms(DebZeit);

    if ( Schalter & (1<<Vor) | (1<<Zur) ==0 )   // BEIDE SIGNALE NULL
    {
      Richtung = (1<<InpVor) | (1<<InpZur);  // BEIDE SIGNALE IMMER NOCH 
NULL
      return;
    }
  }

  if ( Schalter & (1<<Vor) !=0 )      // IST VORWÄRTS 1?
  {
    verzoeger_ms(DebZeit);

    if ( Schalter & (1<<Vor) !=0 )    // IST IMMER NOCH VORWÄRTS 1?
    {
      Richtung = (1<<InpVor);      // VORWÄRTSFAHRT FÜR H-BRÜCKE
      return;
    }
  }

  if ( Schalter & (1<<Zur) !=0 )      // IST RÜRCKWÄRTS 1?
  {
    verzoeger_ms(DebZeit);

    if ( Schalter & (1<<Zur) !=0 )    // IST IMMER NOCH RÜCKWÄRTS 1?
    {
      Richtung = (1<<InpZur);      // RÜCKWÄRTSFAHRT FÜR H-BRÜCKE
      return;
    }
  }


  return;


}

Was er meckert ...

../zug_2.c:72: warning: suggest parentheses around arithmetic in operand 
of |
../zug_2.c:72: warning: suggest parentheses around comparison in operand 
of |
../zug_2.c:76: warning: suggest parentheses around arithmetic in operand 
of |
../zug_2.c:76: warning: suggest parentheses around comparison in operand 
of |
../zug_2.c:83: warning: suggest parentheses around comparison in operand 
of &
../zug_2.c:87: warning: suggest parentheses around comparison in operand 
of &
../zug_2.c:94: warning: suggest parentheses around comparison in operand 
of &
../zug_2.c:98: warning: suggest parentheses around comparison in operand 
of &


Der Kippschalter ist mittels Pullabwiderstände direkt am Microcontroller 
angeschlossen. So kann er also 0V und 5V abgreifen.
Da der Compiler ja immer dies Warnungen ausspuckt, dachte ich mir das 
vllt nochmal umzuschreiben. Kann ich das nicht vllt über eine Case oder 
so machen?

Danke erstmal,

Beambot
Was will dir der Compiler sagen.

Ein Beispiel: Die meisten von uns wissen, wie die Operatorenreihenfolge 
in diesem Beispiel ist:  3 + 2 * 5
Wir alle haben gelernt und verinnerlicht: Punkt vor Strich.
Die Multiplikation bindet stärker als die Addition, also ist die korekte 
Abarbeitungsreihenfolge  3 + ( 2 * 5 )  und nicht ( 3 + 2 ) * 5

Aber wie ist das bei & und |
Die wenigsten wissen auswendig, wie hier die Reihenfolgeregelung lautet 
und daher schlägt der Compiler vor, du solltest doch bitte ( ) setzen, 
um letzte Zweifel zu beseitigen.

Es geht um die Fragestellung, ob
   a & b | c
als
  ( a & b ) | c
oder als
   a & ( b | c )
angesehen wird.

Übrigens: es wird als  ( a &  b ) | c  aufgefasst und das ist nicht das 
was du eigentlich möchtest :-)

Es gibt dann noch eine Falle:

  a & b == c

wird implizit so geklammert

  a & ( b == c )

und auch das ist nicht das was du hier eigentlich haben möchtest.

> Kann ich das nicht vllt über eine Case oder so machen?

Setz einfach die Klammern so, wie du sie brauchst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.