Forum: Mikrocontroller und Digitale Elektronik Einsteigerfrage Bit


von Rippe (Gast)


Lesenswert?

Hallo Liedesgenossen,
in diesem Forum:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

bin ich gerade bei dem Thema Zugriff auf I/O-Ports.


Eine 1= Out und 0= In, das habe ich verstanden.

Nun haben wir dieses Port DDRB mit folgender Pinbelegung:

0 | 0 | 0 | 1 | 1 | 1 | 1 | 1


Weiter unten steht nun "Weitere Beispiele":

Weitere Beispiele:

  // Alle Pins des Ports B als Ausgang definieren:
  DDRB = 0xff;

Das ist mir klar, jetzt sind alle auf 1, also

DDR = 1 1 1 1 1 1 1 1

aber das nächste Beispiel:


  // Pin0 wieder auf Eingang und andere im ursprünglichen Zustand 
belassen:
  DDRB &= ~(1 << DDB0);

habe ich nicht verstanden.

Umgeschrieben steht jetzt da:
DDRB = DDRB & ~(1 << DDB0)

also


      1 1 1 1 1 1 1 1

&     0 0 0 0 0 0 0 1

=     0 0 0 0 0 0 0 1

Stimmt das so? Das deckt sich nicht mit der Aussage "Pin0 wieder auf 
Eingang und andere im ursprünglichen Zustand belassen", weil ja Pin0 ein 
Ausgang ist.

Vielen Dank!
VG

von tilde (Gast)


Lesenswert?

Rippe schrieb:
> Umgeschrieben steht jetzt da:
> DDRB = DDRB & ~(1 << DDB0)
>
> also
>
>
>       1 1 1 1 1 1 1 1
>
> &     0 0 0 0 0 0 0 1
>
> =     0 0 0 0 0 0 0 1

Wo ist denn da bei deiner also Rechnung die Tilde (~) abgeblieben?

von asdf (Gast)


Lesenswert?

Rippe schrieb:
> Umgeschrieben steht jetzt da:
> DDRB = DDRB & ~(1 << DDB0)
                ^----Das hast du übersehen
>
> also
>
>       1 1 1 1 1 1 1 1
> &     0 0 0 0 0 0 0 1
> =     0 0 0 0 0 0 0 1
>
> Stimmt das so? Das deckt sich nicht mit der Aussage "Pin0 wieder auf
> Eingang und andere im ursprünglichen Zustand belassen", weil ja Pin0 ein
> Ausgang ist.

Du hast das "~" übersehen :-)

>       1 1 1 1 1 1 1 1
> &     1 1 1 1 1 1 1 0
> =     1 1 1 1 1 1 1 0

So besser?

von Ich bin wie Duhu -ahaha! (Gast)


Lesenswert?

asdf schrieb:
> Du hast das "~" übersehen :-)

Wie sowas nur passieren kann, wo doch die C-Syntax so übersichtlich und 
klar wie Quellwasser ist...

von Rippe (Gast)


Lesenswert?

Danke Leute,
was ich nicht verstanden habe, warum macht man nicht einfach

DDBR = (1 << DDB0)??

Liegt es daran, dass DDBR vorher 1 1 1 1 1 1 1 1 war?

von WerNichtFragtBleibt (Gast)


Lesenswert?

> DDBR = (1 << DDB0)??

Weil du so DDRB auf 0b00000001 setzt, du aber 0b11111110 haben willst?
Das steht doch im Kommentar darüber:

> // Pin0 wieder auf Eingang und andere im ursprünglichen Zustand
> belassen:


DDRB &= ~(1 << X);

Damit veränderst du NICHTS bis auf X.

Hoffe, es wird klarer.

von Rene H. (Gast)


Lesenswert?

Rippe schrieb:
> Danke Leute,
> was ich nicht verstanden habe, warum macht man nicht einfach
>
> DDBR = (1 << DDB0)??
>
> Liegt es daran, dass DDBR vorher 1 1 1 1 1 1 1 1 war?

Kann man auch machen, aber dann muss man wissen was in DDBR steht.

Mit obiger Schreibweise, weiss man, dass man nur das eine Bit verändert 
und nicht alle 8 Bits.

Grüsse,
René

von asdf (Gast)


Lesenswert?

Rene H. schrieb:
> Rippe schrieb:
>> Danke Leute,
>> was ich nicht verstanden habe, warum macht man nicht einfach
>>
>> DDBR = (1 << DDB0)??
>>
>> Liegt es daran, dass DDBR vorher 1 1 1 1 1 1 1 1 war?
>
> Kann man auch machen, aber dann muss man wissen was in DDBR steht.
>
Wirklich? Wie kriegst du damit das Bit0 auf 0?

von Rippe (Gast)


Lesenswert?

WerNichtFragtBleibt schrieb:
>> DDBR = (1 << DDB0)??
>
> Weil du so DDRB auf 0b00000001 setzt, du aber 0b11111110 haben willst?
> Das steht doch im Kommentar darüber:
>
>> // Pin0 wieder auf Eingang und andere im ursprünglichen Zustand
>> belassen:
>
> DDRB &= ~(1 << X);
>
> Damit veränderst du NICHTS bis auf X.
>
> Hoffe, es wird klarer.

Ah, sorry, ich meine

DDBR = (0 << DDB0), damit würde ich doch auch 11111110 kriegen, wenn ich 
vorher DDRB = 11111111 hatte?

von Rene H. (Gast)


Lesenswert?

asdf schrieb:
> Rene H. schrieb:
> Rippe schrieb:
> Danke Leute,
> was ich nicht verstanden habe, warum macht man nicht einfach
>
> DDBR = (1 << DDB0)??
>
> Liegt es daran, dass DDBR vorher 1 1 1 1 1 1 1 1 war?
>
> Kann man auch machen, aber dann muss man wissen was in DDBR steht.
>
> Wirklich? Wie kriegst du damit das Bit0 auf 0?

Ja natürlich, ich habe das mal ignoriert, weil es um Bitmanipulation 
geht.

Grüsse,
René

von Rippe (Gast)


Lesenswert?

asdf schrieb:
> Rene H. schrieb:
>> Rippe schrieb:
>>> Danke Leute,
>>> was ich nicht verstanden habe, warum macht man nicht einfach
>>>
>>> DDBR = (1 << DDB0)??
>>>
>>> Liegt es daran, dass DDBR vorher 1 1 1 1 1 1 1 1 war?
>>
>> Kann man auch machen, aber dann muss man wissen was in DDBR steht.
>>
> Wirklich? Wie kriegst du damit das Bit0 auf 0?

habe es korrigiert, siehe oben drüber im letzten post :)

von WerNichtFragtBleibt (Gast)


Lesenswert?

> DDBR = (0 << DDB0), damit würde ich doch auch 11111110 kriegen, wenn
> ich vorher DDRB = 11111111 hatte?

Nein. DDRB = (0 << 0) ist gleichbedeutend mit DDRB = 0, also 0b00..00.

Durch lediglich ein = setzt du noch das ganze Register neu und nicht nur 
ein Bit.

von Rene H. (Gast)


Lesenswert?

Rippe schrieb:
> WerNichtFragtBleibt schrieb:
> DDBR = (1 << DDB0)??
>
> Weil du so DDRB auf 0b00000001 setzt, du aber 0b11111110 haben willst?
> Das steht doch im Kommentar darüber:
>
> // Pin0 wieder auf Eingang und andere im ursprünglichen Zustand
> belassen:
>
> DDRB &= ~(1 << X);
> Damit veränderst du NICHTS bis auf X.
> Hoffe, es wird klarer.
>
> Ah, sorry, ich meine
>
> DDBR = (0 << DDB0), damit würde ich doch auch 11111110 kriegen, wenn ich
> vorher DDRB = 11111111 hatte?

Nein, dann ist das Ergebnis DDBR = 0000 0000.

Grüsse,
René

von Rene H. (Gast)


Lesenswert?

Sorry, Rippe, falsch zitiert. Ich meinte das Post vom TO.

Grüsse,
R.

von Rippe (Gast)


Lesenswert?

Ach, jetzt verstehe ich das erst!! Das heisst, man kommt um diese 
Operatoren nicht drumherum....

von WerNichtFragtBleibt (Gast)


Lesenswert?

Ich wollte übrigens noch einmal darauf Hinweisen, dass es 
Data-Direction-Register bedeutet und mit DDRx nicht mit DDxR abgekürzt 
wird?! :)

von Rippe (Gast)


Lesenswert?

Nochmal ne Frage, um auf

00011111 zu kommen, kann man folgendes machen:

DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << 
DDB4);


Dies bedeutet, dass wenn man 11111110 haben will, macht man:

DDRB |= (0 << DDB0)?

von Rene H. (Gast)


Lesenswert?

Rippe schrieb:
> Ach, jetzt verstehe ich das erst!! Das heisst, man kommt um diese
> Operatoren nicht drumherum....

Man kommt drum rum, es ist nur umständlicher und fehleranfälliger im 
Endeffekt.

Grüsse,
René

von WerNichtFragtBleibt (Gast)


Lesenswert?

> Dies bedeutet, dass wenn man 11111110 haben will, macht man:
> DDRB |= (0 << DDB0)?

Sorry. Ich bin kein Freund von keiner direkten Hilfe, aber du solltest 
dir echt einmal Bitmanipulationen durchlesen und auf einem Zettel 
durchgehen. Was soll bitte

  (xxxx xxxx)
| (0000 0000)

bewirken?

von Rene H. (Gast)


Lesenswert?

Rippe schrieb:
> Nochmal ne Frage, um auf
>
> 00011111 zu kommen, kann man folgendes machen:
>
> DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 <<
> DDB4);


Nein, dann kommst du auf: xxx1 1111

> Dies bedeutet, dass wenn man 11111110 haben will, macht man:
>
> DDRB |= (0 << DDB0)?

Nein, dann kommst Du auf xxxx xxxx.

Du musst wissen was drin stand, um zu wissen was rauskommt.

von Rene H. (Gast)


Lesenswert?

Noch was, ein or mit 0 macht Null Sinn. Ein and wäre angebracht.

von WerNichtFragtBleibt (Gast)


Lesenswert?

> Noch was, ein or mit 0 macht Null Sinn. Ein and wäre angebracht.

Ein And mit 0 macht aber auch keinen Sinn, oder? foo = 0 ist etwas 
kürzer als foo &= 0;

von Rene H. (Gast)


Lesenswert?

WerNichtFragtBleibt schrieb:
> Noch was, ein or mit 0 macht Null Sinn. Ein and wäre angebracht.
>
> Ein And mit 0 macht aber auch keinen Sinn, oder? foo = 0 ist etwas
> kürzer als foo &= 0;

Du willst uns veräppeln, nicht?

von DirkB (Gast)


Lesenswert?

Rippe schrieb:
> DDBR = (0 << DDB0), damit würde ich doch auch 11111110 kriegen, wenn ich
> vorher DDRB = 11111111 hatte?

Damit verschiebst du 0.
Also  0 0 0 0 0 0 0  um DDB0 Stellen verschoben. Und das bleibt 0

von WerNichtFragtBleibt (Gast)


Lesenswert?

> Dies bedeutet, dass wenn man 11111110 haben will, macht man:
> DDRB |= (0 << DDB0)?

Deine Antwort:

> Noch was, ein or mit 0 macht Null Sinn. Ein and wäre angebracht.

=>

> Du willst uns veräppeln, nicht?

Nein, offenbar du! :-)

von WerNichtFragtBleibt (Gast)


Lesenswert?

Oh, jetzt sehe ich den Fehler.
Die erste Anweisung sollte natürlich foo = foo; heißen. Dennoch war 
deine Antwort Quatsch.

von Rene H. (Gast)


Lesenswert?

WerNichtFragtBleibt schrieb:
> Dies bedeutet, dass wenn man 11111110 haben will, macht man:
> DDRB |= (0 << DDB0)?
>
> Deine Antwort:
>
> Noch was, ein or mit 0 macht Null Sinn. Ein and wäre angebracht.
>
> =>
>
> Du willst uns veräppeln, nicht?
>
> Nein, offenbar du! :-)

:) ok, ich meinte ein 0 als Bit im or. Es besagt nur, fass das Bit nicht 
an.

War nicht klar ausgedrückt.

von WerNichtFragtBleibt (Gast)


Lesenswert?

Man, meine "Korrektur" ist Schwachsinn. Mein ursprünglicher Post war 
korrekt. Warum kann man als Gast nicht editieren? Ich werde noch ganz 
kirre.

Ja, es war nicht klar ausgedrückt und jetzt verstehe ich auch was du 
meintest.

von Kenner (Gast)


Lesenswert?

WerNichtFragtBleibt schrieb:
> Warum kann man als Gast nicht editieren? Ich werde noch ganz
> kirre.

Dann solltest du als Gast deine Antwort vor dem Absenden einfach ganz 
ganz ganz genau noch einmal lesen.

Sehr oft ist es auch besser, nach Dieter Nuhr zu verfahren: "Wenn man 
keine Ahnung hat, einfach mal die ..."

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.