Operación bitwise para UART, AVR

2

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

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

o

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

    
pregunta am3

1 respuesta

7

En este caso:

UCSR0A = (1 << U2X0);

1<<U2XO = 00000010 , 1 se desplaza a la izquierda a la posición U2XO, de modo que cuando le dé este valor a UCSR0A, el contenido del registro será:

UCSR0A = 00000010

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

En este:

UCSR0A = UCSR0A | (1 << U2X0);

que es igual a esto:

UCSR0A |= (1<<U2X0);

Aquí solo establece el segundo bit en uno y deja el resto sin cambios, lo que es preferible, ya que 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 x es el valor sin cambios / anterior del bit. Si x es 1, 1 O 0 seguirá siendo 1 y si x es 0, 0 O 0 seguirá siendo 0 .

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

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas