Wenn ich zum Beispiel DDRC=0x03 deklariert habe. Dann bedeutet das ja, PINC0 bis PINC3 sind Ausgänge und die anderen sind Eingänge. Wenn ich jetzt zu einem späteren Zeitpunkt DDRC|=(1<<PC4); in irgendeiner anderen Headerdatei deklariere, dann würde das doch bedeuten, dass die vorherigen Ausgänge keine mehr sind oder? Worauf ich eigentlich hinaus will ist folgendes: Wenn ich am PORTD eines ATmega 644P beide UASARTS benutze an dann an dem gleiches Register ein Bewegungssensor anschließe und dann zum Beispiel DDRC|=(1<<PD4) deklariere, kann das dann Probleme auslösen, da die anderen Register vielleicht sich dann ändern? Wäre für eine Erklärung dankbar
Tommy schrieb: > Wenn ich zum Beispiel DDRC=0x03 deklariert habe. Dann bedeutet das ja, > PINC0 bis PINC3 sind Ausgänge und die anderen sind Eingänge. <Nitpicking> PINC0, PINC1 sind Ausgänge. Das Bitmuster für 0x03 lautet 0b00000011 <Nitpicking aus> > Wenn ich > jetzt zu einem späteren Zeitpunkt DDRC|=(1<<PC4); in irgendeiner anderen > Headerdatei > deklariere, dann würde das doch bedeuten, dass die vorherigen Ausgänge > keine mehr sind oder? warum? Da steht Oder
1 | DDRC |= (1<<PC4); |
ist in C die Kurzschreibweise für
1 | DDRC = DDRC | ( 1<<PC4 ); |
(und wenn man sich angewöhnen würde links und rechts vom Zuweisungsoperator ein Leerzeichen zu schreiben, dann könnte das auch ein Blinder mit Krückstock aus 5 Meter Entfernung ertasten. Wenn man natürlich alles in einer Wurst ohne irgendwelche Leerräume schreibt, dann sieht man solche Feinheiten viel schlechter) Alles was vor der Operation ein 1-Bit in DDRC hatte, hat es auch danach. Alles was vor der Operation ein 0-Bit in DDRC hatte, hat es auch danach, mit der einen Ausnahme von PC4. PC4 ist nach der Operation mit Sicherheit ein 1 Bit. > Worauf ich eigentlich hinaus will ist folgendes: Wenn ich am PORTD eines > ATmega 644P beide UASARTS benutze an dann an dem gleiches Register ein > Bewegungssensor anschließe und dann zum Beispiel DDRC|=(1<<PD4) > deklariere, kann das dann Probleme auslösen, da die anderen Register > vielleicht sich dann ändern? Nein. Kann es nicht.
hallo Tommy, nein DDRC = 0x03 schaltet PC0 und PC1 als Ausgang PC0 = 0x01 PC1 = 0x02 ---------- 0x03 Das Statement DDRC |= (1<<PC4); bedeutet DDRC = DDRC | (1<<PC4) d.h. PC4 wird als Ausgang geschaltet die restlichen Bits des Registers werden nicht geändert. Ob DDRC |= (1<<PD4) funktioniert mußt du selber ausprobieren, evtl. meckert der Compiler. An Port D wird es auf jeden Fall nichts ändern. Schau nochmals ins Tutorial: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#IO-Register_als_Parameter_und_Variablen Grüße kaffeetas
hi wenn ich das dann richtig verstanden habe ist das DDRC &= ~( (1<<PC4)); //Eingang, bit wird gelöscht das gegenteil zu dem (wie im tutorial) DDRC |= (1<<PC4); //Ausgang, bit wird gesetzt oder wird da wirklich mit und verknüpft sprich 1 1 1 0 - - 1 0 usw
Alf Tenner schrieb: > hi wenn ich das dann richtig verstanden habe ist das > > DDRC &= ~( (1<<PC4)); //Eingang, bit wird gelöscht > > das gegenteil zu dem (wie im tutorial) > > DDRC |= (1<<PC4); //Ausgang, bit wird gesetzt > > oder wird da wirklich mit und verknüpft sprich da wird schon mit UND verknüpft :-) Aber du hast wahrscheinlich die Tilde ~ übersehen. Die dreht alle Bits um 1<<PC4 ist binär 00010000 ~(1<<PC4) 11101111 und das jetzt mit dem momentan vorhandenem Registerinhalt UND verknüpft, lässt alle Bits in Ruhe, bei denen in der ~(1<<PC4) Maske eine 1 war. Dort wo in der Maske eine 0 ist, wird im Ergebnis auch auf jeden Fall eine 0 auftauchen. -> Endeffekt: ~(1<<PC4) setzt gezielt PC4 auf 0. Und das war ja auch der Zweck der Übung.
aaaah ok danke übersehen nicht aber ich wußte nicht genau was es bedeutet. Um ehrlich zu sein hab ich noch so die ein oder anderen Probleme mit den Operatoren. Die einfachen wie == sind mir schon geläufig. Aber warum zb bei scanf("%d", &a); da ein % und ein & steht weiß ich nicht habs halt so hingenommen. Kann mir vorstellen das das & in dem fall nichts mit und zu tun hat, sonder es muß ja eine zuweißung sein. lernt man diese Verwendungen beim Training oder gibts da nen gutes open source skript wo diese operatoren eingehend erklärt werden
> scanf("%d", &a);
das "&" bedeutet in diesem fall einen pointer/zeiger auf a, der der
funktion übergeben wird. d.h. die funktion scanf ändern den inhalt der
variablen "a".
das "%" hat hier die funktion einer markierung für den compiler, damit
er erkennt, dass ein integer gelesen werden soll (d - integer, c - char,
f - float, ...)
Alf Tenner schrieb:
> lernt man diese Verwendungen beim Training
Das lernt man, indem man sehr Lehrbuch von vorne bis hinten durchackert
(durchlesen ist zuwenig) und die Übungsaufgaben da drinn macht.
Damit weiß man es zumindest schon mal. In Fleisch und Blut geht das
Ganze über, indem man programmiert, programmiert, programmiert
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.