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



Teraz jest 27 gru 2024, o 22:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 23 lis 2022, o 22:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 557
Pomógł: 0

Witam.
Pytanie może jest banalne ale nie mogę sobie z tym poradzić i wracam się z prośbą o podpowiedz.

W pewnym pracującym urządzeniu zapisuje pomiary do zmiennej _UINT 16t niestety wartość jest dodawana co pewien czas i z obawy o przekroczenie zakresu maksymalnej wartości UINT_16 T chciałbym
wynik przekonwertować do zmiennej UINT 32 T .

uint16_t a;
uint32_t b;

a= 56;
to jak zrobić żeby np: b=a+300;

Nie znalazłem przykładu .
I ewentualnie jak zrobić konwersje odwrotnie? :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2022, o 10:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1164
Lokalizacja: Kraków
Pomógł: 93

Może tak:
b = (uint32_t)a + 300;
A odwrotnie to odwrotnie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2022, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 557
Pomógł: 0

Wpisałem jak napisałeś :

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


I niestety wyświetlacz LCD pokazał :
56
0
Chyba że funkcja lcd_int(b); nie przyjmuje wartości uint32_t ????

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


Też nic czyli 0 :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2022, o 21:07 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

lcd_long( uint32_t val );

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2022, o 21:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 557
Pomógł: 0

Tej funkcji nie mam w bibliotece niestety wywala Warninga niestety.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2022, o 12:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1164
Lokalizacja: Kraków
Pomógł: 93

Zmień funkcję do wyświetlania. ALbo dopisz sobie funkcję lcd_long(uint32_t val).
Sprawdź, jak wygląda funkcja Mirka. Tam do zamiany liczby na tekst jest użyte itoa (int na tekst). W Twojej będzie ltoa (long na tekst).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2022, o 13:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 315
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Gdzie widzisz problem, przecież jak dodajesz do zmiennej 16bit zmienną 32bit to w wyniku dostaniesz zmienną 32bit (tzw. promocja do int czy jakoś tak się to nazywa, czyli do większej zmiennej)
Czyli reasumując: jeśli dodasz np: 56+300 to liczba wyniesie 356.
Poniżej masz kod, który sprawdziłem w kompilatorze online.
Kod i wynik z terminala.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Obrazek

Cytuj:
Nie znalazłem przykładu .
I ewentualnie jak zrobić konwersje odwrotnie? :(

Co masz na myśli odwrotnie? Chcesz zapisać liczbę uint32_t do zmiennej uint16_t?
Jeśli tak, to możesz zrobić jawne rzutowanie do uint16_t ale jeśli wynik będzie większy niż zakres uint16_t, to kompilator nie będzie krzyczał ale otrzymasz nieprawidłowe dane.

_________________
http://www.avrboss.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2022, o 20:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 557
Pomógł: 0

Czyli problem jest w wyświetlaniu a nie wyniku?
I teraz to zrozumiałem.
Dlaczego chcę zamieniać UINT32_T na UINT16_T Ponieważ liczba będąca sumą wyników cyklicznie dodawanych co dobę nie wystarczy na 365 dni , w związku z tym zrobię inaczej suma będzie dodawała się do
zmiennej UINT32_T a może co miesiąc podzielę ją i wyświetlę jako UINT32_T albo może gdzieś dopadnę te w/w fukcję.
Przynajmniej wiem gdzie jest problem dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2022, o 11:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 mar 2015
Posty: 315
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

Do biblioteki LCD-ka dopisz sobie taką funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

lub
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, która dla twoich potrzeb będzie prawidłowa.


Autor postu otrzymał pochwałę

_________________
http://www.avrboss.pl



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: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO