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
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
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
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
> 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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.