logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

w jaki sposób wyświetlić liczbe zmiennoprzecinkową?

Reaper82 05 Lut 2006 12:00 1811 11
REKLAMA
  • #1 2262234
    Reaper82
    Poziom 2  
    Posty: 4
    Mając liczbę zmienno przecinkową chciałbym ją wyświetlić na wyświetlaczu LCD, z tym, że na wyświetlacz podajemy znaki (jak wiadomo wyświetlacz posiada w pamięci tablicę z kodami znaków). Pytanie jest takie jak można rozbić tą liczbę aby na wyświetlaczu LCD uzyskać
    "0,239410123" czy może jest na to jakiś inny sposób, za pomoc z góry dziękuję (dodam tylko zę program powstaje w C i pisany jest pod uP kompatybilny z rodzina MCS 51)
  • REKLAMA
  • #2 2262268
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    W C jest do tego funkcja "printf (..)" jedynie trzeba ją przekierować z domyślnego USARTA na twój wyświetlacz.
  • REKLAMA
  • #3 2265459
    UkaszV6
    Poziom 13  
    Posty: 54
    Pomógł: 8
    Nie znam sie za bardzo na C, ale spróbuj zróbić z tej liczby stringa
  • REKLAMA
  • #4 2265645
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam
    W C jest funkcja do konwersji liczb na string

    itoa- dla liczb maks 13bitowych ( chyba) oraz lota- dla dluzszych

    Nie wiem czy mozna tym sposobem konwertowac liczbe zmiennoprzecinkowa, ale jesli nie to pomnoz te wartosc 0,239410123 * 1000000000

    num=0,239410123 * 1000000000;
    takie rozwiazanie troche pamieciozerne bedzie ale powinno dzialac

    a potem wysylasz to do LCD np:
    void LCD_str(uint32_t num)
    {
    char buffer[10];
    ltoa( num, buffer, 10); // konwertuj na stringa
    write_text_LCD(buffer); // zapisz do LCD
    }
  • #5 2265735
    avr_elektronik
    Poziom 14  
    Posty: 171
    Pomógł: 1
    Ocena: 1
    kiedyś testowałem printf("..."); działa super ale zajmuje okropnie dużo pamięci,dla porowania to samo w bascomie zajmuje znacznie mniej :(
  • #6 2265936
    bkb
    Poziom 12  
    Posty: 62
    Pomógł: 2
    Ocena: 7
    Ja używam do przygotowania bufora wyświeltacza funkcji sprintf (w WinAVR, ale dla inncyh uP tez powino działać).

    sprintf(lcd_buf,"liczba=%f",x);

    gdzie liczba znajduje się pod x.
    Funkcja sprintf znajduje się w <stdio.h>

    Pomysł z mnożeniem też jest skutecznym rozwiązaniem.
  • #7 2266057
    avr_elektronik
    Poziom 14  
    Posty: 171
    Pomógł: 1
    Ocena: 1
    bkb -> a jak wyglada sprawa z pamiacia ?
  • REKLAMA
  • #9 2269354
    avr_elektronik
    Poziom 14  
    Posty: 171
    Pomógł: 1
    Ocena: 1
    ok jest wygodna ale dlaczego zjada tyle pamieci w bascomie print dziala tak samo a zajmuje znacznie mniej , i wtym momencie nasuwa mi sie pytanie po co meczyc sie w C :)
    pozdrawiam
  • #10 2270215
    bkb
    Poziom 12  
    Posty: 62
    Pomógł: 2
    Ocena: 7
    skoro Reaper82 pisze w C, to cu mu sugerujecie bascom. Zgodzę się z tym, że ta funkcja zjada dużo pamięci, ale jesli jest wykorzystywana kilka razy kolejene przywołania nie sa już tak straszne. Mam ATMega32 i sprintf uzywane jest tam kilkadziesiąt razy i jakos mi nie brakó miejsca.
    Jak komuś zależy na pamięci to nie pisze ani w c ani w bascomie. Pozostaje tylko asembler.
    Albo rozwiązanie z przesunięciem przecinka. Do pokazania liczby zmiennoprzecinkowej na LCD w typowych przykładach, jak mi sie wydaje, wystarczą 2-3 miejsca po przecinku, a wtedy przemnożenie liczby jest dobrym pomysłem.
  • #11 2270328
    avr_elektronik
    Poziom 14  
    Posty: 171
    Pomógł: 1
    Ocena: 1
    ja wcale nie polecam bascoma bo sam staram sie opanowac C ,ale poprostu ciekawi mnie to jak to zrobili i dlaczego nie da sie zrobic tego samego w C
  • #12 2270951
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Stosuję często taki myk
    Mam np. wyświetlić wartość 1234567 Hz bo tyle zliczył uC.
    Na wyświetlaczu chciałbym mieć 1.234 MHz więc:
    czyszczę wyświetlacz,
    ustalam na wyświetlaczu pozycję 1 wiersz 2 kolumna,
    wyświetlam 1234567
    ustalam na wyświetlaczu pozycję 1 wiersz 1 kolumna,
    Dzielę 1234567\1000000 i otrzymuję 1
    wyświetlam 1 a bezpośrednio po nim "."
    ustalam na wyświetlaczu pozycję 1 wiersz 6 kolumna,
    wyświetlam " MHz"
    Za pomocą instrukcji warunkowej ustalam czy liczba mieści się w odpowiednim zakresie. Jeżeli nie zapewniam inny podprogram do wyświetlania.
    Tak realizuję automatyczną zmianę zakresów.
    W zdecydowanej większości przypadków to się sprawdza i jest oszczędne. Można jedynie zauważyć niewielkie migotanie wyświetlacza. Mnie nie przeszkadza a w "C" można by chyba i to poprawić.

    Odbiegając od tematu powiem, że Bascom wcale nie jest taki tragiczny, a przy zmiennych przecinkach lepszy. Entuzjastom "C" niestety przez gardło to nie przejdzie!

    "C" jest standaryzowany - Bascom nie ma takich ograniczeń.
    "C" jest uniwersalny zatem daleki od konkretnego zastosowania - Bascom jak koszula - blisko ciała. Musimy zatem rozsądnie wybierać dostępne narzędzia - bez klapek na oczach, a nie odkręcać śrub tylko i wyłącznie młotkiem.

Podsumowanie tematu

✨ Dyskusja dotyczy sposobów wyświetlania liczb zmiennoprzecinkowych na wyświetlaczu LCD w programie napisanym w języku C dla mikrokontrolera kompatybilnego z rodziną MCS 51. Proponowane rozwiązania obejmują użycie funkcji standardowych języka C, takich jak printf i sprintf, które umożliwiają konwersję liczby zmiennoprzecinkowej na łańcuch znaków, jednak ich implementacja może być pamięciochłonna. Alternatywnie sugerowano ręczne przekształcenie liczby przez mnożenie jej przez potęgę dziesięciu (np. 10^9) i konwersję wyniku na string za pomocą funkcji itoa lub ltoa, co jest bardziej oszczędne pamięciowo. Wskazano również na praktyczne metody formatowania wyświetlanej wartości, np. dzielenie i wyświetlanie części całkowitej oraz ułamkowej osobno, co pozwala na oszczędność zasobów i czytelne przedstawienie danych. W dyskusji poruszono także porównanie języka C z Bascomem pod kątem zużycia pamięci przy wyświetlaniu liczb zmiennoprzecinkowych oraz sugestie dotyczące stosowania asemblera w przypadku bardzo ograniczonych zasobów pamięciowych.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA