Bitweiser Betrieb für UART, AVR

Ich versuche, an UART für AVR zu arbeiten. Nachdem ich die Baudratenregister UBRRnX eingestellt habe, versuche ich, das UCSRnA-Register zu konfigurieren.UCSR0A-Register.

Ich versuche, das 2. Bit U2XO zu setzen. Welches ist der richtige Weg?UCSR0A = (1 << U2X0)

oder

UCSR0A = UCSR0A | (1 << U2X0)( Beachten Sie den OR-Operator in der 2. Anweisung )

Antworten (1)

In diesem Fall:

UCSR0A = (1 << U2X0);

1<<U2XO = 00000010, 1 wird nach links in die U2XO-Position verschoben. Wenn Sie also diesen Wert an UCSR0A übergeben, lautet der Inhalt des Registers:

UCSR0A = 00000010

Diese Operation setzt alle Bits auf 0 , aber U2X0, wenn beispielsweise RXC0 auf 1 gesetzt worden wäre , dann würde diese Operation es auf 0 löschen . Wenn Sie sich dessen nicht bewusst sind, kann dies später zu Kopfschmerzen führen.


In diesem:

UCSR0A = UCSR0A | (1 << U2X0);

was gleich ist:

UCSR0A |= (1<<U2X0);

Hier setzen Sie nur das zweite Bit auf eins und lassen den Rest unverändert, was vorzuziehen ist, da Sie nicht versehentlich etwas ändern. Der Inhalt wird sein:

// UCSRA0 = xxxxxxxx               before operation something is in the register
UCSR0A = UCSR0A | (1 << U2X0);     // OR current with 00000010
// UCSRA0 = xxxxxx1x               something OR 1 will be 1

wobei xder unveränderte/vorherige Wert des Bits ist. Wenn 1 xist , bleibt 1 ODER 0 1 und wenn 0 xist , bleibt 0 ODER 0 0 .


Daher schlage ich den zweiten Weg vor, weil es so einfacher ist, nachzuverfolgen, welches Bit gesetzt ist und welches nicht, und Sie die zuvor angewendete Konfiguration nicht versehentlich ändern.

Danke! Jetzt habe ich es verstanden. Ich wusste nicht, dass der 1. Fall alle anderen Bits im Register löschen würde.
Ja, das würde es, weil Sie es einfach gleich dem Wert machen, bei dem nur ein Bit gesetzt ist, das zweite (U2X0).
Beachten Sie, dass dies zwar im Allgemeinen zutrifft , es jedoch einige Ausnahmen gibt. Interrupt-Flags zum Beispiel werden gelöscht, wenn sie auf 1 gesetzt werden, sodass das Durchführen eines bitweisen OR in einigen Fällen andere Flags löschen kann, wenn ein Read-Modify-Write anstelle eines gesetzten Bits vom Compiler ausgegeben wird. Sie müssen durch strikte Zuordnung zum Register gelöscht werden, wenn sie nicht von einem ISR behandelt werden.
@Ignacio Danke für die wichtige Ergänzung, ich werde meine Antwort präzisieren. Und die Registerbeschreibung ist immer eine obligatorische Lektüre, bevor Bits im Register geändert werden, daher werden diese Details offengelegt.