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

[Bascom] funkcja Str - ograniczenie ilości użycia funkcji

maximus22_kr 03 Sty 2012 10:23 1353 5
  • #1 03 Sty 2012 10:23
    maximus22_kr
    Poziom 18  

    Witam
    Mam taki kod:

    Code:


    $regfile = "m328pdef.dat"
    $crystal = 14745600
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 128                                              ' rozmiar stosu sprzętowego
    $swstack = 128                                              ' rozmiar stosu programowego
    $framesize = 128                                            ' rozmiar ramki

    Do
    Locate 3 , 1
    Lcd Ss1 ; Chr(0) ; " "

    Locate 3 , 10
    Lcd Ss2 ; Chr(0) ; " "

    Locate 4 , 1
    Lcd Ss3 ; Chr(0) ; " "

    Locate 4 , 10
    Lcd Ss4

    Loop

    '***************************** Pomiar temperatury
    Sub Pomiar
    Disable Interrupts
    '********************* odczyt pierwszego DS18B20
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
    '********************* odczyt drugiego DS18B20
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2 = 1wread(2)
    '********************* odczyt trzeciego DS18B20
       1wreset
       1wwrite &H55
       1wverify Dsid3(1)
       1wwrite &HBE
       I3 = 1wread(2)

     '********************* konwersja dla wszystkich DS18B20
       1wreset
       1wwrite &HCC
       1wwrite &H44
     Waitms 750

     Pcf_out = &B01111111                                       ' stan niski wyjścia P5 ( dec = 223 )
     Call Pcf_zapis

    Enable Interrupts
    Licznik_ds = 0

    '***************************** Obliczanie temperatury

    '********************* Obliczenia dla pierwszego
       I1 = I1 * 10
       I1 = I1 / 16
       Ss1 = Str(i1)
       Ss1 = Format(ss1 , " 0.0")


    '********************* Obliczenia dla drugiego
       I2 = I2 * 10
       I2 = I2 / 16
       Ss2 = Str(i2)
       Ss2 = Format(ss2 , " 0.0")

    '********************* Obliczenia dla trzeciego
       I3 = I3 * 10
       I3 = I3 / 16
       Ss3 = Str(i3)
       Ss3 = Format(ss3 , " 0.0")

    '********************* Obliczenia dla czwartego "wirtulanego
    Tmp3 = I1
    Tmp4 = Tmp3

    '   Tmp4 = Tmp4 * 10
    '   Tmp4 = Tmp4 / 16
        Tmp4 = Tmp4 + 20
        Ss4 = Str(tmp4)
        Ss4 = Format(ss4 , " 0.0")
    End Sub


    Nie ma czwartego czujnika - tylko dodaje 2 stopnie do wskazań tego, który jest u mnie umieszczony na kaloryferze - ale to nie istotne.
    Użycie cztery razy funkcji Str powoduje, że wskazania pierwszego wyświetlane są w postaci:
    symbol stopnia . cyfra . cyfra symbol stopnia - przy czym cyfry to są wartości temperatury po przecinku z dwóch różnych DS18B20

    usunięcie ( zaremowanie ) którejś z funkcji Str ( drugiej lub trzeciej ) powoduje, że pozostałe trzy pozostałe są wyświetlane OK.
    Oprócz tych czterech używam w kodzie jeszcze raz funkcji Str ( czyli w sumie pięć razy).

    Jest jakiś limit użycia funkcji Str w kodzie programu ?

    0 5
  • #2 03 Sty 2012 10:52
    Jaduda
    Poziom 32  

    Jakiś dziwny ten kod, w pętli głównej nie masz odwołania do procedury "Pomiar", brak jest końca procedury "End Sub" dla Sub Pomiar... czy w ogóle ten kod Ci się kompiluje?

    0
  • #3 03 Sty 2012 13:49
    maximus22_kr
    Poziom 18  

    Błąd przy kopiowaniu kodu.
    To

    Code:

    Pcf_out = &B01111111                                       ' stan niski wyjścia P5 ( dec = 223 )
     Call Pcf_zapis

    to sterowanie jednym z portów PCF8574, ustawionym jako wyjście

    Co do wywołania Pomiar to dzieje się to przez Timer2 co około 12 sekund.

    Wskazania są takie:
    Ss1
    znak stopnia. 9. 9 znak stopnia
    Ss2
    26.9 znak stopnia
    Ss3
    25.9 znak stopnia
    Ss4
    27.9 znak stopnia

    wskazania pierwszego ss1 są utworzone z wartości innych - dokładnie tego co jest po przecinku. Dzieje się to zawsze dla Ss1 - no i zauważyłem, że przez krótki czas, może z 0,5 sekundy w momencie wywołania Pomiar jest wyświetlany właściwy wynik

    Usuwam druga lub trzecią funkcję Str() i wtedy dla tego wskazania jest 0, ale pozostałe są w porządku.

    Na pewno coś z tym Str() jest nie tak - próbowałem:
    Code:

    Ss4 = Format(ss3 , " 0.0")


    i wyświetla OK

    Dodano po 2 [godziny] 40 [minuty]:

    czy można zmienne I1, I2, I3, Tmp3 oraz Tmp4 zrobić jako lokalne dla podprogramu Pomiar, aby ograniczyć wielkość stosu ?

    0
  • #4 03 Sty 2012 15:01
    Mundi1970
    Poziom 24  

    Nigdzie nie jest pokazane jak są zdefiniowane stringi Ss i zmienne I. Może stringi masz za krótkie. W raporcie po kompilacji, niema żadnych warningów dotyczących stringów?

    0
  • #5 03 Sty 2012 15:26
    maximus22_kr
    Poziom 18  

    Code:

    I1 as Integer
    I2 as Integer
    I3 as Integer
    Tmp3 as Integer
    Tmp4 as Integer
    Ss1 as string*6
    Ss2 as string*6
    Ss3 as string*6
    Ss4 as string*6


    W poprzedniej wypowiedzi pytałem o zmienne lokalne, bo może stos się rozrasta/rozsypuje

    0
  • #6 03 Sty 2012 16:42
    Mundi1970
    Poziom 24  

    W raporcie masz mapę zmiennych w SRAM. Sprawdź jaka zmienna lub string jest przed SS1. Jeżeli jest to string, to może za mało bajtów jest przydzielonych.



    Code:
    --------------------------------------------------------------------------------
    
    Variable                         Type            Address(hex)   Address(dec)
    --------------------------------------------------------------------------------
    ..........................

    I1                               Integer           0105          261
    I2                               Integer           0107          263
    I3                               Integer           0109          265
    TMP3                             Integer           010B          267
    TMP4                             Integer           010D          269
    SS1                              String            010F          271
    SS2                              String            0116          278
    SS3                              String            011D          285
    SS4                              String            0124          292

    ...........................



    Source string could be too big to fit into target string [SS1>___STRBUF]  in line  35
    Source string could be too big to fit into target string [SS2>___STRBUF]  in line  42
    Source string could be too big to fit into target string [SS3>___STRBUF]  in line  48
    Source string could be too big to fit into target string [SS4>___STRBUF]  in line  58

    0
  Szukaj w 5mln produktów