Das kann so nicht gehen.
> xy = (
In dem Moment wo du xy etwas zuweist und xy im Ausdruck rechts
vom = nicht vorkommt, hast du xy auf jeden Fall zerstört.
Du musst:
xy nehmen und die beiden untersten Bits mal auf 0 setzen.
Dann oderst du die 2 neuen Bits hinein.
Mit einem Oder kannst du nur Bits setzen, daher das vorhergehende
Und, um auf jeden Fall mal die untersten beiden Bits auf 0 zu
kriegen:
xy = ( xy & 0xFC ) | ( TWI_TWPS & 0x03 );
Zur Sicherheit habe ich TWI_TWPS noch mit 0x03 verundet, damit
da ja keine anderen Bits als die unteren beiden gesetzt sein
können. Wenn absolut sichergestellt ist, das in TWI_TWPS niemals
andere als die unteren beiden Bits gesetzt sind, kannst du das
auch weglassen:
xy = ( xy & 0xFC ) | TWI_TWPS;