du setzt mit (1<<xxxx) einfach ein flag in einem byte (die xxxx sind die jeweilige bezeichnung)
also mit dem
UCSRB = (1<<RXEN)|(1<<TXEN);
setzt du einfach nur enable für receive & transmit
mfg
Hi,
ich habe schon sehr viel Erfahrung in der Programmierung mit Java. Auch habe ich schon mit C++ programmiert.
Seit ich einen Asuro habe, probiere ich an den Beispielprogrammen, die etwas hardwarenähere Programmierung in C zu kapieren.
Wenn ich da aber vor Zeilen wie:
stehe (siehe Beispielprogramm im Wiki: https://www.roboternetz.de/wiki/pmwi...sComVergleich2 ), dann stehe ich vor einem programmiertechnischen schwarzen Loch.Code:UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
Gibt es irgendwo eine Erklärung, was diese tollen Befehle darstellen sollen? Ich programmiere eigentlich lieber Objektorientiert, aber ich lerne auch gerne neues bzw. altes, aber bewährtes.
Ich würde mich freuen, wenn mir jemand entweder einen Link geben könnte, wo ich nachlesen kann, was diese Befehle bedeuten und ich auch lernen kann, wie ich sie selbst anwende, ohne nur von anderen Dateien zu kopieren, oder wenn es mir jemand einfach erklären könnte.
Danke
Unwissenheit ist ein Segen
du setzt mit (1<<xxxx) einfach ein flag in einem byte (die xxxx sind die jeweilige bezeichnung)
also mit dem
UCSRB = (1<<RXEN)|(1<<TXEN);
setzt du einfach nur enable für receive & transmit
mfg
Ok, und für was sind diese Bytes, gibt es da eine Liste?
und warum mache ich eine Zuweisung zu UCSRB?
Was kann ich dann mit dem UCSRB machen?
Unwissenheit ist ein Segen
RXEN ist eine #define irgendwo tief in den Headern (<AVR>/avr/include/avr/ioxxxx.h)
Es wird zu einer Konstanten aufgelöst, zB 3
Nachdem der Präprozessor über die Quelle gehuscht ist, steht noch da
(1<<3)
also eine 1 um 3 Stellen nach linke geschoben, also 1000 binär.
Man hat in dem Wert dadurch Bit 3 gesetzt. Mit | (bitweise oder) kann man mehrere solcher Werte -- oft auch als Maske bezeichnet -- überlagern.
Eine Maske, in der Bit 3 und 5 gesetzt sind, wäre dann (1<<3)|(1<<5).
Das geht in Java und C++ übrigens genauso, nur daß man in Java nicht direkt auf die Hardware greifen kann. Das Komplement erhält man mit ~ (nicht zu verwechseln mit ! (nicht))
~ dreht einfach alle Bits um 0 zu 1 und umgekehrt.
Eine Maske, in der alle Bits gesetzt sind ausser Bit 6 ist daher ~(1<<6)
Bit 6 in einer Variable zu löschen schreibt sich also so:
foo = foo & ~(1<<6);
oder kurz
foo &= ~(1<<6);
Für die arithmetischen Operationen hat man
| (oder)
& (und)
~ (not)
^ (exclusive or)
&=, |=, ^=
Für die logischen hat man
&& (und)
|| (oder)
! (nicht)
&&=, ||=
Disclaimer: none. Sue me.
Das sind nur BIT Manipulationen mit Konstanten.
In der avr.lib (C:\WinAVR\avr\include) sind Makros für die unterschiedlichen AVR Typen.
Das wird dann vom Compiler aufgelöst.
Prostetnic Vogon Jeltz
2B | ~2B, That is the Question?
The Answer is FF!
ucsrb/c sind register jeweils 1byte in deinem µC mit denen du einstellungen am usart festlegen kannst.
->datenblatt sollte dir da doch sehr weiterhelfen..
mfg
Lesezeichen