Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

arek944 30 Paź 2012 13:51 2934 5
  • #1 30 Paź 2012 13:51
    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
    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?

    0 5
  • Arrow Multisolution Day
  • #2 30 Paź 2012 18:40
    Qmexx
    Poziom 11  

    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. :)

    0
  • Arrow Multisolution Day
  • #3 30 Paź 2012 18:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #4 30 Paź 2012 19:43
    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
    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 :)

    0
  • Pomocny post
    #5 30 Paź 2012 21:10
    Qmexx
    Poziom 11  

    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
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod
    i powinno lepiej wyświetlać.

    A w najnowszym kodzie:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    zmień na
    Kod: 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.

    0
  • #6 31 Paź 2012 00:33
    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
    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

    0