Forum: Mikrocontroller und Digitale Elektronik C-Zeile (einfach)


von Peter (Gast)


Lesenswert?

Hallo zusammen,

ich Anfänger in C MC Programmierung versteh die folgende Zeile nicht
Wer weiß rat? (ist höchstwahrscheinlich sehr einfach, aber trotzdem
muss man erst mal wissen...)

outp ((1<<TXEN), UCR)

Ich weiß zwar das damit das TXEN Bit auf 1 gesetzt wird im Register UCR
aber wie (<< ist doch linksschieben?)

Warum kann man nicht schreiben:
outp (0x08,UCR)

Warum so umständlich?

Vielen Dank

Peter

von Peter D. (peda)


Lesenswert?

"Warum so umständlich?"

TXEN kann man verstehen, aber was 0x08 bedeutet, weißt Du später nicht
mehr.

Du kannst auch noch UCR durch 0x0A ersetzen bzw. warum schreibst Du
nicht gleich das ganze Programm komplett in Maschinencode ?
Das versteht dann garantiert keiner mehr (aber du warscheinlich auch
nicht).


Peter

von Peter (Gast)


Lesenswert?

Stimmt schon aber damit weiß ich immer noch nicht
wie ich durch die o.g Zeile durch << das Bit TXEN setze..

von Peter (Gast)


Lesenswert?

kann es so sein das damit gemeint ist das der Wert 1 vier mal nach links
verschoben wird (TXEN ist das 4.Bit (0-4))
dann steht eine 1 in TXEN
Oder nimmt man den Wert des ersten Bits und verschiebt ihn um 4 Stellen
nach links. Allerdings muss ich dann wissen welchen wert das Erste Bit
(Bit0) hat oder?

oder wie ist es sonst zu verstehen das z.B

a=8>>1 --> a hat den Wert 4 ergibt?

von crazy horse (Gast)


Lesenswert?

Sinn der Sache ist es, unabhängig von der tatsächlichen Bit- und
Byteadresse zu werden, die können sich von AVR zu AVR unterscheiden.
Mit der passenden inc-Datei wird automatisch die für diesen Prozessor
richtige Adresse erzeugt. Somit bleibt für einen Prozessor
geschriebener Code hardwareunabhängig für andere Prozessoren nutzbar.
Das nenne ich Vorteil. Nebenbei ist es besser lesbar, wenn man sich
erstmal daran gewöhnt hat.

von Matthias (Gast)


Lesenswert?

Hi

>> und << sind die Shiftoperatoren in C. Damit wird innerhalb eines
Bytes (beim GCC AFAIK in einem Wort) um n Stellen geschoben. Der Rest
der links oder rechts dazukommt wird mit 0en aufgefüllt.

1<<TXEN

TXEN ist also z.B. mit 3 definiert. Also wird 1 um 3 Stellen links
geschoben.
aus  0000 0001
wird 0000 1000

BTW:
du solltest outp() nicht mehr verwenden. Schreib UCR = (1<<TXEN);
Wenn du nur dieses eine Bit setzen möchtest ohne die anderen in diesem
Register zu verändern schreib UCR = UCR | (1<<TXEN); oder kürzer UCR |=
(1<<TXEN);


Matthias

von Peter (Gast)


Lesenswert?

Hallo Matthias,

das ist doch mal eine Antwort...
D.h also ich setze das gesamte Register auf den absoluten Wert 1 (d.h
bit1-bit7 sind 0)und Verschiebe es dann um z.B 3 Stellen oder? - wie in
deinem Beispiel oben.
Richtig?

Würde mich freuen wenn Du meine Aussage bestätigen würdest.

Vielen Dank
Peter

von Matthias (Gast)


Lesenswert?

Hi

nicht ganz. Du nimmst eine temporäre Variable, setzt die auf 1 und
verschiebst diese um drei Stellen. Diesen Wert weiß du dann dem
Register zu. Und da TXEN und 1 beides Konstanten sind wird das setzen
und verschieben bereits zur compilezeit erledigt so das der Befehl mit

ldi rxx,0x08
out UCR,rxx

im Flash landet.
Es wird zur Laufzeit also nichts rotiert.

Matthias

von Peter (Gast)


Lesenswert?

Ja da heist aber doch dann, das das Register indem ein Bit gesetzt
werden soll das Register gesetzt wird alle anderen Bits des Registers
aber auf 0 gesetzt werden oder?

von Matthias (Gast)


Lesenswert?

Hi

Selbstzitat:
Wenn du nur dieses eine Bit setzen möchtest ohne die anderen in diesem
Register zu verändern schreib
UCR = UCR | (1<<TXEN);
oder kürzer
UCR |= (1<<TXEN);

Matthias

von Peter (Gast)


Lesenswert?

O.K Danke...

von Christian Schifferle (Gast)


Lesenswert?

Und um das Ganze zu vervollständigen hier noch die Lösung, die verwendet
werden kann um ein einzelnes Bit eines Portes wieder zu löschen (Soll
ja ab und zu auch notwendig sein):

UCR &= ~(1<<TXEN);  // Bit TXEN in UCR löschen

Gruss
Christian

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.