• 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

VPS Starter Arubacloud
0 głosów
639 wizyt
pytanie zadane 14 września 2022 w Mikrokontrolery przez Mavimix Dyskutant (8,420 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,300 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 (156,260 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ź 353 wizyt
pytanie zadane 12 września 2016 w Mikrokontrolery przez Weenter Użytkownik (830 p.)
0 głosów
2 odpowiedzi 251 wizyt
pytanie zadane 10 czerwca 2016 w C i C++ przez Mavimix Dyskutant (8,420 p.)
0 głosów
1 odpowiedź 1,042 wizyt

92,963 zapytań

141,928 odpowiedzi

321,161 komentarzy

62,297 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...