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
> 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.
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é
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?
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?
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é
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 :)
> 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.
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é
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)?
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é
> 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?
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.
> 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;
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?
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
> 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! :-)
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.
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.
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 ..."