Forum: Mikrocontroller und Digitale Elektronik AVR Register Frage


von Tommy (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von kaffeetas (Gast)


Lesenswert?

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

von Tommy (Gast)


Lesenswert?

Vielen Dank für die Antworten! Wieder ein Groschen gefallen!

von Alf T. (rumkugeln)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alf T. (rumkugeln)


Lesenswert?

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

von gast (Gast)


Lesenswert?

> 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, ...)

von Alf T. (rumkugeln)


Lesenswert?

ok danke

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.