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

Atmega128 - problem z wyświetlaniem wartości zmiennoprzecinkowych 9.4

rafmos 14 Lut 2013 19:20 1200 9
REKLAMA
  • #1 11934991
    rafmos
    Poziom 13  
    Programuję procesor Atmega 128 w gcc. Zmontowany układ ma mnożyć zmierzone napięcie przez przekładnię. Przekładnię zmieniam od 1 do 10 z krokiem 0.1. Problem jest w tym że w procedurze zmiany przekładni dodając do przekładni 0.1 lub odejmują na wyświetlaczu wyświetlają się wartości np. 9.3 i 9.5 a 9.4 nie idzie wyświetlić. Dodam że jeśli na stałe w procedurze wpiszę 9.4 to wartość tą wyświetli.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zmienne Przekl i temp są typu double
  • REKLAMA
  • #2 11935397
    BlueDraco
    Specjalista - Mikrokontrolery
    Na wszelki wypadek wyciąłeś tak mały fragment z programu, że trudno zgadnąć, co zepsułeś w deklaracjach danych.

    Używasz typu doble - to jakieś 16 cyfr znaczących. Nie przesadzasz z tą precyzją? Wiesz, ile to kosztuje czasu i pamięci? Myślę, że znacznie łatwiej byłoby trzymać ten współczynnik jako liczbę całkowitą i wyświetlać ją wstawiając kropkę przed ostatnią cyfrę. Na pewno byłoby to kilkaset razy szybsze.

    Może to być też problem braku programowego ignorowania drgań przycisków.

    Dalsze zgadywanie wymaga znajomości całego kodu.
  • REKLAMA
  • #3 11935471
    rafmos
    Poziom 13  
    A w jaki sposób mnożyć przez tę liczbę całkowitą? Próbowałem dodawać do przekładni 1 a później wynik dzielić przez dziesięć to przeskakiwały inne liczby.
  • #4 11935492
    BlueDraco
    Specjalista - Mikrokontrolery
    Po prostu przechowujesz wartość współczynnika pomnożoną przez 10, czyli zamiast 1.5 zapisujesz 15. Tam, gdzie używasz jej w działaniach, mnożysz coś przez współczynnik i dzielisz przez 10. To jedna z możliwości. Inna - to konsekwentne przechowywanie danych w postaci pomnożonej przez 10, 100 lub 1000 (np. napięcie trzymasz w mV zamiast w V).
  • REKLAMA
  • #5 11935671
    Dawid WAT
    Poziom 14  
    Witam
    czy jesteś pewien że dobrze odmierza czas instrukcja
    Kod: text
    Zaloguj się, aby zobaczyć kod


    być może odczytuje dwa razy naciśnięcie przycisku i dlatego przeskakuje kolejne wartości.

    Pozdrawiam Dawid
  • #6 11936065
    rafmos
    Poziom 13  
    Czy istnieje możliwość, że przy operacji dzielenia przez mikroprocesor przez dziesięć powstają błędy?
  • REKLAMA
  • #7 11936101
    piotrva
    VIP Zasłużony dla elektroda
    Pokaż program.
    Bo jak masz źle zrobiony program to gdzieś podzielenie przez 10 może spowodować błąd. Ale sam w sobie procesor nie zawiesi się podczas dzielenia przez 10, ani nic z tych rzeczy - w tak popularnej kości na pewno by to zauważono :D
  • #8 11936112
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie, ale jest możliwość, że masz parę błędów w programie.
  • #9 11936868
    tmf
    VIP Zasłużony dla elektroda
    BlueDraco napisał:
    Na wszelki wypadek wyciąłeś tak mały fragment z programu, że trudno zgadnąć, co zepsułeś w deklaracjach danych.

    Używasz typu doble - to jakieś 16 cyfr znaczących. Nie przesadzasz z tą precyzją? Wiesz, ile to kosztuje czasu i pamięci?


    Na AVR double=float. Nie ma typu o podwójnej precyzji.

    Dodano po 3 [minuty]:

    IMHO niezależnie od innych powodów pokazany problem to urok korzystania z float. To są liczby o skończonej precyzji, kolejne dodawanie małych wartości prowadzi do akumulacji błędu i potencjalnie tego co obserwujesz. Gdyby mantysa była nieskończona to problemu by nie było. Można to ominąć tak jak pokazali wcześniej koledzy, albo użyć typów stałoprzeciwnkowych - _Fract, long _Fract itd.
  • #10 11950983
    rafmos
    Poziom 13  
    Błędy były gdzieś w procedurze wyświetlania. Wyrzuciłem ją i tak jak radził BlueDraco wyświetlam przecinek między ostatnimi liczbami. A wartość mnożę i dzielę przez 10.
REKLAMA