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.