Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 21 kwi 2026, o 23:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 19 paź 2015, o 14:40 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 39
Pomógł: 0

Chciałbym odczytać z czujnika 12 danych kalibracyjnych, które są przechowywane w 24 rejestrach 8 bitowych, ale jest taki problem, że nie są one tego samego typu, a wygląda to tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie wiem, jak zadziała ta konwersja. Czy zmienne dig_1 i dig_4 utrzymają typ uint_16t przy obliczeniach?
Może lepiej to rozwiązać w taki sposób, że użyć po prostu tablicy 12 wartości a przed każdym użyciem dig_1 oraz dig_4 rzutować na uint_16t?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 16:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

Nic nie musi utrzymywać typu panie kochany ....

int a uint16_t ... to liczba 16-bitowa .... nie ważne czy siedzi w niej -1 czy 32768 ;) ....

typy są po to aby kompilator odpowiednio je interpretował do działań ... więc spokojnie można tak zrobić

zwróć tylko uwagę czy dane otrzymujesz LITTLE ENDIAN czy BIG ENDIAN

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 21:11 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 39
Pomógł: 0

Teraz jest taki problem, że owe uinty są traktowane jako inty ze znakiem.
Całość polega na tym, że pobieram z rejestrów czujnika te 24 bajty do tablicy tymczasowej uint8_t.
W bajtach są przechowywane liczby typu uint16 oraz int16.
Konwersji z 2 oddzielnych bajtów do liczby przechowywanej na 16 bitach przeprowadzam poprzez funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety zmienne, które w strukturze są zapisane jako uint16, a w unii jako jeden z elementów tablicy int16 przyjmują wartości ujemne. Próbowałem na wszystkie strony i nadal nic z tego nie wynika. Jak to naprawić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 22:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

A po kiszkę ty przy odbieraniu czegoś z układu bawisz się w jakieś inty czy uinty ??? sam sobie robisz kuku

już ci mówiłem - odbierasz surowe bajty - jako uint8_t ... i pakujesz je do struktury ale ....

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i ładuj po kolei 24 bajty odczytane z układu do comp_reg[ idx ] ....

a później odczytuj sobie ze struktury


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2015, o 10:03 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 39
Pomógł: 0

Faktycznie, niezła gafa. Dzięki, Mirku.
Jednak występuje pewien problem, bo gdy chcę wyświetlić owego uinta16 za pomocą funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to wyświetla liczbę ujemną:
w rejestrze jest 0x9134(H) a ta funkcja wyświetla -28364...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2015, o 12:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeśli chcesz wyświetlić liczbę uint16_t czyli liczbę 16-bitową bez znaku to zamiast itoa powinieneś użyć utoa. Funkcja itoa konwertuje liczby 16-bitowe ze znakiem.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2015, o 13:16 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

dokładnie jak mówi kolega wyżej ....

itoa - ( Integer To ASCII )
utoa - (Unsigned To ASCII )

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 paź 2015, o 17:25 
Offline
Użytkownik

Dołączył(a): 12 kwi 2014
Posty: 39
Pomógł: 0

Dziękuje, wszystko działa sprawnie.
Problem dotyczył pośrednio czujnika BMP280. Jeżeli ktoś by potrzebował wsparcia to zaoferuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO