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

Przekształcenie wyniku w zmiennej Single na wyświetlacze LED

19 Lis 2007 23:47 1259 9
  • Poziom 18  
    Mama prośbę o pomoc o przekształcenie wyniku pomiaru temperatury, który znajduje się w zmiennej typu Single na trzy wyświetlacze typu LED. Muszę ożenić programy dwóch urządzeń a konkretnie wstawić pomiar temperatury do urządzenia, które posiada wyświetlacze LED. Do tej pory nie było mi to potrzebne, bo wszystkie urządzenia mierzące temperaturę robiłem na wyświetlaczach LCD i tam nie ma problemu w przeformatowaniu zmiennej Single do czytelnej wersji z jedną cyfrą po przecinku. Szukałem na Elektrodzie jakiegoś przykładu ale jest tam tego setki i co post to inny sposób przeliczania temperatury. Znalazłem przykład jak to się robi ale temperatura była w zmiennej typu Integer. Nie chcę zmieniać procedury odczytu i przeliczania DS'a, bo "przyzwyczaiłem się do niej" więc jeśli jest to możliwe, to proszę o podpowiedź jak taki wynik można przekształcić na trzy zmienne typu Byte, które mogę wrzucić na LCD'ki

    Pozdrawiam
    Mariusz_N

    Dodano po 1 [godziny] 56 [minuty]:

    Może znajdzie się ktoś kto pomoże rozwiązać mi ten problem? cały czas wertuje neta mam parę przykładów ale niestety nie działają :/ urządzenie jest oparte o procesor 89s52 a przykłady raczej tyczą się procków AVR.

    Ponawiam prośbę.
  • Poziom 39  
    Wydaje mi się , że używasz Bascom8051 :?:
    Jeśli tak , to ... na początek wiadro zimnej wody :|
    Mariusz_N napisał:
    ...cały czas wertuje neta mam parę przykładów ale niestety nie działają :/

    Skoro te z neta nie działają , to może napisz własny kod :?:
    To jest proste , jak przysłowiowa konstrukcja cepa ;)


    Jeden z wielu możliwych sposobów, wyłącznie dla temperatur od 0 wzwyż - nie "gotowiec"
    Code:

    Dim Varstring As String * 4
    Dim Varaddr As Byte
    Dim X As Byte , Y As Byte , Z As Byte
    Dim Varsingle As Single

    Varsingle = 54.3
    Varstring = Fusing(varsingle , "0.#")       'Varstring="54.2" , bo dokładnośc Bascoma jest jaka jest :(
    Varaddr = Varptr(varstring)

    X = Peek(varaddr) - &H30       'X=5
    Incr Varaddr
    Y = Peek(varaddr) - &H30       'Y=4
    Incr Varaddr       'przeskakujemy punkt dziesiętny(kropkę)
    Incr Varaddr
    Z = Peek(varaddr) - &H30       'Z=2
    '...

    Jeśli do pomiaru wykorzystujesz DS18x20 , to przy obliczeniach temperatury używanie zmiennych SINGLE , pasuje jak ... kwiatek do kożucha :|

    Piotrek
  • Poziom 18  
    No tak sorki podałem za mało danych! tak używam Bascom51, bo urządzenie do którego mam wstawić pomiar temperatury jest na procku 89s52 a temperatura będzie mierzona czujnikiem DS18B20. Dzięki Zumek za słowa otuchy ale z tą budową cepa to nie takie proste, bo gdyby było, to nie prosił bym o pomoc. Jeśli chodzi o Single i ten " kwiatek do kożucha ", to jak powinno to poprawnie być zrobione? Na Elektrodzie jest setki przykładów a prawie każdy inny i tyle samo osób kłócących się co do słuszności kodu!. Kod, który stosuje też pochodzi z Elektrody a wybrałem go dlatego, że wydaj mi się w miarę czytelny a czy użycie w tym kodzie zmiennej Single jest błędem, to nie wiem?

    Code:
    dim T11(2) as byte 
    
    dim T1 as single
    dim Temp as string * 5

    config 1wire=p3.0

    1wreset
    1wwrite &HCC
    1wwrite &H44

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    T11(1) = 1wread()
    T11(2) = 1wread()
    1wreset

    T1 = Makeint(T11(1) , T11(2))
    T1 = T1 / 16
    Temp = Fusing(T1 , #.#)

    i tu dalej Temp na wyświetlacz LCD


    Termometr powinien pracować w całym swoim zakresie -55 +125 więc jeśli, to nie problem dla Ciebie, to wskaż mi najbardziej optymalną wersję odczytu temperatury+przeliczenie tak aby potem nie było problemu z przekształceniem go na wyświetlacz LED w formie +/- 00.0.
  • Specjalista - oświetlenie sceniczne
    Cep jest zbudowany w naprawde prosty sposób. Bierzesz sobie wartość którą chcesz wyświetlić i dzielisz przez 10 (dziesiętnie jak by były wątpliwości). Reszte, która została z dzielenia wywalasz na ostatni w kolejności wyświetlacz. Całość która została po dzieleniu znów dzielisz przez 10, reszta z tego dzielenia idzie na przedostatni wyświetlacz. I tak dalej- do usr.#$ śmierci :)

    Proste?
  • Poziom 18  
    OK! bolek ale jak to dzielenie się ma do ujemnej temperatury? i czy powyższy sposób przeliczania DS'a jest prawidłowy? przyznam się, że kolega zumek
    zasiał mi duże ziarno wątpliwości co do użycia zmiennej Single i w dalszym ciągu czytam posty na temat DS'ów mając nadzieję, że znajdę coś prostszego. Qrcze to nie może być aż tak skomplikowane działanie żeby powycinać cyferki te, które się chce.
  • Poziom 12  
    Myślę że to może pomóc, Ja używam tego fragmentu kodu i radzi sobie doskonale, można go rozpisywać do dowolnej długości:



    Dim Ala As Byte , A As Byte
    Dim Licz As Word
    Dim Do_podzielenia_pomoc As Word


    Licz = 987 'pierwszy raz trzeba zaladowac
    Gosub Dzielenie 'a teraz tylko wywolujemy
    P1.3 = 0
    Ala = Lookup(ala , Znaki)
    P3 = Ala
    Waitms 5
    P1.3 = 1 'zaczynamy od ostatniego
    Gosub Dzielenie
    P1.4 = 0
    Ala = Lookup(ala , Znaki)
    P3 = Ala 'srodkowy
    Waitms 5
    P1.4 = 1
    Gosub Dzielenie
    P1.5 = 0
    Ala = Lookup(ala , Znaki)
    P3 = Ala
    Waitms 5
    P1.5 = 1


    Dzielenie:
    Do_podzielenia_pomoc = Licz Mod 10
    Ala = Low(do_podzielenia_pomoc)
    Licz = Licz \ 10
    Return

    '**********************************************************
    Znaki: ' tabela danych
    Data 127 , 6 , 155 , 143 , 166 , 173 , 189 , 39 , 255 , 175
  • Poziom 18  
    Dzięki Spięcie za przykład ale to jest dobre gdy zmienna jest typu word i znalazłem już podobne sposoby przeliczania które działają z liczbą całkowitą od zera w górę ja niestety mam to nieszczęsne single z przecinkiem i na dodatek +/-
  • Pomocny post
    Poziom 39  
    Mariusz_N napisał:
    ... znalazłem już podobne sposoby przeliczania które działają z liczbą całkowitą od zera w górę ja niestety mam to nieszczęsne single z przecinkiem i na dodatek +/-

    A co to za problem , czy tylko dodatnie , czy pełen zakres -/+ :?:
    Przecież wystarczy sprawdzić tylko czy liczba jest mniejsza od zera , a resztę obliczeń , wycinanie cyfr, itp. wykonać na dodatniej .
    Code:

    Dim Temp As Single , Minus As Bit
    Temp=-25.7
    If Temp<0 Then
       Set Minus         'Minus=1 - temp ujemna
       Temp=Temp * -1
    Else
       Reset Minus      'Minus=0 - temp dodatnia
    Endif
    '...

    Teraz Fusing na Temp i ... wycinanie :twisted:
    Chłopie , toż to jest tak proste , że aż wstyd pytać o takie cuś :)
    A tak na marginesie - słyszałeś o takich instrukcjach jak MID,LEFT,RIGHT,STR,VAL, itp. :?: Za ich pomocą , dowolnego stringa można "poszatkować" nawet na bity.

    Piotrek
  • Poziom 18  
    Myślę, że większym wstydem jest nie przyznanie się do braku wiedzy lub błędu. Wielkie dzięki zumek wszystko już jasne.

    Pozdrawiam.
    Temat OFF.