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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 17 maja 2025, o 07:08


    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: 584
    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: 1170
    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: 584
    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: 232
    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: 584
    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: 1170
    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: 323
    Lokalizacja: Rybnik
    Pomógł: 23

    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 ] [ Zaznacz wszystko ]
    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: 584
    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: 323
    Lokalizacja: Rybnik
    Pomógł: 23

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