Я использую микроконтроллер AVR для записи в программируемый чип делителя частоты через шину I2C.Через определенные промежутки времени я пытаюсь вызвать следующую функцию для обновления частотного выхода чипа:
void 1077WriteDiv(int16_t data)
{
uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(upperByte);
i2c_write(0x0);
i2c_stop();
}
Я пытаюсь получить верхние 8 битов десятибитового значения в "переменная "data" и запишите ее.Вторая команда «write» записывает младшие 8 бит регистра «деления» на микросхему, в данном случае 0.
В качестве теста я увеличиваю переменную «data» (которая должна бытьпо определенным причинам) с нуля, сдвигая его влево на 2 бита и вызывая эту функцию каждый раз.Я вывожу мусор.Однако, когда я делаю это:
void 1077WriteDiv(int16_t data)
{
//uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
static uint8_t thing = 0;
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(thing++);
i2c_write(0x0);
i2c_stop();
}
Все работает как положено.Очевидно, есть какая-то проблема в том, как я перемещаю и типизирую исходную переменную «data», но я пробовал все виды перестановок с одинаковыми результатами.Было бы очень признательно, если бы кто-нибудь мог указать, где я могу пойти не так.