Warum Bitmaske "&= ~" und nicht "~="

OP #3817803
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
#3817811
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.
#3817812
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
#3817835
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.
OP #3817865
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?

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