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
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?
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?
asdf schrieb: > Du hast das "~" übersehen :-) Wie sowas nur passieren kann, wo doch die C-Syntax so übersichtlich und klar wie Quellwasser ist...
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?
> 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é
Ach, jetzt verstehe ich das erst!! Das heisst, man kommt um diese Operatoren nicht drumherum....
Ich wollte übrigens noch einmal darauf Hinweisen, dass es Data-Direction-Register bedeutet und mit DDRx nicht mit DDxR abgekürzt wird?! :)
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! :-)
Oh, jetzt sehe ich den Fehler. Die erste Anweisung sollte natürlich foo = foo; heißen. Dennoch war deine Antwort Quatsch.
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 ..."
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.