Programuję czujnik BMP280 [dokumentacja] (czujnik ciśnienia i temperatury) z pomocą AtMega32. Jednym z elementów pomiaru za pomocą czujnika jest przeliczenie "surowej" wartości na wartość "po ludzku", a to tego trzeba odczytać odpowiednie wartości kalibracyjne z rejestru. Udaje mi się odczytać wszystkie wartości, oprócz jednej, a właściwie udaje mi się ją poprawnie odczytać, natomiast z niewiadomych dla mnie przyczyn MCU źle przelicza wartość - najpierw trzeba odczytać LSB, potem MSB, a potem je zsumować, do jednej liczby. Oto kod:
uint8_t cmd[2] = {0xD0, 0};
uint8_t msb1 = 0;
uint8_t lsb1 = 0;
char str[32];
//lsb1 = 6
cmd[0] = 0x8E;
tw_master_transmit(0x76, cmd, 1, 0);
tw_master_receive(0x76, cmd, sizeof(cmd));
lsb1 = cmd[0];
//msb1 = 150
cmd[0] = 0x8F;
tw_master_transmit(0x76, cmd, 1, 0);
tw_master_receive(0x76, cmd, sizeof(cmd));
msb1 = cmd[0];
//pomocnicze wypisanie po uarcie
sprintf(str, "%d.%05u\r\n", (int)lsb1, (int)((lsb1 - (int)lsb1) * 100000));
print_string(str);
sprintf(str, "%d.%05u\r\n", (int)msb1, (int)((msb1 - (int)msb1) * 100000));
print_string(str);
//wynik powinien byc msb1*256+lsb1=38406, a nie wiadomo czemu jest -27130
uint16_t dig_p1 = (msb1<<8) | lsb1;
//pomocnicze wypisanie po uarcie
sprintf(str, "%d.%05u\r\n", (int)dig_p1, (int)((dig_p1 - (int)dig_p1) * 100000));
print_string(str);
Wartości w zmiennych lsb1 i msb1 na pewno są dobrze odczytane (sprawdzane za pomocą Nucleo), a wartość dig_p1 powinna być 38406 (również sprawdzane za pomocą Nucleo), natomiast MCU "wypluwa" -27130. Reszta wartości jest przeliczana poprawnie. Dlaczego?