Forum: Compiler & IDEs Register Manipulationen ODER Operator


von Sebastian K. (bastik)


Lesenswert?

Hallo,

kurze frage - arbeite mich gerade in GCC ein - war davor Bascom Nutzer.

Ich habe mich jetzt schon durch einige Beispiele durchgearbeitet und für 
mich wird nicht eindeutig klar was genau der Unterschied zwischen:

TCCR0B = (1<<CS02) | (1<<CS01) | (1<<CS00);

und

TCCR0B |= (1<<CS02) | (1<<CS01) | (1<<CS00);

ist. Meiner Meinung nach keiner - Darf ich beides gleich behandeln oder 
tapp ich in eine Falle.

Also aus dem was ich bisher aus den Tutorials gelesen hab wird es mir 
nicht klar - mal wird es so gemacht und ein anderes mal so.

Wäre nett wenn ihr mir bei dieser Anfänger Frage weiterhelfen könntet.

Schönes Wochenende - Sebastian

von Peter II (Gast)


Lesenswert?

Sebastian Kreuzer schrieb:
> Meiner Meinung nach keiner - Darf ich beides gleich behandeln oder
> tapp ich in eine Falle.

dann überleg doch mal wenn

TCCR0B = 0xFF

ist, was ein beiden Fällen passiert.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Kreuzer schrieb:

> TCCR0B = (1<<CS02) | (1<<CS01) | (1<<CS00);
>
> und
>
> TCCR0B |= (1<<CS02) | (1<<CS01) | (1<<CS00);
>
> ist. Meiner Meinung nach keiner

Dann hast du noch nicht verstanden, wofür das |= steht

    a |= b;

ist die Kurzschreibweise für

    a = a | b;

da geht also das was links vom = steht auch noch in den Ausdruck rechts 
mit ein.

von Sebastian K. (bastik)


Lesenswert?

Ok... ich glaub fast mein Verständniss Problem lag wo anders.... aber 
egal:

Also lieg ich dann Richtig in der Annahme, dass

TCCR0B = (1<<CS02) | (1<<CS01) | (1<<CS00);

und

TCCR0B = (1<<CS02);
TCCR0B |= (1<<CS01);
TCCR0B |= (1<<CS00);

das gleiche Ergebnis zur Folge hätte ( bezüglich auf den Inhalt im 
TCCR0B )?

Also wenn ich in Registern ein Bit setzen will ohne das die Bits die ich 
zuvor eventuell gesetzt habe verändern will nehme ich :

|=

Sonst - z.b. beim ersten beschreiben - bei der ich alle Einstellungen 
vornehme - kann ich einfach

=

schreiben.

Aber da ja die Register am anfang sowieso auf 0x00 stehen würde ein |= 
bei der Initalisierung auch nicht stören.

Also angenommen TCCR0B = 0x00 im Vorfeld
würde es egal sein ob ich

TCCR0B = (1<<CS02) | (1<<CS01) | (1<<CS00);
oder
TCCR0B |= (1<<CS02) | (1<<CS01) | (1<<CS00);
schreibe

Wenn TCCR0B ungleich 0x00 würde ich aber Probleme bekommen

Hab ich es richtig zusammengefasst/verstanden ?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sebastian Kreuzer schrieb:
> Aber da ja die Register am anfang sowieso auf 0x00 stehen würde ein |=
> bei der Initalisierung auch nicht stören.

Wenn sie es tun. Tun sie das? Immer?

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.