Forum: Compiler & IDEs Idiotenfrage zu while Abfrage


von Luqman K. (scorpions411)


Lesenswert?

Hallo Forum,

es geht um die serielle Datenübertragung. Und ich habe eine ganz prmitve 
Frage zu einer while Abfrage.

while ((UCSR1A & (1 << RXC1)) == 0)

Das RXC1 Bit ist ja Bestandteil des UCSR1A - Register.
Das RXC1 Bit ist das siebte und somit höchstwertigste Bit.
Meine Frage ist nun wie verstehe ich die UND- Verknüpfung ?
Ist mit dieser Aussage gemeint dass die whil-Bedingung erfüllt ist wenn 
das RXC1-Bit im UCSR1A Register = 0 ist ?

und wenn ich schonmal ein neuen Thread öffne kann ich ja auch gleich 
fragen was es mit diesen Zahlen auf sich hat.
Das Register wird im Handbuch mit USCRnA beschrieben.
Um es in meinem Programm an zu sprechen muss ich für das n eine 1 
schreiben. Gibt es mehrere UCSRnA Register ?? Also UCSR1A, UCSR2A,.... ?
Falls ja welchem zweck dienen sie?


ich habe mich heute angemeldet, nutze diese Seite aber schon seit Tagen 
um mit einem Atmega128 zu arbeiten.
Mein Name ist Luke und ich studiere Elektrotechnik und 
Informationstechnik. Da ich verschieden Vorlesungen aus 
unterschiedlichen Semestern besuche, überschneiden sich meine meine 
Vorlesungen und die Mikroprozessor Vorlesung musste daran glauben. Ich 
besuche dennoch das Labor und versuche mir die Sachen selbst mit Büchern 
und Internet bei zu bringen. Diese Seite ist echt der Hammer und ich 
hätte nichtmal das erste Labor überstanden ohne die Seite. Also großes 
Lob an all die hier arbeiten und vielen Dank im Voraus für eure Hilfe.

Schöne Grüße aus Frankfurt

Luke

von Klaus W. (mfgkw)


Lesenswert?

Luqman Khan schrieb:
> Ist mit dieser Aussage gemeint dass die whil-Bedingung erfüllt ist wenn
> das RXC1-Bit im UCSR1A Register = 0 ist ?

ja

Bzw. etwas genauer:
Es wird die 1 um entsprechend viele Bits nach links geschoben, sodaß man 
einen Wert hat in dem nur das gewünschte Bit gesetzt ist.
Das wird dann mit & verknüpft mit UCSR1A.
Das Ergebnis davon hat entweder dieses Bit gesetzt, falls es in UCSR1A 
auch gesetzt ist (egal, wie die andeen Bits in UCSR1Aaussehen), oder es 
ist komplett 0.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Luqman Khan schrieb:
> Gibt es mehrere UCSRnA Register ?? Also UCSR1A, UCSR2A,.... ?
> Falls ja welchem zweck dienen sie?

je nach Typ des AVR kann er mehrere U(S)ART unterstützen, dann müssen 
die Register doch irgendwie auseinandergehalten werden.

Der Atmega128 hat zwei: 0 und 1
Stand früher mal im Datenblatt :-)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?


von Luqman K. (scorpions411)


Lesenswert?

Vielen Dank für deine schnelle Rückmeldung Klaus.

Also (1<<RXC1) heißt in diesem Fall sowas wie (1<<7) da RXC1 das siebte 
Bit ist.
Aber RXC1 ist doch Bestandteil von UCSR1A.
Wird somit nicht UCSR1A per & mit UCSR1A veglichen ?
Das Kapitel Bitmanipulation auf dieser Seite habe ich selbstverständlich 
schon gesehen. Dort wird, das zu bearbeitende Register mit einer Maske 
verglichen und somit manipuliert.
Also um Bit 3 und 5 beispielsweise im UCSR1A-Register zurück zu setzen:

UCSR1A &= ~((1<<3)|(1<<5))

Maske wird invertiert. Damit werden alles 1er außer die zu bearbeitende 
Bits.
Die 1er sorgen dafür das die anderen Bits unverändert bleiben.
Und die 0er bei den zu bearbeitenden Bits sorgt dafür dass das sie im 
Register auf jeden fall auch 0 werden. Egal ob es 1 war oder ohnehin 
schon 0 war.

Um nochmal zurück zum Beispiel zu kommen:
Das was da oben steht erscheint mir wie:

"Byte" & "Bit" = 0


Man kann doch kein Byte mit einem Bit &-verknüpfen.
Und falls die rechte seite kein Bit sein soll sondern das ganze Byte 
repräsentieren soll dann erscheint es mir so als steht da:

UCSR1A & UCSR1A =

Das macht aber auch keinen Sinn weil das Ergebniss immer UCSR1A bleiben 
wird.

Und zu guter letzt. Warum steht da =0 ? Ist damit das gesammte Byte 
gemeint oder nur das zu betrachende Bit ? also heißt die =0 sowas wie 
=0000 0000
oder sowas wie =0xxx xxxx wobei die x=dont cares repräsentieren.

Ich hoffe ihr habt Verständnis dafür das mir sehr sehr wichtige 
Grundlagen fehlen wegen Mangel an Vorlesungen.

Vielen Dank nochmals.

LG Luke

von Georg A. (georga)


Lesenswert?

> Wird somit nicht UCSR1A per & mit UCSR1A veglichen ?
> Man kann doch kein Byte mit einem Bit &-verknüpfen.

Nein und doch ;)

Das (1<<7) berechnet nur die Maske (= 1000 0000), das wird mit dem 
Inhalt vom Register UND-verknüpft. War dessen oberstes Bit eine 1, kommt 
1000 0000 raus, sonst 0000 0000. Also hat man damit das eine Bit, was 
man eigentlich prüfen will, in ein für C testbares Byte überführt. Der 
Umstand kommt halt daher, dass es in C nicht möglich ist, direkt ein Bit 
zu prüfen (ala UCSR1A.7==1 oder sowas in der Art).

von Jan M. (mueschel)


Lesenswert?

Luqman Khan schrieb:
> Also (1<<RXC1) heißt in diesem Fall sowas wie (1<<7) da RXC1 das siebte
> Bit ist.
> Aber RXC1 ist doch Bestandteil von UCSR1A.
> Wird somit nicht UCSR1A per & mit UCSR1A veglichen ?

Laut Datenblatt ist RXC1 der Name eines Bits in UCSR1A. Davon weiß der 
C-Compiler aber nichts. Irgendwo in den Tiefen der Header-Dateien steht 
da einfach
#define RXC1   7
RXC1 ist also nichts anderes als die Zahl 7 und nur definiert damit du 
Bit-Namen aus dem Datenblatt abschreiben kannst und dir nicht merken 
musst, dass es Bit 7 ist.

Wenn du dich und andere verwirren willst, kannst du mit der Konstanten 
RXC1 natürlich auch jedes andere siebte Bit in beliebigen Registern 
ansprechen - es ist ja nichts anderes als die Zahl 7.

von Luqman K. (scorpions411)


Lesenswert?

Also heißt die Ausage:  while ((UCSR1A & (1 << RXC1)) == 0)


Wenn das RXC1 im UCSR1A-Register =0 ist , ist die Bedingung erfüllt. 
Vollkommen unabhängig von den anderen Bits.

Oh mein Gott.
Wie Primitiv.
Immer das selbe. Ich mach es mir immer so schwer XD.
Ganz lieben Dank an Georg und Jan.
Eure Antworten waren sehr hilfreich.

Liebe Grüße

Luke

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.