Forum: Compiler & IDEs Unterschied zwischen (PIND & 0b00000010) == 0b00000010 und PIND == 0b00000010


von Zwei_Fragende (Gast)


Lesenswert?

Hallo!
Wir haben folgendes Problem:

Warum funktioniert
if ((PIND & 0b00000010) == 0b00000010) richtig und
if (PIND == 0b00000010) nicht?
(zweites if reagiert wie PIND = 0b0000010)

rein "logisch" betrachtet ist ja im richtigen fall PIND & 0b00000010 
gleich dem erwarteten. warum können wir es dann nicht direkt 
vergleichen?


schönen sonntag und vielen dank für die antwort

von Martin (Gast)


Lesenswert?

... schönen sonntag und vielen dank für die antwort ...

Gern geschehen: aber für welche Antwort?

von Peter D. (peda)


Lesenswert?

Einmal testest Du nur einen Pin und das andere mal alle 8.


Peter

von andz (Gast)


Lesenswert?

Mal auf deutsch:

das "& 0b00000010" maskiert, so wird nur das zweite Bit verglichen, weil 
vor dem vergleich alle anderen Bits auf 0 gesetzt werden.
Würde man das nicht tun, so würde der Vergleich nicht funktionieren wenn 
eines der anderen Bits auch auf 1 wäre, da man die ja auf 0 vergleicht.

Gruß

von Zwei_Fragende (Gast)


Lesenswert?

angenommen die if-abfragen schalten eine led.
warum leuchtet im zweiten fall immer die led, während im ersten alles 
erwartungsgemäß funktioniert?

von Ohforf S. (ohforf)


Lesenswert?

Zwei_Fragende schrieb:
> angenommen die if-abfragen schalten eine led.
> warum leuchtet im zweiten fall immer die led, während im ersten alles
> erwartungsgemäß funktioniert?

Ich vermute, dass offene Eingänge als '1' gelesen werden.

von Zwei_Fragende (Gast)


Lesenswert?

wenn die offenen eingänge als 1 erkannt werden, müsste
PIND so aussehen: 0b11111111
das wäre ungleich Ob00000010
dh. die led dürfte nicht leuchten

von Michael H. (michael_h45)


Lesenswert?

> If ((PIND & 0b00000010) == 0b00000010) richtig
sei PIND mal 0b10110001. dein IF macht also folgendes damit:
           & 0b00000010
           = 0b00000000 (-> FALSE)

sei PIND mal 0b10110011. dein IF macht also folgendes damit:
           & 0b00000010
           = 0b00000010 (-> TRUE)


> if (PIND == 0b00000010) nicht?
sei PIND mal 0b10110001. dein IF macht also folgendes damit:
          == 0b00000010
          -> FALSE

sei PIND mal 0b10110011. dein IF macht also folgendes damit:
          == 0b00000010
          -> FALSE

alles klar?

von Zwei_Fragende (Gast)


Lesenswert?

Michael H. schrieb:
> alles klar?

nein!
wenn das if false wäre dürfte die LED nicht leuchten, tut sie aber.
warum?

von Michael H. (michael_h45)


Lesenswert?

Weil die LEDs auf dem STK500 invertiert sind?
0 == led leuchtet
1 == led aus.

von grunzi (Gast)


Lesenswert?

welche led denn? du / ihr habt doch von gar keiner geschrieben

also ich finde es ganz logisch, dass
if(a==b) und if(a&0b00000001 == b) 2 paar schuhe sind. michael hat sich 
die mühe gemacht, ein beispiel zu basteln. habs jetzt nicht überprüft, 
aber mit mit & maskierst du doch die sache.

omas sind charakterisiert durch art der schuhe, rock und haarfarbe.

omaeins hat grüne schuhe und nen gelben rock an.

if(omaeins == oma mit grünen schuhen und gelbem rock und grünen haaren)
liefert falsch.

und

if(omaeins & maske für nur die schuhpartie) == grüne schuhe)
liefert richtig

mhm hat das jetzt geholfen?

von Zwei_Fragende (Gast)


Lesenswert?

es hat vermutlich nicht mit dem stk500 zu tun, denn am port selbst liegt 
spannung an

von Michael H. (michael_h45)


Lesenswert?

was, wie? port, led, spannung???
wie soll denn hier jemand was verstehen, der nicht vor eurem aufbau 
sitzt?

also, jetz mal raus mit einer klaren aufbaubeschreibung.

von g457 (Gast)


Lesenswert?

Ihr zwei, zeigt doch mal den kompletten(!) Code, ggf. als Anhang(!). 
Irgendwo(anders) habt ihr da einen Wurm drin.

von Zwei_Fragende (Gast)


Lesenswert?

aufbau: stk500
verbindung von sw1 -> pd1 und led1 -> pb1
quelltext wie folgt
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRB = 0b00000010; 
6
  PIND = 0b00000000;
7
  PORTD = 0b0000010;
8
9
  int i = 1;
10
  while (i == 1)
11
  {
12
    if (PIND == 0b00000010) //Bei diesem Statement leuchtet die LED immer
13
    {
14
      PORTB = 0b00000010;
15
16
    }
17
    else 
18
    {
19
      PORTB = 0b00000000;
20
21
    }
22
  };
23
24
  return 0;
25
}

von Michael H. (michael_h45)


Lesenswert?

Michael H. schrieb:
> Weil die LEDs auf dem STK500 invertiert sind?
> 0 == led leuchtet
> 1 == led aus.

...

von Zwei_Fragende (Gast)


Lesenswert?

die frage ist, warum wir dann spannung am pin selbst gemessen haben? 
(oder messfehler?)

bzw. warum funktioniert der direkte vergleich dann nicht?

von Michael H. (michael_h45)


Lesenswert?

Zwei_Fragende schrieb:
> bzw. warum funktioniert der direkte vergleich dann nicht?
Beitrag "Re: Unterschied zwischen (PIND & 0b00000010) == 0b00000010 und PIND == 0b00000010"
Das mal nochmal in aller Ruhe durchlesen.
Und das hier kann auch nicht schaden: Bitmanipulation

von g457 (Gast)


Lesenswert?

> aufbau: stk500

Randnotiz (wurde schon darauf hingewiesen): beim STK500 sind die LEDs 
active-low.

>    if (PIND == 0b00000010) //Bei diesem Statement leuchtet die LED immer
>    {
>        PORTB = 0b00000010;
>    }
>    else
>    {
>        PORTB = 0b00000000;
>    }

Die LED leuchtet immer, also wird immer der else(!)-Zweig ausgeführt. 
Das wird er nur, wenn die Bedingung 'PIND == 0b00000010' immer falsch 
ist. Wenn ich das richtig interpretiert hab, dann habt ihr D.1 auf Input 
mit Pullup gesetzt, der Rest vom PortD ist Input ohne Pullup. Ich 
vermute jetzt mal ganz wild, dass ihr den Rest vom PortD nicht auf ein 
festes Niveau gezogen habt (per Pullup/-down), also ist der Rest vom 
PortD floating ('mal so mal so').

Ergo wird PIND immer 'irgendwas' liefern, mal 0b101001x1 (x ist der 
Zustand des Tasters), mal 0b001100x0, und mal irgendwas anderes. 
Vielleicht auch irgendwall mal 0b00000010. Aber eben nur vielleicht. 
Deswegen wird obige Bedingung (fast) immer falsch sein.

Aber eigentlich interessiert ihr euch bei der Abfrage ja nur für den 
einen Eingang, den einen an dem der Taster hängt. Das kann man dann auch 
ausdrücklich so formulieren:
    if (PIND & 0b00000010)
    [Rest wie gehabt]
Das maskiert alle uninteressanten Eingänge aus. Übrig bleibt genau der 
Zustand vom Taster, nämlich genau '0b0000010'/true oder 
'0b00000000'/false. Und sonst nix.

Gibt übrigens auch einen schönen Artikel [1] dazu (am besten den Rest 
auch noch gleich lesen ;-)

HTH

[1] 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

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.