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

[mega8][bascom] funkcja fusing.

Scofield1 31 Mar 2009 22:11 5664 18
  • #1 6359869
    Scofield1
    Poziom 11  
    Witam. Mam mały problem z funkcją fusing. Mianowicie, mam liczbę dla przykładu 1.26 i chcę aby była ona wyświetlana w postaci 01.26. Stosuję funkcję fusing(zmienna, "##.##") i nic nie dodaje przed jedynką czyli wyświetla się liczba 1.26.

    Kod programu, na którym testuje:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Dim A As Single , Z As String * 10
    
    A = 1.26
    Do
    Cls
    Locate 1 , 1
    Lcd "##.## = 1.26"
    Locate 2 , 2
    Z = Fusing(A , "##.##")
    
    Lcd Z
    Waitms 100
    
    Loop
    End


    Zna ktoś rozwiązanie do tego problemu ?
  • #2 6359908
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #4 6359996
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #5 6360012
    crazy_phisic
    VIP Zasłużony dla elektroda
    Jak już korzystasz z STR to wystarczy dodać zero na początku:
    
    dim b  As String * 10
     
    A = 1.26 
    Do
    b=str(a)
    b="0" + b 
    Cls 
    Locate 1 , 1
    lcd B
    
    


    PS pisane z pamięci ;)
  • Pomocny post
    #7 6375112
    slawko_k
    Poziom 35  
    Można to zrobić tak:
    A=1.26

    if A<10 then lcd "0"
    lcd A

    efekt ten sam a chyba krócej i przejrzysciej
  • Pomocny post
    #8 6376071
    Konto nie istnieje
    Poziom 1  
  • #9 6511043
    marrog
    Poziom 22  
    Witam

    Podebne się pod temat.

    Mam problem tego typu, że dostaję liczbę z DS 18B20w postaci np 26.1234
    Chce uzyskąc powiedzmy z dokładnościa do 0.1 czyli 26.1, uzywam funkcji

    X= Fusing( zmienna, "#.#") i dostaje zamiast oczekiwanej wartości - wartość 0.00000026 albo coś podobnego.
    czytam Helpa i nie bardzo wiem w czym tkwi problem. Aha zmienne mam oczywiście typu Single

    z gory dzieki.
  • #10 6512856
    Konto nie istnieje
    Poziom 1  
  • #11 6513447
    slawko_k
    Poziom 35  
    no niemożliwe jak się helpa czyta

    Cytat:
    Aha zmienne mam oczywiście typu Single


    daj string jak w helpie i zadziała
  • #12 6513716
    marrog
    Poziom 22  
    Witam

    No właśnie patrze w HELP-a i tam jest że zmienna ma byc typu Single i tak mam.

    Cytat:

    mam odczyt temp z DS18B20 jako funcje:

    instrukcje
    .........
    1wwrite Czytaj_scratchpad
    Msb = 1wread(1)
    Lsb = 1wread(1)
    1wreset
    Temp = Makeint(msb , Lsb)
    Pomiar_temp_zew = Temp / 16
    end Function

    W pętli głównej wywołuje :
    Cytat:

    Temp_ds18b20 = Pomiar_temp_zew(i)

    Funkcja zwraca wartość typu Single, normalnie pokazuje temp poprawną, ale jak dam Fusing to wysypuje się, obojętnie czy dam w funkcji czy w pętli głównej, np:
    Cytat:

    Temp=Fusing(Temp_ds18B20,"#.#")
    LCD "Temperatura:"; Temp


    Nie wiem czy taki kawałek kodu wystarczy jeśli nie to zamieszcze całą funkcję, - może źle ją wywołuję i deklaruje.
    A poniżej deklaracaja i nagłówek funkcji:
    Cytat:

    Declare Function Pomiar_temp_zew(i As Byte)as Single

    Cytat:

    Function Pomiar_temp_zew(i As Byte)as Single
  • #13 6513841
    Konto nie istnieje
    Poziom 1  
  • #14 6513915
    marrog
    Poziom 22  
    Witam

    Procek to ATmega16.

    Kurcze nie mam teraz możliwości sprawdzenia czy zadziała, ale jutro z rana może później napiszę czy zadziałało.

    Teraz doczytałem dokładnie, że rezultat to zmienna tekstowa a nie typu single, może jak ją deklaruje jako single to się sypie w tym momencie ?

    A drugie pytanie jeszcze mam takie, że chcę zrobić np. termostat, czyli pobieram sobie jakąś wartość np. aktualna z DS i zmieniam z rozdzielczością 0.1 stC czyli teoretycznie takie coś
    nowa_wartosc=wartosc+- 0.1 ( +- w zależności czy będe klawiszem zmieniał w góre czy w dół)
    Normalnie działa ale jeśli daje Typu Single to otrzymuje np wartość 25.80007 ostatnia pozycja się zmienia ( wynika to z zapisu dwójkowego liczb zmiennoprzecinkowych - wiadomo o co chodzi) jak inaczej dokonąć takiej operacji?
    Nic nie przychodzi mi do głowy - a pewnie proste jak konstrukcja cepa, no ale czasem proste rzeczy są najtrudniejsze.

    -=pozdrawiam=-
  • #15 6514105
    Konto nie istnieje
    Poziom 1  
  • #16 6514141
    marrog
    Poziom 22  
    Witam

    Tak kompiluje się bez problemu :-D - widocznie zdolny jestem :-)

    No tak źle się wyraziłem, chodzi mi o temperaturę docelową, czyli mierze sobie temp w pomieszczeniu DS-em, mam zapisaną wartość temp. docelowej i porównując te dwie wartości włączam ogrzewanie bądź chłodzenie.
  • #17 6514160
    slawko_k
    Poziom 35  
    Cytat:
    Teraz doczytałem dokładnie, że rezultat to zmienna tekstowa a nie typu single, może jak ją deklaruje jako single to się sypie w tym momencie ?


    no to Ci przecież o tym pisałem.

    możesz to zrobić inaczej, bez żadnych konwersji.
    wyświetlasz 26.1234 a potem locate i zamazujesz 3 ostatnie cyfry.

    dużo w bascomi pisze i przyznam że zawsze jak używam jakiś podprogramów i funkcji z przekazaniem wartości jak u Ciebie to są problemy.
  • #18 6514929
    Konto nie istnieje
    Poziom 1  
  • #19 6515157
    marrog
    Poziom 22  
    Witam

    No dokładnie problem rozwiązany.
    Dodam że czytałem ten akapit w HELP-ie chyba z 10 razy i nie dostrzegłem tego co przed nosem było napisane.

    Wielkie dzięki za pomoc.
REKLAMA