mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.K Danke...

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.