Unterschied zwischen (PIND & 0b00000010) == 0b00000010 und PIND == 0b00000010

Gast #1769497
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
Gast #1769507
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ß
#1769525
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?
Gast #1769537
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?
Gast #1769549
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
}
Gast #1769587
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren