Operación bit a bit para UART, AVR

Estoy tratando de trabajar en UART para AVR. Después de configurar los registros de velocidad en baudios UBRRnX, estoy tratando de configurar el registro UCSRnA.Registro UCSR0A.

Estoy tratando de configurar el segundo bit, U2XO. ¿Cuál es la forma correcta de hacerlo?UCSR0A = (1 << U2X0)

o

UCSR0A = UCSR0A | (1 << U2X0)( Observe el operador OR en la segunda declaración )

Respuestas (1)

En este caso:

UCSR0A = (1 << U2X0);

1<<U2XO = 00000010, 1 se desplaza a la izquierda a la posición U2XO, por lo que cuando le da este valor a UCSR0A, el contenido del registro será:

UCSR0A = 00000010

Esta operación establecerá todos los bits en 0 excepto el U2X0, por ejemplo, si RXC0 se hubiera establecido en 1 , entonces esta operación lo borraría en 0 . Si no está al tanto de esto, eso podría causarle algún dolor de cabeza más adelante.


En este:

UCSR0A = UCSR0A | (1 << U2X0);

que es igual a esto:

UCSR0A |= (1<<U2X0);

Aquí configura solo el segundo bit a uno y deja el resto sin cambios, lo cual es preferible, porque no cambiará algo accidentalmente. El contenido será:

// 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

donde xes el valor sin cambios/anterior del bit. Si xes 1, 1 O 0 seguirá siendo 1 y si xes 0, 0 O 0 seguirá siendo 0 .


Así que sugiero la segunda manera, porque de esa manera es más fácil rastrear qué bit está configurado y cuál no, y no cambiará la configuración aplicada previamente por error.

¡Gracias! Ahora lo entiendo. No sabía que el primer caso borraría todos los demás bits del registro.
Sí, lo haría porque simplemente lo hace igual a ese valor que tiene solo un bit establecido, el segundo (U2X0).
Tenga en cuenta que si bien esto es cierto en general , hay algunas excepciones. Los indicadores de interrupción, por ejemplo, se borrarán cuando se establezcan en 1, por lo que realizar un OR bit a bit en algunos casos puede borrar otros indicadores si el compilador emite una lectura-modificación-escritura en lugar de un conjunto de bits. Deben ser compensados ​​por adscripción estricta al registro si no están siendo atendidos por un ISR.
@Ignacio Gracias por la importante adición, aclararé mi respuesta. Y la descripción del registro siempre es una lectura obligatoria antes de modificar cualquier bit en el registro, por lo que se revelarán estos detalles.