Mirko, mam problem z odczytami z akcelerometru, nie mam pojęcia dlaczego mi się wszystko rozjeżdża.

Otóż mam scalaka MPU-9150 z m.in 3-osiowym 16-bitowym akcelerometrem. Wynik pomiaru przyspieszenia zapisywany jest do dwóch rejestrów, w pierwszym są bity 15..8 a w drugim 7..0.

Odczyt za pomocą I2C i wysłanie na UART robię tak:

TWI_read_buf(MPU9150_ADDR, 0x3B, 2, read);
uart_putc(read[0]);
uart_putc(read[1]);

Następnie odbieram sobie dane w Javie i modyfikuję w taki sposób:

int byte1 = buffer[firstSampleIndex + 1];
int byte2 = buffer[firstSampleIndex + 2];


byte1 *= 256;
byte2 += 128;

Wartości byte1 i
Visher - Mirko, mam problem z odczytami z akcelerometru, nie mam pojęcia dlaczego mi ...

źródło: comment_GGxNDS2xwN7OBrNOTEA6YX1nfnlNy3Lm.jpg

Pobierz
rejestr 1: ACCELXOUT[15:8]

rejestr 2: ACCELXOUT[7:0]


@Visher: I dokładnie tak to masz interpretować, rej2 jest młodszym bajtem wartości, a rej1 starszym. Cała wartość ma postać ((uint16)rej1)*256 + rej2.

A ty dodajesz jakieś dzikie 128 do młodszego bajtu, czyli przesuwasz go na dzień dobry o połowę w górę. I dokładnie to widać na wykresie (to, co ci nie pasuje - przesunięcie).
  • Odpowiedz
@Tymian: rozwiązałem problem, dzięki za zaangażowanie, wynika on z tego że 16-bitowy pomiar zapisywany jest w kodzie dopełnień do dwóch, a wysyłając i czytając osobno po 8-bity komputer traktuje każdą część jakby była osobnym kodem dopełnień do dwóch. Do tego doszedłem sam, a rozwiązanie znalazłem w odpowiedzi oznaczonej jako poprawną:

http://stackoverflow.com/questions/25401307/how-to-convert-twos-complement-binary-byte-to-decimal

Widać że zero na LSB pokrywa się ze skokiem na MSB na poniższym obrazku.

Miłego dnia.
Visher - @Tymian: rozwiązałem problem, dzięki za zaangażowanie, wynika on z tego że 1...

źródło: comment_mdhnng8erw6dZUQKc1NxgW2FRxi5CwSX.jpg

Pobierz
  • Odpowiedz