Forum: Mikrocontroller und Digitale Elektronik senkrechter Strich bei Register initialisierung


von Florian S. (sirius7)


Lesenswert?

Hallo,

suche nach einer Aussagekräftiger Lektüre, wo ich was über senkrechte 
Striche bei UART Initialisierung nachlesen kann. Momentan kann ich da 
keine Regelmäßigkeiten erkennen und finde auch nirgendwo was darüber.

z.B. wird Bit TXEN ohne den senkrechten Strich auf 1 gesetzt:

                    UCSRB1=(1<<TXEN)

und bei UCSZ12 wird er verwendet:

                    UCSRB1|=(1<<UCSZ12)

auch hier wird senkrechter Strich genutzt:

                    UCSRZ1|=(1<<USBS)

hat vielleicht einer sich schon mal damit befasst und weiß, wo ich die 
Erklärung finde? Überall wo ich geschaut habe, sind sie nur fertig 
definiert, ohne zu erklären, warum.

vielen Dank im Voraus!

: Bearbeitet durch User
von Loddaar (Gast)


Lesenswert?

Alex S. schrieb:
> vielleicht einer sich schon mal damit befasst und kann weiß, wo ich
> die Erklärung finde?

ja, ich. Das ist C

von Marius W. (mw1987)


Lesenswert?

In jedem guten C-Buch.

Gruß
Marius

von irgendwer (Gast)


Lesenswert?

Moin,

was der "Strich" macht, bzw. wo der Unterschied zwischen |= und = ist, 
weißt Du aber? Ansonsten wirf mal hier einen Blick hin:

http://www.mikrocontroller.net/articles/Bitmanipulation

Oder geht es Dir speziell um die Sache beim UART?

von Florian S. (sirius7)


Lesenswert?

im C-Buch bei bitweise Operationen steht "Der senkrechte Strich | 
bedeutet ein logisches bitweises ODER" aber in diesem Beispiel schaltet 
man die expliziten Bits auf 1. Man könnte es einfach für Regel annehmen, 
jedoch es gibt Beispiele, wo man bei absolut gleicher Operation keinen 
Strich einsetzt...

von Florian S. (sirius7)


Lesenswert?

> Oder geht es Dir speziell um die Sache beim UART?

genau, ich kann einfach keinen Zusammenhang mit Registereinstellung 
finden, weil es hier eigentlich nicht um ODER geht, sonder um das 
Einschalten explizites Bits..

und desweiteren ist mir auch nicht klar, warum es nicht überall so ist, 
obwohl es doch überall darum geht die Bits 1 zu schalten

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Dann helfe ich doch mal ein wenig:

=  ändert alle Bits
|= setzt nur die Bits, wo der zu schreibende Wert eine "1" hat; die anderen 
bleiben unverändert

Gruß Dietrich

von Florian S. (sirius7)


Lesenswert?

Dietrich L. schrieb:
> Dann helfe ich doch mal ein wenig:
>
> =  ändert alle Bits
> |= setzt nur die Bits, wo der zu schreibende Wert eine "1" hat; die anderen
> bleiben *unverändert*
>
> Gruß Dietrich

Hallo Dietrich, das macht die Sache viel klarer! vielen Dank!)

von Dietrich L. (dietrichl)


Lesenswert?

Alex S. schrieb:
> und desweiteren ist mir auch nicht klar, warum es nicht überall so ist,
> obwohl es doch überall darum geht die Bits 1 zu schalten

Das hängt davon ab, was in der Variablen / im Register schon steht.
Bei ersten Schreiben will man vielleicht alle Bits definiert einstellen.
Bei weiteren Schreibvorgängen will man eventuell nur bestimmte Bits 
ändern.

Was also richtig ist hängt von der Umgebung ab und davon, was man 
tatsächlich machen will.

Gruß Dietrich

von (prx) A. K. (prx)


Lesenswert?

Marius W. schrieb:
> In jedem guten C-Buch.

Sogar in schlechten. ;-)

von Oliver S. (oliverso)


Lesenswert?

Alex S. schrieb:
> logisches bitweises ODER

Jetzt wäre ein guter Zeitpunkt, herauszufinden, was "logisches bitweises 
ODER" eigentlich bedeutet.

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Alex S. schrieb:
> genau, ich kann einfach keinen Zusammenhang mit Registereinstellung
> finden, weil es hier eigentlich nicht um ODER geht, sonder um das
> Einschalten explizites Bits..

Preisfrage: Mit welcher logischen Operation kann man einzelne Bits 
setzen, ohne dabei die restlichen zu verändern?

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.