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

OP #3817803
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
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.
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.