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
1. Was meckert bzw. sagt/schreibt er denn? 2. Poste deinen Code als Code 3. Nimm das ';' aus der 2. if-Abfrage
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.