# Why would you right shift 8 bits for 8 bit register?

MCU: Atemega328P Datasheet: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf (Page 143 - USART)

Note: I am beginner :)

Using the BAUD rate formula found in this picture we can calculate the UBRRn value for 9600 BAUD rate. Therefore UBBRn = 103.

103 is loaded into UBRR0H and UBRR0L with UBRR0H taking the 4 most significant bits. According to the datasheet this is the method to load 103: UBRR0H = (103 >> 8); UBRR0L = 103; 103 = 1100111

Wouldn't this just load 1100111 into UBRR0H and shift right 8 bits pushing the entire value out of the register to give 00000000?

And in UBRR0L would this not give 01100111?

FROM DataSheet

• becaues the number could be higher than 255? Jan 4, 2021 at 19:01
• That looks funky .. I would be more specific about it. e.g. // write to register low end UBRR0L = (uint8_t)(103 & 0xFF); // write to register high end UBRR0H = (uint8_t)(103 >> 8) Jan 4, 2021 at 19:09

## 2 Answers

This is a generic method. The ubrr is an unsigned int which makes it 16 bits wide (2 bytes).

To break this into discrete bytes like in the example, you need to shift the bits right by 8 to get the high byte.

In your specific example it doesn't matter because the high byte is empty anyway, but what if you need a ubrr of 3,096?

Also, you might be confusing order of operations. Your example doesn't load the register then shift it out, it takes the binary representation of 103, shifts it, then applies the result of that to the register.

For 3,096 then UBRRH = decimal 12 OR binary 1100 UBRRL = decimal 24 OR binary 0001 1000