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

[mega8] [C/AtmelStudio6] - Wyświetlanie zmiennych typu float lub double na LCD

arek944 30 Paź 2012 13:51 3654 5
REKLAMA
  • #1 11467633
    arek944
    Poziom 11  
    Witam wszystkich!
    Ostatnio siedzę nad drobnym projektem dla siebie samego i zastanawiam się, w jaki sposób wyświetlić wartość temperatury (z przetwornika ADC) na wyświetlaczu?

    Sam próbowałem wymyslić coś na podstawie funkcji dtostrf i sprintf. dtostrf porzuciłem, gdyż w ogóle nie dawała mi żadnych nadziei na rozwiązanie problemu.

    Poniżej podaję kawałek kodu, który jest odpowiedzialny za (jak dotąd) nieudane wyświetlanie wartości temperatury. Funkcje obsługi wyświetlacza LCD zaczerpnąłem z ksiązki Dolińskiego.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wydaje mi się, że winna tutaj jest funkcja LCD_WRITE_TXT(), która jakimś (nieznanym mi) trafem głupieje przy wyświetlaniu. Stąd też moje pytanie, czy mógłby mnie ktoś naprowadzić jak przerobić funkcję LCD_WRITE_TXT(), czy też jak dopasować STR_T do wymogów funkcji?
  • REKLAMA
  • #2 11468628
    Qmexx
    Poziom 12  
    Czy dolinkowałeś do projektu odpowiednie biblioteki? Poczytaj sobie opis funkcji vfprintf() w dokumentacji avr-lib (w stdio.h). Standardowo dla oszczędności miejsca w pamięci dolinkowywana jest uproszczona wersja biblioteki bez obsługi float. Pewnie to ci psuje zabawę. :)
    A dlaczego porzuciłeś dtostrf()? Dawno już nie robiłem konwersji z floatów, ale to powinno działać, tylko sprawdź, czy ta funkcja kończy string zerem (znak końca).

    Jakieś długie lata temu zrobiłem konwersję jeszcze inaczej: float'a pomnożonego przez 10 (aby mieć jedno miejsce po przecinku) przypisałem do int'a, a wtedy zwykłą itoa() skonwertowałem do stringa i przy wyświetlaniu wstawiłem przecinek przed ostatnią cyfrą. Prosto, po żołniersku, ale działało. :)
  • REKLAMA
  • #3 11468651
    tmf
    VIP Zasłużony dla elektroda
    Do takich celów to się wykorzystuje arytmetykę stałopozycyjną, a nie zmiennopozycyjną. Oczywiście jeśli chcesz sobie strzelić w stopę to proszę bardzo - dolinkuj libm.
  • REKLAMA
  • #4 11468935
    arek944
    Poziom 11  
    dtostrf() porzuciłem, ponieważ wtedy mikrokontroler w ogóle dostawał "bzika" i działy się dziwne rzeczy.

    Prawdą jest, że nie ma sensu strzelać sobie samobója. Stąd też na szybkiego (dosłownie na kolanie, podczas robienia obiadu :D ) dopisałem funkcję, która wykorzystuje trochę prostej matematyki:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dokładność takich obliczeń jest mniej więcej na poziomie ±0.3°C dla temperatury pokojowej, zaś ±0.1°C dla temperatur z przedziału roboczego (35÷80°C). Urządzenie nie wymaga nie wiadomo jak dużej precyzji pomiaru temperatury, a z pewnością tego typu obliczenia wymagają mniej pamięci i kosztują mniej czasu. Jak tylko dorwę się do AtmelStudio i programatora, to dam znać jak to wszysto działa.
    A na razie dziękuję za burzę mózgów :)
  • REKLAMA
  • Pomocny post
    #5 11469444
    Qmexx
    Poziom 12  
    Oj tam! Jeśli chce na float, to niech robi. Ja nie neguję. :)

    Dałem sobie chwilkę i przejrzałem Twój kod. Nic dziwnego, że masz kaszanę, skoro używasz do wyświetlenia tekstu z RAM procedury czytającej teksty z Flash. :)

    W procedurze LCD_WRITE_TXT zmień linię
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    na
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    i powinno lepiej wyświetlać.

    A w najnowszym kodzie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    zmień na
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    bo nadpiszesz sobie wyliczoną wyżej część ułamkową.

    No i na marginesie: jest taka niepisana zasada, że dużymi literami pisze się nazwy makr i definicji stałych robionych dyrektywą preprocesora #define. Trochę mi to przeszkadzało w czytaniu Twojego kodu.
  • #6 11470278
    arek944
    Poziom 11  
    Dziękuję wszystkim za pomoc i cenne uwagi :) Temat zamykam, gdyż wyświetlanie wartości ułamkowych udało się załatwić poniższą funkcją:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zmienne typu float, czy double są zbędne, a ponadto użycie pamięci programu w wypadku stosowania prostej matematyki wynosi raptem 30%. W przypadku zabawy z float było 80% :D
REKLAMA