www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kippschalter in AVR


Autor: BeamBot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha (Gast)
Datum:

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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
4. Nimm das ';' aus der 1. if-Abfrage

;)

Autor: BeamBot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BeamBot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank, es rennt! ;)

Grüsse

Autor: P. S. (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.