Einsteigerfrage Bit

Gast #4435608
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
Gast #4435615
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?
Gast #4435733
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.
Gast #4435734
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é
Gast #4435736
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?
Gast #4435740
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?
Gast #4435743
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é
Gast #4435744
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 :)
Gast #4435747
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.
Gast #4435748
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é
Gast #4435761
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)?
Gast #4435767
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?
Gast #4435768
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.
Gast #4435833
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! :-)
Gast #4435840
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.
Gast #4435846
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.

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