Einsteigerfrage Bit

Gast #4435608
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
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
> 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
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
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
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
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
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
> 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
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 #4435756
Ich wollte übrigens noch einmal darauf Hinweisen, dass es 
Data-Direction-Register bedeutet und mit DDRx nicht mit DDxR abgekürzt 
wird?! :)
Gast #4435761
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
> 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
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 #4435775
> 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;
Gast #4435833
> 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
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
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.
Gast #4436314
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 ..."

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.