Пока ты эти байтовые значения не начинаешь расширять - тебе вообще насрать signed или unsigned. Потому что в процессоре к примеру 0хС0 - это просто 11000000. И все. Называется переменная signed - компилятор думает, что это -64. Называется unsigned - думает что 192. А реально это 11000000, оно как пришло в таком виде из i2c, так именно в таком же виде 11000000 уедет в uart. И вот только на той стороне, в компе, когда ты его начнешь расширять до int - оно превратится в -64 или 192, в зависимости от того как был обозван исходный байт.
И вот там, кстати, тебя поджидает хитрая засада. Твой код:
- Код: Выделить всё • Развернуть
int ax = (int)(axh << 8) + axl;
равносилен
- Код: Выделить всё • Развернуть
int ax = axl;
Рассказать почему или уже догадался?
Добавлено спустя 3 минуты 57 секунд:Ты кстати зря сразу это все в тригонометрию свою заталкиваешь. Выведи сначала 12 отдельных байт. Посмотри как меняются когда вертишь железяку. Объедини в 6 слов. На них посмотри. Посмотри, плавно ли меняются когда плавно вращаешь. Корректно ли через ноль переходят? И вот уже потом делай тригонометрию. Да, кстати, если у тебя там знаковое 16-битное - тебе его надо не в int, а в short превращать, когда байты сливаешь.