Forum: Mikrocontroller und Digitale Elektronik Kippschalter in AVR


von BeamBot (Gast)


Lesenswert?

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

von Micha (Gast)


Lesenswert?

1. Was meckert bzw. sagt/schreibt er denn?
2. Poste deinen Code als Code
3. Nimm das ';' aus der 2. if-Abfrage

von Micha (Gast)


Lesenswert?

4. Nimm das ';' aus der 1. if-Abfrage

;)

von BeamBot (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von BeamBot (Gast)


Lesenswert?

Besten Dank, es rennt! ;)

Grüsse

von P. S. (Gast)


Lesenswert?

Und wenn du schon dabei bist, denke auch mal ueber "sprechende" 
Variablennamen nach...

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.