mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Register Frage


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
DDRC |= (1<<PC4);
ist in C die Kurzschreibweise für
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.

Autor: kaffeetas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Grüße
 kaffeetas

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten! Wieder ein Groschen gefallen!

Autor: Alf Tenner (rumkugeln)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alf Tenner (rumkugeln)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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, ...)

Autor: Alf Tenner (rumkugeln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.