AVR Register Frage

Gast #1292224
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.
Gast
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
Gast
> 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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.