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
"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
Stimmt schon aber damit weiß ich immer noch nicht wie ich durch die o.g Zeile durch << das Bit TXEN setze..
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?
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.
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
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
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.