PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C für Programmierer



maze2k
30.10.2005, 22:47
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:

UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

stehe (siehe Beispielprogramm im Wiki: https://www.roboternetz.de/wiki/pmwiki.php?n=Main.BasComVergleich2 ), dann stehe ich vor einem programmiertechnischen schwarzen Loch.

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 :)

tristate
30.10.2005, 22:59
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

maze2k
30.10.2005, 23:13
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?

SprinterSB
30.10.2005, 23:15
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)
&&=, ||=

Vogon
30.10.2005, 23:21
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.

/* UART Status Register */
#define RXC 7
#define TXC 6
#define UDRE 5
#define FE 4
#define DOR 3
#define MPCM 0

/* UART Control Register */
#define RXCIE 7
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define CHR9 2
#define RXB8 1

tristate
30.10.2005, 23:22
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