Ein Fehler liegt hier:
uint8_t high_byte = two_bytes & 0xff00;
Damit ist das high_byte immer Null, da bei der Uwandlung auf 8bit die oberen Bits abgeschnitten werden. (gibt es da eigentlich eine Compilerwarnung?)

Besser so:
uint8_t high_byte = (uint8_t)((two_bytes & 0xff00)>>8);
Die oberen Bits maskieren, dann ins untere Byte schiben, und dann zur Sicherhiet noch auf den richtigen Typ casten.

Und letztlich kann man dabei auf die Maskierung verzichten, da das untere Byte sowieso beim Schieben wegfällt.
uint8_t high_byte = (uint8_t)((two_bytes>>8);