• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

AVR - błąd dodawania dwóch liczb 8 bitowych

Object Storage Arubacloud
0 głosów
432 wizyt
pytanie zadane 14 września 2022 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

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?

komentarz 14 września 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 14 września 2022 przez Oscar

Dokumentacja BMP280 precyzuje dokładnie jakich typów zmiennych trzeba używać w obliczeniach - aby dostać dobry wynik. Zwróć też uwagę jakiej wielkości jest int w twoim kompilatorze.

Dla przykładu wielkości kalibracyjne mojego układu (inna sztuka układu może mieć trochę inne, ale nie kompletnie inne):

Dig_T1 28204
Dig_T2 26211
Dig_T3 50
Dig_P1 36921
Dig_P2 -10768
Dig_P3 3024
Dig_P4 9646
Dig_P5 -127
Dig_P6 -7
Dig_P7 12300
Dig_P8 -12000
Dig_P9 5000
Dig_H1 75
Dig_H2 329
Dig_H3 0
Dig_H4 408
Dig_H5 50
Dig_H6 30


PS. Szukam ciągle pomysłu na obudowanie tego układu by mógł mierzyć, ale nie padał po paru miesiącach.

1 odpowiedź

0 głosów
odpowiedź 15 września 2022 przez mokrowski Mędrzec (155,460 p.)
wybrane 19 września 2022 przez Mavimix
 
Najlepsza

Na platformie AVR, int ma długość (co jest zgodne i dopuszczalne przez standard C) 16 bitów.

#include <stdio.h>
#include <stdint.h>

int main(void) {
	int32_t val = 38406;
	int16_t avr_val = val;
	printf("%d\n", avr_val);
	return 0;
}

Powyżej masz przykład ilustrujący (jawnie) tę konwersję. Jeśli chcesz kontrolować na AVR ściślej takie przypadki, użyj nagłówka stdint.h i typów z jawną długością.

Podobne pytania

0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 12 września 2016 w Mikrokontrolery przez Weenter Użytkownik (830 p.)
0 głosów
2 odpowiedzi 223 wizyt
pytanie zadane 10 czerwca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 903 wizyt

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...