Forum: Mikrocontroller und Digitale Elektronik Verknüpfungen, Ich verstehe den Schritt nicht.


von Peter M. (allforone)


Lesenswert?

Hallo Freunde der Sonne,

Mein Problem:
if(!(PIND & (1<<PIND2)))

Ich verstehe den Schritt hier einfach nicht.
Kurz zum Hintergrund:
PIND nimmt entgegen ( 0 oder 1) ob Taster gedrückt ist oder nicht.
PIND2 stellt das 2. Bit dar, an dem hängt der Schalter.
Wenn das Bit auf 0 gesetzt ist, ist der Schalter gedrückt.

if(!(PIND & (1<<PIND2))) //Wenn das erfüllt ist, ist der Schalter 
gedrückt.

Ich verstehe nur nicht wieso.
Meine Vorgehensweise:

1. Phase: Schalter nicht gedrückt => PIND=11111111

if(!(11111111 & 00000100))
if(!(00000100))

Jetzt komme nicht mehr weiter, dachte bitweises UND hat nichts mit 
Wahrheitswerten zu tun?! Das ist weder 0 noch 1 am Ende.

2. Phase: Schalter gedrückt => PIND = 11111011

if(!(11111011 & 00000100))
if(!(0)
if(1)

Kann man if(1) mit if(true) gleichsetzen?

Eventuell kann mal jemand Klarheit schaffen.

Vielen Dank!

von Timmo H. (masterfx)


Lesenswert?

if(blubb) ist immer dann wahr wenn der "blubb" ungleich "0" ist. Also 
auch bei 1,2,4,8,16...
Da (PIND & (1<<PIND2)) > 0 ist, wenn PD2 HIGH ist, ist eben auch die 
Bedingung wahr. Und wenn man "wahr" negiert mit !(PIND & (1<<PIND2)) 
kommt eben "0" raus.

von Karl H. (kbuchegg)


Lesenswert?

! ist die logische Negation. Hat also im eigentlichen Sinne nichts mit 
bitweisen Dingen zu tun.

In C sind die logischen Bedingungen so definiert:
  alles was 0 ist, gilt als logisch falsch - FALSE
  alles was ungleich 0 ist, gilt als logisch wahr - TRUE

Beachte: ungleich 0. Da wird nicht 1 gefordert!

> 1. Phase: Schalter nicht gedrückt => PIND=11111111
>
> if(!(11111111 & 00000100))
> if(!(00000100))

00000100  ist ungleich 0. Welcher Zahlenwert das genau ist könnte man 
ermmitteln, spielt aber im Grunde keine Rolle. Alleine dadurch, dass da 
ein Bit auf 1 gesetzt ist, wissen wir: das kann nicht die Zahl 0 sein. 
Bei einer 0 wären alle Bits auf 0.
ungleich 0 bedeutet aber - logisch wahr - TRUE. Und nur das ist für das 
! entscheidend. Aus Sicht des ! steht da also

  if( !TRUE )     // lies: nicht TRUE

nun, !TRUE (nicht TRUE) ist aber logisch falsch - FALSE.

daher steht da

  if( FALSE )

und daher wird dieser Pfad auch nie genommen. Denn ins if geht es ja nur 
hinein, wenn der Ausdruck wahr ist.

Der springende Punkt ist ganz einfach der, dass es für ein logisches 
TRUE genügt, wenn irgendein Bit gesetzt ist. Denn alles, was als Zahl 
gesehen ungleich 0 ist, gilt als logisches wahr (TRUE).


Daher ist es auch wichtig, zwischen den logischen und den binären 
Operationen zu unterscheiden:

  binär       logisch       Operation
 ---------------------------------------
   &             &&           UND
   |             ||           ODER
   ~             !            NICHT
   ^                          EXCLUSIV ODER (da gibt es keine logische
                                             Operation dazu


die binären Operationen arbeiten auf Bitebene und verknüpfen jeweils die 
Bitpositionen, das Ergebnis ist wieder ein Bithaufen. Die logischen 
Operationen bewerten zuerst ihre Operanden ob sie 0 oder nicht 0 (FALSE 
oder TRUE) sind, das Ergebnis ist entweder FALSE (0) oder TRUE (1). Und 
in dem Fall kommt dann auch für TRUE eine 1 heraus. 1 ist genauso gut 
wie jede andere Zahl ungleich 0 und auf irgendetwas muss man sich ja 
einigen, wenn aus dem System heraus selbst ein Wahrheitswert TRUE 
generiert werden muss.

von Peter M. (allforone)


Lesenswert?

Vielen Dank für eure Antworten. Jetzt sind hierbei für mich alle 
Unklarheiten geklärt.

von Peter D. (peda)


Lesenswert?

Karl Heinz Buchegger schrieb:
> In C sind die logischen Bedingungen so definiert:
>   alles was 0 ist, gilt als logisch falsch - FALSE
>   alles was ungleich 0 ist, gilt als logisch wahr - TRUE

Wobei C aber immer 1 als wahr zurück geben muß, also:
1
y = !!x;
2
// x  y
3
// -1 1
4
// 0  0
5
// 1  1
6
// 2  1
7
// 3  1 usw.

D.h. das hier funktioniert nicht:
1
if( (PINB & 1) & (PINC & 2) )
aber das hier:
1
if( !!(PINB & 1) & !!(PINC & 2) )


Peter

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.