Forum: PC-Programmierung Warum Bitmaske "&= ~" und nicht "~="


von Simon O. (mola-4-speed)


Lesenswert?

Guete Abend,

Ich bin gerade dabei zu lernen, wie das mit dem Programmieren von 
Mikrocontrollern in C funktioniert. Ich bin noch ganz jungfräulich.
Es geht um die Adressierung eins Bits:
In dem Tutorial kommt folgender Befehl vor, den ich nicht nachvollziehen 
kann:
1
DDRB &= ~ (1 << PINB1);

Was der macht, verstehe ich. PORT B, BIT 1 wird auf "Eingang" bzw. 1 
gesetzt.

Warum geht der folgende Befehl nicht, ist das nicht das Gleiche:
1
DDRB = DDRB ~ 0b00000010;

Ich verstehe nicht die Kombination aus:
1
 &= ~

Merci

von Gregor O. (zappes)


Lesenswert?


von M. S. (elpaco)


Lesenswert?

Das & ist ein logisches AND, das brauchst du hier. Es bewirkt, dass nur 
dann eine 1 gesetzt wird, wenn beide Bits die über das & verknüpft sind 
eine 1 haben.

Also:
A B Ergebnis
0 0 0
0 1 0
1 0 0
1 1 1

Das ~ invertiert ein Bit:

A ~A
0  1
1  0

~(1<<PINB1) in deinem Beispiel also schreibt an die PINB1 zugehörige 
Stelle eine 0, indem es die 1 invertiert.

Wird die so geschriebene 0 an dieser Stelle also über ein & mit DDRB 
verknüpft, dann wird (da 0&x=0) an der betreffenden Stelle im 
DDRB-Register eine 0 gesetzt.

DDRB &= ~(1<<PINB1) wird allerdings nicht funktionieren, da PINB1 den 
Eingang referenziert, DDRB aber das Register für die Richtung. Eher DDB1 
statt PINB1.

von Max H. (hartl192)


Lesenswert?

Simon O. schrieb:
> Warum geht der folgende Befehl nicht
> DDRB = DDRB ~ 0b00000010;
Syntax error
> Ich verstehe nicht die Kombination aus: &= ~
DDRB &= ~ (1 << PINB1); ist voll ausgeschrieben
DDRB=DDRB&~(1<<PINB1); und das dann
DDRB=DDRB&~(1<<1); und das dann
DDRB=DDRB&~0b00000010; und das dann
DDRB=DDRB&~0b11111101;
Durch das bitweise UND bleiben in DDRB alle bits, außer bit 1 
unverändert, das wird auf null gesetzt.

x&1=x
X&0=0

: Bearbeitet durch User
von N.B. (Gast)


Lesenswert?

M. S. schrieb:
> Das & ist ein logisches AND, das brauchst du hier.

Das & ist ein bitweises AND. Ein logisches AND hätte den Operator &&
http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren

von Simon O. (mola-4-speed)


Lesenswert?

Manchmal ist man doch Froh euch zu haben... Genial, nu habe ich es 
verstanden. So schnell kann eine Stunde nachdenken in Sekunden zu Nichte 
gemacht werden.

Tuse Takk

von Max H. (hartl192)


Lesenswert?

Simon O. schrieb:
> Was der macht, verstehe ich. PORT B, BIT 1 wird auf "Eingang" bzw. 1
> gesetzt.
Nicht ganz, das bit wird auf 0 gesetzt und das bedeutet beim AVR 
Eingang.

M. S. schrieb:
> DDRB &= ~(1<<PINB1) wird allerdings nicht funktionieren, da PINB1 den
> Eingang referenziert, DDRB aber das Register für die Richtung. Eher DDB1
> statt PINB1.
PINB1 und DDB1 sind wahrscheinlich beide als 1 definiert und es wird 
beides problemlos funktionieren.

: Bearbeitet durch User
von Simon O. (mola-4-speed)


Lesenswert?

Max H. schrieb:
> Nicht ganz, das bit wird auf 0 gesetzt und das bedeutet beim AVR
> Eingang.

Sorry, war ein Schreibfehler... sollte 0 sein.

von Simon O. (mola-4-speed)


Lesenswert?

Zu früh gefreut, doch nicht verstanden.

Das Ergebnis soll sein, dass der PIN1 am PORTB auf Eingang(0) gesetzt 
wird.

M. S. schrieb:
> ~(1<<PINB1) in deinem Beispiel also schreibt an die PINB1 zugehörige
> Stelle eine 0, indem es die 1 invertiert.

Durch das Bitweises AND wird ja nicht zwangsweise das Bit auf 1 gesetzt. 
Im Fall, dass das Bit ursprünglich eine 0 war, bleibt es doch weiterhin 
0. Nun invertiere ich es und es wird eine 1 also ein Ausgang...

Wo ist mein Denkfehler?

von Max H. (hartl192)


Lesenswert?

1<<PINB1 ist 0b00000010, das invertiert ist dann 0b11111101. Durch das 
bitweiße UND bleiben alle bit die mit 1 verundet werden gleich und die 
die mit 0 verundet werden gehen sicher auf null.

von Simon O. (mola-4-speed)


Lesenswert?

OK, Got it!

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.