Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM] Odczyt temperatury z dokładnością do 0,1 - DS18B20

sim_007 22 Jan 2010 19:16 6412 35
IGE-XAO
  • #1
    sim_007
    Level 11  
    Witam.
    Zrobiłem już część programu:

    Code:
    $regfile = "2313def.dat"
    
    $crystal = 12000000

    '-- konfiguracja zmiennch:
        'potrebne do odczytu 1wire itd.
    Dim Liczba As Byte
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte

    '--deklaracja podprogramow:
    Declare Sub 1
    Declare Sub 2
    Declare Sub 3
    Declare Sub 4
    Declare Sub 5
    Declare Sub 6
    Declare Sub 7
    Declare Sub 8
    Declare Sub 9
    Declare Sub 0
    Declare Sub Minus
    Declare Sub Resetuj

    '-- wyjscia sterowania segmentami:
    Config Portb = Output
    Set Portb

    A Alias Portb.0
    B Alias Portb.1
    C Alias Portb.2
    D Alias Portb.3
    E Alias Portb.4
    F Alias Portb.5
    G Alias Portb.6
    Dp Alias Portb.7

    '-- wyjscia multipleksowania segmentow:
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output

    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Portd.5

    S1 Alias Portd.2
    S2 Alias Portd.3
    S3 Alias Portd.4
    S4 Alias Portd.5

    '-- wejscie czujnika DS18B20:
    Config 1wire = Portd.0

    Set Portd.0

    '-- Program gowny:
    Do

    '-- tej czesci niemam
       'trzeba tu zrobic odczyt temperatury i podzielenie jej na:
       '  czesci dziesietne    -czdziesietne
       '  jednosci             -jednosci
       '  dziesiatki           -dziesiatki
       '  i calkowita liczbe   -liczba

       If Liczba < 0 Then
       Set S1
       Gosub Minus
       Reset S1
       Gosub Resetuj
       End If

       Set S3
       Reset Dp
       Set S3
       Gosub Resetuj

       'dziesiatki:
       Set S2

       If Dziesiatki = 1 Then
       Gosub 1
       End If

       If Dziesiatki = 2 Then
       Gosub 2
       End If

       If Dziesiatki = 3 Then
       Gosub 3
       End If

       If Dziesiatki = 4 Then
       Gosub 4
       End If

       If Dziesiatki = 5 Then
       Gosub 5
       End If

       If Dziesiatki = 6 Then
       Gosub 6
       End If

       If Dziesiatki = 7 Then
       Gosub 7
       End If

       If Dziesiatki = 8 Then
       Gosub 8
       End If

       If Dziesiatki = 9 Then
       Gosub 9
       End If

       Reset S2
       Gosub Resetuj



       ' jednosci:
       Set S3

       If Jednosci = 0 Then
       Gosub 0
       End If

       If Jednosci = 1 Then
       Gosub 1
       End If

       If Jednosci = 2 Then
       Gosub 2
       End If

       If Jednosci = 3 Then
       Gosub 3
       End If

       If Jednosci = 4 Then
       Gosub 4
       End If

       If Jednosci = 5 Then
       Gosub 5
       End If

       If Jednosci = 6 Then
       Gosub 6
       End If

       If Jednosci = 7 Then
       Gosub 7
       End If

       If Jednosci = 8 Then
       Gosub 8
       End If

       If Jednosci = 9 Then
       Gosub 9
       End If

       Reset S3
       Gosub Resetuj



       ' czesci dziesietne:
       Set S4

       If Czdziesietne = 0 Then
       Gosub 0
       End If

       If Czdziesietne = 1 Then
       Sub 1
       End If

       If Czdziesietne = 2 Then
       Gosub 2
       End If

       If Czdziesietne = 3 Then
       Gosub 3
       End If

       If Czdziesietne = 4 Then
       Gosub 4
       End If

       If Czdziesietne = 5 Then
       Gosub 5
       End If

       If Czdziesietne = 6 Then
       Gosub 6
       End If

       If Czdziesietne = 7 Then
       Gosub 7
       End If

       If Czdziesietne = 8 Then
       Gosub 8
       End If

       If Czdziesietne = 9 Then
       Gosub 9
       End If

       Reset S4
       Gosub Resetuj

    Loop
    End


    [b]Sub 1[/b]
       Reset B
       Reset C
       Return
       End Sub

    Sub 2
       Reset A
       Reset B
       Reset G
       Reset E
       Reset D
       Return
    End Sub

    Sub 3
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
       Return
    End Sub

    Sub 4
       Reset F
       Reset G
       Reset B
       Reset C
       Return
    End Sub

    Sub 5
       Reset A
       Reset F
       Reset G
       Reset C
       Reset D
       Return
    End Sub

    Sub 6
       Reset A
       Reset F
       Reset E
       Reset D
       Reset C
       Reset G
       Return
    End Sub

    Sub 7
       Reset A
       Reset B
       Reset C
       Return
    End Sub

    Sub 8
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Reset G
       Return
    End Sub

    Sub 9
       Reset G
       Reset F
       Reset A
       Reset B
       Reset C
       Reset D
       Return
    End Sub

    Sub 0
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Return
    End Sub

    Sub Minus
       Reset G
       Return
    End Sub

    Sub Resetuj
       Set A
       Set B
       Set C
       Set D
       Set E
       Set F
       Set G
       Set Dp
       Return
    End Sub


    Nie wiem co jest źle, ale wyświetla mi błąd w linii oznaczonej B , w której jest "Return".
    Prosiłbym też o dopisanie tej części programu w której będzie odczyt z czujnika ds18b20 i podzielenie odczytu na poszczególne części, te które są podane w komentarzu.

    Oto schemat ideowy:
    [BASCOM] Odczyt temperatury z dokładnością do 0,1 - DS18B20

    PS.:Procesor to ATtiny2313.

    Z góry dzięki za pomoc... :D

    Pozdrawiam
    sim_007
  • IGE-XAO
  • Helpful post
    #2
    sysio10
    Level 15  
    wg helpa bascoma masz:

    Code:
    Gosub podprogram  'wywołanie
    
    ....
    ....


    a oznaczenie podprogramu

    Code:
    podprogram:
    
    ....
    .... 
    Return



    sub wymaga wcześniejszej deklaracji i wywołania poprzez call
    poza tym możesz mieć kłopoty ze zmiennymi oznaczonymi samymi cyframi

    w załączniku masz termometr który zrobiłem dla koleżanki (robiony na szybko więc nie jest specjalnie zoptymalizowany) ale działa.
  • #3
    sim_007
    Level 11  
    :D Hura... działa... - Brak błędów

    Gdzie ten załącznik :| :?:
    :D :D :D

    Możesz mi pomóc z częścią programu, w której jest odczyt z DS18B20 :?:
    Byłbym bardzo wdzięczny :D

    Dodano po 48 [sekundy]:

    Teraz jest tak

    Code:
    $regfile = "2313def.dat"
    
    $crystal = 12000000

    '-- konfiguracja zmiennch:
        'potrebne do odczytu 1wire itd.
    Dim Liczba As Byte
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte

    '-- wyjscia sterowania segmentami:
    Config Portb = Output
    Set Portb

    A Alias Portb.0
    B Alias Portb.1
    C Alias Portb.2
    D Alias Portb.3
    E Alias Portb.4
    F Alias Portb.5
    G Alias Portb.6
    Dp Alias Portb.7

    '-- wyjscia multipleksowania segmentow:
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output

    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Portd.5

    S1 Alias Portd.2
    S2 Alias Portd.3
    S3 Alias Portd.4
    S4 Alias Portd.5

    '-- wejscie czujnika DS18B20:
    Config 1wire = Portd.0

    Set Portd.0

    '-- Program gowny:
    Do

    '-- tej czesci niemam
       'trzeba tu zrobic odczyt temperatury i podzielenie jej na:
       '  czesci dziesietne    -czdziesietne
       '  jednosci             -jednosci
       '  dziesiatki           -dziesiatki
       '  i calkowita liczbe   -liczba

       If Liczba < 0 Then
       Set S1
       Gosub Minus
       Reset S1
       Gosub Resetuj
       End If

       Set S3
       Reset Dp
       Set S3
       Gosub Resetuj

       'dziesiatki:
       Set S2

       If Dziesiatki = 1 Then
       Gosub Cyfra1
       End If

       If Dziesiatki = 2 Then
       Gosub Cyfra2
       End If

       If Dziesiatki = 3 Then
       Gosub Cyfra3
       End If

       If Dziesiatki = 4 Then
       Gosub Cyfra4
       End If

       If Dziesiatki = 5 Then
       Gosub Cyfra5
       End If

       If Dziesiatki = 6 Then
       Gosub Cyfra6
       End If

       If Dziesiatki = 7 Then
       Gosub Cyfra7
       End If

       If Dziesiatki = 8 Then
       Gosub Cyfra8
       End If

       If Dziesiatki = 9 Then
       Gosub Cyfra9
       End If

       Reset S2
       Gosub Resetuj



       ' jednosci:
       Set S3

       If Jednosci = 0 Then
       Gosub Cyfra0
       End If

       If Jednosci = 1 Then
       Gosub Cyfra1
       End If

       If Jednosci = 2 Then
       Gosub Cyfra2
       End If

       If Jednosci = 3 Then
       Gosub Cyfra3
       End If

       If Jednosci = 4 Then
       Gosub Cyfra4
       End If

       If Jednosci = 5 Then
       Gosub Cyfra5
       End If

       If Jednosci = 6 Then
       Gosub Cyfra6
       End If

       If Jednosci = 7 Then
       Gosub Cyfra7
       End If

       If Jednosci = 8 Then
       Gosub Cyfra8
       End If

       If Jednosci = 9 Then
       Gosub Cyfra9
       End If

       Reset S3
       Gosub Resetuj



       ' czesci dziesietne:
       Set S4

       If Czdziesietne = 0 Then
       Gosub Cyfra0
       End If

       If Czdziesietne = 1 Then
       Gosub Cyfra1
       End If

       If Czdziesietne = 2 Then
       Gosub Cyfra2
       End If

       If Czdziesietne = 3 Then
       Gosub Cyfra3
       End If

       If Czdziesietne = 4 Then
       Gosub Cyfra4
       End If

       If Czdziesietne = 5 Then
       Gosub Cyfra5
       End If

       If Czdziesietne = 6 Then
       Gosub Cyfra6
       End If

       If Czdziesietne = 7 Then
       Gosub Cyfra7
       End If

       If Czdziesietne = 8 Then
       Gosub Cyfra8
       End If

       If Czdziesietne = 9 Then
       Gosub Cyfra9
       End If

       Reset S4
       Gosub Resetuj

    Loop
    End


    Cyfra1:
       Reset B
       Reset C
       Return


    Cyfra2:
       Reset A
       Reset B
       Reset G
       Reset E
       Reset D
       Return


    Cyfra3:
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
       Return


    Cyfra4:
       Reset F
       Reset G
       Reset B
       Reset C
       Return


    Cyfra5:
       Reset A
       Reset F
       Reset G
       Reset C
       Reset D
       Return


    Cyfra6:
       Reset A
       Reset F
       Reset E
       Reset D
       Reset C
       Reset G
       Return


    Cyfra7:
       Reset A
       Reset B
       Reset C
       Return


    Cyfra8:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Reset G
       Return


    Cyfra9:
       Reset G
       Reset F
       Reset A
       Reset B
       Reset C
       Reset D
       Return


    Cyfra0:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Return


    Minus:
       Reset G
       Return


    Resetuj:
       Set A
       Set B
       Set C
       Set D
       Set E
       Set F
       Set G
       Set Dp
       Return
  • Helpful post
    #4
    sysio10
    Level 15  
    Code:
    Odczytaj_ds:
    
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()
          Status_temp = 1

          If Ds_2 >= 248 Then                                   'wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Status_temp = 0
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2
          T1 = T1 + 0.05
    'T1 wartość temperatury xx.xx
          T1 = T1 * 10
    'wartość całkowita XXX
          Temperatura = T1 \ 1
          If Temperatura = 0 Then
          ' po to aby nie było -0.0
             Status_temp = 1
          End If
          If Temperatura <= 15 Then
             E = 250
          Else
             E = 0
          End If

          If Status_temp = 1 Then

             Wartosc_c3 = Temperatura Mod 10
             Temperatura = Temperatura \ 10
             Wartosc_c2 = Temperatura Mod 10
             Temperatura = Temperatura \ 10
             Wartosc_c1 = Temperatura Mod 10

             Wartosc = Wartosc_c3                               'obliczenie części dziesiętnej
             Gosub Okresl_wartosc                               'wartość 3 cyfry
             Wartosc_c3 = Wartosc_przel

             Wartosc = Wartosc_c2                               'obliczenie jedności
             Gosub Okresl_wartosc                               'wartość 2 cyfry
             Wartosc_c2 = Wartosc_przel
             Wartosc_c2 = Wartosc_c2 Or &B00100000

             If Wartosc_c1 = 0 Then                             'wyczyszczenie zera nieznaczącego
                Wartosc_c1 = 10
             End If

             Wartosc = Wartosc_c1                               'obliczenie dziesiątek
             Gosub Okresl_wartosc                               'wartość 1 cyfry
             Wartosc_c1 = Wartosc_przel


          Else
             'Portd =&Bdc.gebfa
             Wartosc_c1 = &B00010000                            'znak minus na 1 cyfrze
             If Temperatura < 100 Then                          'mniej niż 10 stopni
                Wartosc_c3 = Temperatura Mod 10
                Temperatura = Temperatura \ 10
                Wartosc_c2 = Temperatura Mod 10

                Wartosc = Wartosc_c3                            'obliczenie części dziesiętnej
                Gosub Okresl_wartosc                            'wartość 3 cyfry
                Wartosc_c3 = Wartosc_przel

                Wartosc = Wartosc_c2                            'obliczenie jedności
                Gosub Okresl_wartosc                            'wartość 2 cyfry
                Wartosc_c2 = Wartosc_przel
                Wartosc_c2 = Wartosc_c2 Or &B00100000

             Else
                Temperatura = Temperatura + 5                   'aby liczył średnią przy >10 stopni
                Temperatura = Temperatura \ 10
                Wartosc_c3 = Temperatura Mod 10
                Temperatura = Temperatura \ 10
                Wartosc_c2 = Temperatura Mod 10

                Wartosc = Wartosc_c3                            'obliczenie jedności
                Gosub Okresl_wartosc                            'wartość 3 cyfry
                Wartosc_c3 = Wartosc_przel

                Wartosc = Wartosc_c2                            'obliczenie dziesiątek
                Gosub Okresl_wartosc                            'wartość 2 cyfry
                Wartosc_c2 = Wartosc_przel

             End If

          End If

       End If
    Return


    co wyjaśniać? podaj elementy niezrozumiałe dla ciebie

    poza tym
    Code:
     If Jednosci = 0 Then
    
       Gosub Cyfra0
       End If

       If Jednosci = 1 Then
       Gosub Cyfra1
       End If

       If Jednosci = 2 Then
       Gosub Cyfra2
       End If

       If Jednosci = 3 Then
       Gosub Cyfra3
       End If

       If Jednosci = 4 Then
       Gosub Cyfra4
       End If

       If Jednosci = 5 Then
       Gosub Cyfra5
       End If

       If Jednosci = 6 Then
       Gosub Cyfra6
       End If

       If Jednosci = 7 Then
       Gosub Cyfra7
       End If

       If Jednosci = 8 Then
       Gosub Cyfra8
       End If

       If Jednosci = 9 Then
       Gosub Cyfra9
       End If

    zamień na
    Code:
    select case jednostki
    
       case 0
          Gosub Cyfra0
       case 1
          Gosub Cyfra1
       case 2
          Gosub Cyfra2
       case 3
          Gosub Cyfra3
       case 4
          Gosub Cyfra4
       case 5
          Gosub Cyfra5
       case 6
          Gosub Cyfra6
       case 7
          Gosub Cyfra7
       case 8
          Gosub Cyfra8
       case 9
          Gosub Cyfra9
    end select   


    łatwiej się to czyta a krócej pisze (i robi to samo)
  • #5
    sim_007
    Level 11  
    Jak "rozbić" liczbę na dziesiątki, jedności i części dziesiętne?
    Jak zamienić stopnie na stopnie Celcjusza?
  • Helpful post
    #6
    sysio10
    Level 15  
    Code:
       1wreset
    
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()
          Status_temp = 1

          If Ds_2 >= 248 Then                                   'wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Status_temp = 0
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2


    ten fragment odczytuje czujnik i pod zmienną T1 umieszcza wartość tempreatury (z pełną rozdzielczością czujnika - do chyba 3 miejsc po przecinku)
    aby T1 było z dokładnością do 1 miejsca po przecinku postanowiłem podnieść wartość o 0,05 i odciąć
    przykład T1 = 21,264
    oczekuję że będzie na wyświetlaczu 21,3
    w wyniku działania T1=T1+0,05 mam że T1 = 21,314
    jak obetnę drugie i trzecie miejsce będę miał 21,3
    robię to w taki sposób że
    T1 * 10 (czyli mam 213,14)
    po podzieleniu całkowitym T1 = T1 \ 1 (mam 213)
    2 to dziesiątki
    1 jedności
    3 to setne

    a wydzielam je tak:
    czesci_dziesiate= Temperatura Mod 10 (czyli 3 reszta z dzielenia 213 przez 10)
    T1 = T1 \ 10 (obniżenie wartości o ostatnią cyfrę 213\10 = 21)
    jednosci = T1 Mod 10 (czyli 1 reszta z dzielenia 21 przez 10)
    T1 = T1 \ 10 (obniżenie wartości o ostatnią cyfrę 21\10 = 2)
    dziasiatki = T1 Mod 10 (czyli 2 reszta z dzielenia 2 przez 10)
  • IGE-XAO
  • #7
    sim_007
    Level 11  
    ale sens będzie ten sam?
    chodzi o to "case"

    Dodano po 8 [minuty]:

    Przepraszam ale zmień nazwy zmiennych tak żeby były tak jak u mnie...
    bardzo proszę...
  • Helpful post
    #8
    sysio10
    Level 15  
    select case xxx (oznacza podaj wartość XXX)
    case 0 (jeżeli wartość = 0 to)
    ... tu może być wiele linii kodu który zostanie wykonany aż do kolejnej lini z case ...
    case 1 (jeżeli wartość = 1 to)
    .... itd itd...

    end select (zakańcza select case)

    ok
    do odczytu temperatury z DSa potrzeba dwóch zmiennych typu byte (jak się mają nazywać) u mnie są
    Ds_1
    Ds_2
    u ciebie nie widzę żadnych do tego celu
  • #9
    sim_007
    Level 11  
    a co ma później być z tymi zmiennymi?
    Ja potrzebuje tylko 4:
    ' czesci dziesietne - "czdziesietne"
    ' jednosci - "jednosci'
    ' dziesiatki - "dziesiatki"
    ' i calkowita liczbe - "liczba"
  • #10
    sysio10
    Level 15  
    są potrzebne na czas odczytu (trzeba gdzieś przechować to co podaje czujnik)
    niestety ds nie podaje wartości 251 oznaczającej 25,1

    poza tym potrzebujesz ich również tylko jeszcze o tym nie wiesz

    mogę ten program ustawić pod twoje potrzeby - ale w ten sposób niczego się nie nauczysz. Jak sam sobie poustawiasz to to ci się przyda przy kolejnych projektach.
  • #11
    sim_007
    Level 11  
    dobra tylko zrób tak by na końcu były te zmienne jak u mnie
    z taką samą nazwą ...
    chodzi o te 4 wyniki
  • #12
    sysio10
    Level 15  
    dodaj zmienne
    Dim Ds_1 As Byte
    Dim Ds_2 As Byte
    Dim T1 As Single
    Dim Temperatura As Word
    będą mi potrzebne do przekształcenia odczytu z termometra

    co rozumiesz pod zmienną "Liczba" ?
  • #13
    sim_007
    Level 11  
    już dopisałem do programu...

    Dodano po 55 [sekundy]:

    czekam na część główną... :D
  • #14
    sysio10
    Level 15  
    czy będziesz miał temperatury ujemne?
    i co oznacza zmienna "Liczba"
    Liczba jest typu byte (0-255) jak ma być <0 ?

    odczyt temperatury:
    w kodzie ująłem zmienną znak
    dim znak as bit
    znak = 0 wartość dodatnia
    znak = 1 wartość ujemna
    Code:


       znak = 0 'zakładam że wartość jest dodatnia
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()

          If Ds_2 >= 248 Then                                   ' to oznacza że wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Znak = 1  'zmieniam wartość zmiennej znak z dodatniej na ujemną
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2
          T1 = T1 + 0.05
    'T1 wartość temperatury xx.x
          T1 = T1 * 10
    'wartość całkowita XXX
          Temperatura = T1 \ 1
          If Temperatura = 0 Then    ' po to aby nie było -0.0
             Znak = 0     ' (przywracam wartość dodatnią gdy pomiar byłby -0,034
                              ' to po zaokrągleniu miałbym -0,0 co głupio wygląda)
          End If

          Czdziesietne = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Jednosci = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Dziesiatki = Temperatura Mod 10


    dodaj jeszcze zmienną
    Dim T2 As Single (użyłem w kodzie)


    aby odczytać trzeba wcześniej (o ok 750ms) poinformować Dsa że ma sobie przeliczyć temperaturę
    robi to polecenie
    Code:
       1wreset
    
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &H44
       end if
  • #15
    sim_007
    Level 11  
    wartości mają być też ujemne...
    dodaj to do programu i jakiego typo ma być wtedy zmienna?
  • #16
    sysio10
    Level 15  
    przeczytaj jeszcze raz poprzedniego posta


    chcesz gotowca czy sam to rozgryźć?

    Zmień sobie
    Code:
       If Liczba < 0 Then
    
       Set S1
       Gosub Minus
       Reset S1
       Gosub Resetuj
       End If

    na
    Code:
       If Znak = 1 Then 'wartosci ujemne
    
       Set S1
       Gosub Minus
       Reset S1
       Gosub Resetuj
       End If


    zmienna liczba nie będzie wtedy potrzebna
    zastąpi ją zmienna znak (zyskujesz na rozmiarze kodu bo zmienna liczba to 1 bajt a znak to 1 bit)

    poza tym może warto w blokach zapalania segmentów dodać
    waitms 5
    przed słowem return (aby po zapaleniu cyfry chociaż trochę spowolnić zanim ją się zgasi)

    tyle na dzisiaj - spadam do łóżka (jeżeli tematu nie rozgryziesz to jutro wieczorem ok 20.00-21.00 pomogę dalej)
    spróbuj rozgryźć kawałek mojego kodu bo:
    1. trzeba aktywować ds'a
    2. po aktywacji trzeba odczekać 750ms zanim odczyta się temperaturę
    3. co chcesz robić w tym czasie (coś wyświetlać np dotychczasową temp czy też zrobić przerwę)
    4. wyświetlać temperaturę po odczycie ds'a (przez jaki czas zanim odczytasz ponownie)
  • #17
    sim_007
    Level 11  
    Jak zdeklarować zmienną znak :?:
    Wtedy będą w programie zmienne:

    Code:
    Dim Jednosci As Byte
    
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte
    Dim Ds_1 As Byte
    Dim Ds_2 As Byte
    Dim T1 As Single
    Dim T2 As Single
    Dim Temperatura As Word
    Dim Znak ( :?: )


    Dodano po 19 [sekundy]:

    Zgadze się??

    Dodano po 5 [minuty]:

    Code:
    $regfile = "2313def.dat"
    
    $crystal = 12000000

    '-- konfiguracja zmiennch:
        'potrebne do odczytu 1wire itd.
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte
    Dim Ds_1 As Byte
    Dim Ds_2 As Byte
    Dim T1 As Single
    Dim T2 As Single
    Dim Temperatura As Word
    Dim Znak(print )

    '-- wyjscia sterowania segmentami:
    Config Portb = Output

    Set Portb

    A Alias Portb.0
    B Alias Portb.1
    C Alias Portb.2
    D Alias Portb.3
    E Alias Portb.4
    F Alias Portb.5
    G Alias Portb.6
    Dp Alias Portb.7

    '-- wyjscia multipleksowania segmentow:
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output

    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Portd.5

    S1 Alias Portd.2
    S2 Alias Portd.3
    S3 Alias Portd.4
    S4 Alias Portd.5

    '-- wejscie czujnika DS18B20:
    Config 1wire = Portd.0

    Set Portd.0

    '-- Program gowny:
       Set S1
       Set S2
       Set S3
       Set S4
       Gosub Cyfra8
       Wait 5
       Reset S1
       Reset S2
       Reset S3
       Reset S4
       Gosub Resetuj

    Do

       Znak = 0                                                 'zakładam że wartość jest dodatnia
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()

          If Ds_2 >= 248 Then                                   ' to oznacza że wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Znak = 1                                           'zmieniam wartość zmiennej znak z dodatniej na ujemną
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2
          T1 = T1 + 0.05

    'T1 wartość temperatury xx.x
          T1 = T1 * 10

    'wartość całkowita XXX
          Temperatura = T1 \ 1
          If Temperatura = 0 Then                               ' po to aby nie było -0.0
             Znak = 0                                           ' (przywracam wartość dodatnią gdy pomiar byłby -0,034
                              ' to po zaokrągleniu miałbym -0,0 co głupio wygląda)
          End If

          Czdziesietne = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Jednosci = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Dziesiatki = Temperatura Mod 10

       If Znak = 0 Then
       Gosub Minus

       Gosub Przecinek
       Gosub Dziesiatki
       Gosub Jednosci
       Gosub Czdziesietne

    Loop

    '-- Podprogramy:
    Dziesiatki:
       Set S2

       Select Case Dziesiatki
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Reset S2
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus

       Gosub Wlaczprzecinek

       Return

    Jednosci:
       Set S3

       Select Case Jednosci
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Reset S3
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus

       Gosub Wlaczprzecinek

       Return


    Czesci Dziesietne:
       Set S4

       Select Case Czdziesietne
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Reset S4
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus

       Gosub Wlaczprzecinek

       Return

    Cyfra1:
       Reset B
       Reset C
       Return


    Cyfra2:
       Reset A
       Reset B
       Reset G
       Reset E
       Reset D
       Return


    Cyfra3:
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
       Return


    Cyfra4:
       Reset F
       Reset G
       Reset B
       Reset C
       Return


    Cyfra5:
       Reset A
       Reset F
       Reset G
       Reset C
       Reset D
       Return


    Cyfra6:
       Reset A
       Reset F
       Reset E
       Reset D
       Reset C
       Reset G
       Return


    Cyfra7:
       Reset A
       Reset B
       Reset C
       Return


    Cyfra8:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Reset G
       Return


    Cyfra9:
       Reset G
       Reset F
       Reset A
       Reset B
       Reset C
       Reset D
       Return


    Cyfra0:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Return


    Minus:
       Set S1
       Reset G
       Reset S1
       Gosub Resetuj
       End If
       Return

    Wlaczprzecinek:
       Set S3
       Reset Dp
       Set S3
       Gosub Resetuj
       Return

    Resetuj:
       Set A
       Set B
       Set C
       Set D
       Set E
       Set F
       Set G
       Set Dp
       Return


    Sprawdź proszę dokładnie program... ale dokładnie. Zapytam dla pewności:
    Pod zmienną dziesiatki są dziesiątki,
    pod zmienna jednosci so jedności,
    a pod czdziesietne są części dziesiętne :?:
  • #18
    sim_007
    Level 11  
    "O co kaman" TUTAJ ???

    [BASCOM] Odczyt temperatury z dokładnością do 0,1 - DS18B20

    Dodano po 1 [godziny] 14 [minuty]:

    sim_007 wrote:

    Jak zdeklarować zmienną znak :?:


    Już znalazłem :D :arrow:
    sysio10 wrote:

    dim znak as bit
  • #19
    sysio10
    Level 15  
    I jak postępy?
    Daj ponownie cały kod - będzie mi łatwiej analizować.
    Jakieś wnioski, coś niezrozumiałe?
  • #20
    sim_007
    Level 11  
    Narazie wszystko ładnie...

    Już daje kod...
    Code:

    $regfile = "2313def.dat"
    $crystal = 12000000

    '-- konfiguracja zmiennch:
    Dim Znak As Bit
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte

    Dim Temperatura As Word

    Dim Ds_1 As Byte
    Dim Ds_2 As Byte

    Dim T1 As Single
    Dim T2 As Single





    '-- wyjscia sterowania segmentami:
    Config Portb = Output

    Set Portb

    A Alias Portb.0
    B Alias Portb.1
    C Alias Portb.2
    D Alias Portb.3
    E Alias Portb.4
    F Alias Portb.5
    G Alias Portb.6
    Dp Alias Portb.7

    '-- wyjscia multipleksowania segmentow:
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output

    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Portd.5

    S1 Alias Portd.2
    S2 Alias Portd.3
    S3 Alias Portd.4
    S4 Alias Portd.5

    '-- wejscie czujnika DS18B20:
    Config 1wire = Portd.0

    Set Portd.0

    '-- Program gowny:
       Set S1
       Set S2
       Set S3
       Set S4
       Gosub Cyfra8
       Wait 5
       Reset S1
       Reset S2
       Reset S3
       Reset S4
       Gosub Resetuj

    Do
    '-------------------------------------------------------------------------------
       Znak = 0                                                 'zakładam że wartość jest dodatnia
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()

          If Ds_2 >= 248 Then                                   ' to oznacza że wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Znak = 1                                           'zmieniam wartość zmiennej znak z dodatniej na ujemną
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2
          T1 = T1 + 0.05

    'T1 wartość temperatury xx.x
          T1 = T1 * 10

    'wartość całkowita XXX
          Temperatura = T1 \ 1

          Temperatura = T1 \ 1
          If Temperatura = 0 Then                               ' po to aby nie było -0.0
             Znak = 0                                           ' (przywracam wartość dodatnią gdy pomiar byłby -0,034
                              ' to po zaokrągleniu miałbym -0,0 co głupio wygląda)
          End If

          Czdziesietne = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Jednosci = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Dziesiatki = Temperatura Mod 10
    '-------------------------------------------------------------------------------
       If Znak = 0 Then
       Gosub Minus
       End If

       Gosub Przecinek

       Gosub Dziesiatki
       Gosub Jednosci
       Gosub Czescidziesietne

    Loop
    End

    '-- Podprogramy:
    Dziesiatki:
       Set S2

       Select Case Dziesiatki
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Waitms 20
       Reset S2
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus
       End If

       Gosub Wlaczprzecinek

       Return

    Jednosci:
       Set S3

       Select Case Jednosci
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Waitms 20
       Reset S3
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus
       End If

       Gosub Wlaczprzecinek

       Return


    Czescidziesietne:
       Set S4

       Select Case Czdziesietne
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Waitms 20
       Reset S4
       Gosub Resetuj

       If Znak = 0 Then
       Gosub Minus
       End If

       Gosub Wlaczprzecinek

       Return

    '-- Pod,podprogramy:
    Cyfra1:
       Reset B
       Reset C
       Return


    Cyfra2:
       Reset A
       Reset B
       Reset G
       Reset E
       Reset D
       Return


    Cyfra3:
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
       Return


    Cyfra4:
       Reset F
       Reset G
       Reset B
       Reset C
       Return


    Cyfra5:
       Reset A
       Reset F
       Reset G
       Reset C
       Reset D
       Return


    Cyfra6:
       Reset A
       Reset F
       Reset E
       Reset D
       Reset C
       Reset G
       Return


    Cyfra7:
       Reset A
       Reset B
       Reset C
       Return


    Cyfra8:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Reset G
       Return


    Cyfra9:
       Reset G
       Reset F
       Reset A
       Reset B
       Reset C
       Reset D
       Return


    Cyfra0:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Return


    Minus:
       Set S1
       Reset G
       Reset S1
       Gosub Resetuj
       End If
       Return

    Wlaczprzecinek:
       Set S3
       Reset Dp
       Set S3
       Gosub Resetuj
       Return

    Resetuj:
       Set A
       Set B
       Set C
       Set D
       Set E
       Set F
       Set G
       Set Dp
       Return


    .
    Przy ostatnim Return też wyskakuje błąd :cry:
    Sprawdź sam...
  • #21
    sysio10
    Level 15  
    linia 110 jest Gosub Przecinek
    a nie masz podprogramu
    przecinek:
    return

    i mamy 120% czyli o 20% przekroczoną wielkość procka

    Możemy próbować optymalizować kod lub większego procka

    max 2K kodu (ostro trzeba będzie wyciąć) czy ten układ attiny musi być czy możesz użyć innego?
  • #22
    sim_007
    Level 11  
    poprawiłem...

    Error:344 Line: 352 Program will overwrite bootloader [412 to long]

    o to chodzi?

    Dodano po 3 [minuty]:

    raczej to drugie(większy proc np.: Atmega8) bo trzeba dodać jezcze wyświetlanie poprzedniej temp. podczas odczytu ds'a :D

    Dodano po 1 [minuty]:

    może być???
    8kB wystarczy??? :D
  • #23
    sysio10
    Level 15  
    co jaki czas chcesz odczytywać temperaturę
    obecnie ustawiłeś program w pętle która tylko odczytuje ds-a

    my potrzebujemy pętlę która ciągle będzie odświeżała wyświetlacze

    czyli

    do

    ... tu odświeżanie wyświetlaczy

    loop

    a odczyt co pewien czas

    do odczytu trzeba
    1. zainicjować ds-a
    2. odczekać ok 750ms
    3. odczytać ds-a

    można to zrobić poprzez taimery lub poprzez przerwanie pętli wyświetlającej

    mój był na atmega8 - wystarczyło
  • #24
    sim_007
    Level 11  
    O takie coś chodzi:

    Code:

    '-- Program gowny:
       Gosub Odczytdsa
       
       Set S1
       Set S2
       Set S3
       Set S4
       Gosub Cyfra8
       Wait 5
       Reset S1
       Reset S2
       Reset S3
       Reset S4
       Gosub Resetuj

       
    Do

       For

          If Znak = 0 Then
          Gosub Minus
          End If

          Gosub Wlaczprzecinek

          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne

       Next

       Gosub Odczytdsa

    Loop
    End

    '-- Podprogramy:
    Odczytdsa:
       Znak = 0                                                 'zakładam że wartość jest dodatnia
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &HBE
          Ds_1 = 1wread()
          Ds_2 = 1wread()

          If Ds_2 >= 248 Then                                   ' to oznacza że wartość ujemna
             Ds_1 = 255 - Ds_1
             Ds_2 = 255 - Ds_2
             Znak = 1                                           'zmieniam wartość zmiennej znak z dodatniej na ujemną
          End If

          T1 = Ds_1 / 16
          T2 = Ds_2 * 16
          T1 = T1 + T2
          T1 = T1 + 0.05

    'T1 wartość temperatury xx.x
          T1 = T1 * 10

    'wartość całkowita XXX
          Temperatura = T1 \ 1

          Temperatura = T1 \ 1
          If Temperatura = 0 Then                               ' po to aby nie było -0.0
             Znak = 0                                           ' (przywracam wartość dodatnią gdy pomiar byłby -0,034
                              ' to po zaokrągleniu miałbym -0,0 co głupio wygląda)
          End If

          Czdziesietne = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Jednosci = Temperatura Mod 10
             Temperatura = Temperatura \ 10
          Dziesiatki = Temperatura Mod 10
  • #25
    sysio10
    Level 15  
    dobrze kombinujesz
    jeżeli chcesz uniknąć taimerów to

    do
    for
    ... wyświetlanie
    ... ta pętla powinna trwać około tyle czasu co ile chcesz odczytać temperaturę
    next

    gosub inicjowanie_dsa (pamiętaj że przed odczytem trzeba go poinformować że ma odczytać temp)

    for
    ... wyświetlanie
    ... ta pętla powinna trwać około 750ms
    next

    gosub odczyt_dsa

    loop
  • #26
    sim_007
    Level 11  
    To ile pętli zrobić żeby odświeżanie było co ok. 10 sek???
    A ile żeby było 750ms???

    Dodano po 8 [minuty]:

    1pętla trwa ok. 100ms jeśli temp. jest ujemna, a jeśli nie to 80ms
  • #27
    sysio10
    Level 15  
    a to zależy
    1. od taktowania zegara
    2. od tego ile czasu zajmuje to co jest pomiędzy "for" a "next"

    ja z reguły w takich przypadkach ustawiam na płytce testowej

    dim a as word (zmienna od 0 do 65535)

    tu daję jakiś sygnał na wyświetlaczu np wyświetlenie na 1 wyświetlaczu

    for a = 0 to 10000
    ...
    next

    tu daję kolejny sygnał na wyświetlaczu np wyświetlenie na 2 wyświetlaczu
    i patrzę na zegarek. Jak za mało aby sprawdzić to zwiększam wartość

    for a = 0 to 50000
    ...
    next

    jak za dużo to mniej więcej dzielę 10000 tak aby wyszło ok 1 sekundy (tutaj czasy nie są specjalnie istotne, byle nie zejść poniżej ok 0,6s czyli 600ms


    zastosowałeś
    Code:
       For
    

          If Znak = 0 Then
          Gosub Minus
          End If

          Gosub Wlaczprzecinek

          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne

       Next


    jezeli wstawisz
    Code:
       For
    

          Gosub Minus
          Gosub Wlaczprzecinek
          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne

       Next

    a
    Code:
    Minus:
    
       Reset S1
       if znak = 0 then 'wartość dodatnia
           Set G
       else  'tu jest wartość ujemna
           Reset G
       end if
       Gosub Resetuj
    Return


    to czas będzie taki sam niezależnie od tego czy dodatnia czy ujemna (mam rację?)


    jeżeli pętla trwa 100ms to wystarczy 10 razy ją wywołać aby dostać 1 sekundę :)
    ale coś nie wierzę w te 100ms (tak na nosa)

    a teraz coś dodatkowego:
    zauważ że wywołujesz podprogram wyświetlania np dziesiątek
    a w nim wywołujesz podprogram np wyświetlania cyfry 3
    na czym polega wyświetlanie cyfry 3
    otóż na takim ustawieniu portu B aby pojawiły się
    0 na B.0 (bo A zapalone)
    0 na B.1 (bo B zapalone)
    0 na B.2 (bo C zapalone)
    0 na B.3 (bo D zapalone)
    1 na B.4 (bo E zgaszone)
    1 na B.5 (bo F zgaszone)
    0 na B.6 (bo G zapalone)
    1 na B.7 (bo . zgaszone)

    więc wystarczy wpisać binarnie czyli że
    portB = &B10110000
    czyli = &B.GFEDCBA

    zamiast
    Code:
    Cyfra3:
    
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
    Return


    poza tym
    Code:
    Resetuj:
    
       Set A
       Set B
       Set C
       Set D
       Set E
       Set F
       Set G
       Set Dp
    Return

    to będzie to samo co
    Code:
    Resetuj:
    
       PortB= &B11111111
    Return


    Funkcjonujesz jeszcze? czy kończymy jutro?
    będę w niedzielę na elektrodzie po 18tej
    wstaw kod źródłowy i info co wymyśliłeś

    Powodzenia w działaniach
    Sylwek
  • #28
    sim_007
    Level 11  
    Witam.

    czas zmienia się o 20ms wtedy gdy jest minus:

    Code:

    Minus:
       Set S1
       Reset G
       Waitms 20
       Reset S1
       Gosub Resetuj
       End If
       Return


    "waitms 20"

    Dodano po 2 [minuty]:

    chyba, że zrobimy tak:

    Code:

    If znak = 0 then
    gosub minus
    else
    waitms 20
    endif


    Dodano po 2 [minuty]:

    $crystal = 12000000 przy okazji :p
  • #29
    sysio10
    Level 15  
    Code:
    If znak = 0 then
    
    gosub minus
    else
    waitms 20
    endif

    będzie trwało tyle samo pod warunkiem że wyświetlenie będzie trwało dokładnie 20ms

    jeżeli zastosujesz element jak ci wskazałem wyżej
    czyli zawsze wejście do podprogramu minus
    a podprogram
    Code:
    Minus:
    
       Reset S1
       if znak = 0 then 'wartość dodatnia
           Set G
       else  'tu jest wartość ujemna
           Reset G
       end if
       Gosub Resetuj
    Return

    to zauważ że czas jest taki sam bo zmienia się tylko to czy ma zostać zapalony segment "Reset G", czy też wygaszony "Set G" (stan segmentu G przed wejściem będzie wtedy nieistotny)

    Daj całość kodu po poprawkach - będzie mi łatwiej analizować

    DAJ KOD PO POPRAWKACH
  • #30
    sim_007
    Level 11  
    Chodzi o to aby minus był wyświetlany 20ms

    Dodano po 53 [minuty]:

    :idea: Proszę bardzo... :D

    Code:

    $regfile = "m8def.dat"
    $crystal = 12000000

    '-- konfiguracja zmiennch:
    Dim Znak As Bit
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Czdziesietne As Byte

    Dim Temperatura As Word

    Dim Ds_1 As Byte
    Dim Ds_2 As Byte

    Dim T1 As Single
    Dim T2 As Single

    Dim Zmienna_x As Byte
    Dim Zmienna_y As Byte

    '-- wyjscia sterowania segmentami:
    Config Portb = Output

    Set Portb

    A Alias Portb.0
    B Alias Portb.1
    C Alias Portb.2
    D Alias Portb.3
    E Alias Portb.4
    F Alias Portb.5
    G Alias Portb.6
    Dp Alias Portb.7

    '-- wyjscia multipleksowania segmentow:
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output

    Reset Portd.2
    Reset Portd.3
    Reset Portd.4
    Reset Portd.5

    S1 Alias Portd.2
    S2 Alias Portd.3
    S3 Alias Portd.4
    S4 Alias Portd.5

    '-- wejscie czujnika DS18B20:
    Config 1wire = Portd.0

    Set Portd.0

    '-- Program gowny:
    Gosub Inicjowanie_dsa

    Set S1
    Set S2
    Set S3
    Set S4
    Gosub Cyfra8
    Waitms 750
    Reset S1
    Reset S2
    Reset S3
    Reset S4
    Gosub Resetuj

    Gosub Odczyt_dsa

    Do

       For Zmienna_x = 0 To 100                   '-- Petla 10 sek:

          Zmienna_x = Zmienna_x + 1

          If Znak = 0 Then
          Gosub Minus

          Gosub Wlacz_przecinek

          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne

       Next Zmienna_x

       Gosub Inicjowanie_dsa


       For Zmienna_y = 0 To 10                    '-- Petla 1000ms

          Zmienna_y = Zmienna_y + 1

          If Znak = 0 Then
          Gosub Minus


          Gosub Wlaczprzecinek

          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne

       Next Zmienna_y

       Gosub Odczyt_dsa

    Loop
    End

    '-- Podprogramy:
    Inicjowanie_dsa:
       Znak = 0  'zakładam że wartość jest dodatnia
       1wreset
       If Err = 0 Then
       1wwrite &HCC
       1wwrite &HBE
       Else
       Gosub Error
       End If

       return

    Odczyt_dsa:
    Ds_1 = 1wread()
    Ds_2 = 1wread()

    If Ds_2 >= 248 Then                                         ' to oznacza że wartość ujemna
    Ds_1 = 255 - Ds_1
    Ds_2 = 255 - Ds_2
    Znak = 1                                                    'zmieniam wartość zmiennej znak z dodatniej na ujemną
    End If

    T1 = Ds_1 / 16
    T2 = Ds_2 * 16
    T1 = T1 + T2
    T1 = T1 + 0.05

    'T1 wartość temperatury xx.x
    T1 = T1 * 10

    'wartość całkowita XXX
    Temperatura = T1 \ 1

    Temperatura = T1 \ 1
    If Temperatura = 0 Then                                     ' po to aby nie było -0.0
    Znak = 0                                                    ' (przywracam wartość dodatnią gdy pomiar byłby -0,034
    End If                                                      ' to po zaokrągleniu miałbym -0,0 co głupio wygląda)


    Czdziesietne = Temperatura Mod 10
      Temperatura = Temperatura \ 10
    Jednosci = Temperatura Mod 10
      Temperatura = Temperatura \ 10
    Dziesiatki = Temperatura Mod 10

    Dziesiatki:
       Set S2

       Select Case Dziesiatki
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Return

    Jednosci:
       Set S3

       Select Case Jednosci
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Return


    Czescidziesietne:
       Set S4

       Select Case Czdziesietne
       Case 0
          Gosub Cyfra0
       Case 1
          Gosub Cyfra1
       Case 2
          Gosub Cyfra2
       Case 3
          Gosub Cyfra3
       Case 4
          Gosub Cyfra4
       Case 5
          Gosub Cyfra5
       Case 6
          Gosub Cyfra6
       Case 7
          Gosub Cyfra7
       Case 8
          Gosub Cyfra8
       Case 9
          Gosub Cyfra9
       End Select

       Return

    Cyfra1:
       Reset B
       Reset C
       Return


    Cyfra2:
       Reset A
       Reset B
       Reset G
       Reset E
       Reset D
       Return


    Cyfra3:
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
       Return


    Cyfra4:
       Reset F
       Reset G
       Reset B
       Reset C
       Return


    Cyfra5:
       Reset A
       Reset F
       Reset G
       Reset C
       Reset D
       Return


    Cyfra6:
       Reset A
       Reset F
       Reset E
       Reset D
       Reset C
       Reset G
       Return


    Cyfra7:
       Reset A
       Reset B
       Reset C
       Return


    Cyfra8:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Reset G
       Return


    Cyfra9:
       Reset G
       Reset F
       Reset A
       Reset B
       Reset C
       Reset D
       Return


    Cyfra0:
       Reset A
       Reset B
       Reset C
       Reset D
       Reset E
       Reset F
       Return


    Minus:
       Set S1
       Reset G
       Waitms 20
       Reset S1
       Gosub Resetuj
       Return

    Wlacz_przecinek:
       Set S3
       Reset Dp
       Waitms 20
       Set S3
       Gosub Resetuj
       Return

    Resetuj:
       Portb = &B11111111
       Return

    Error:
       Do
          Set S1
          Reset A
          Reset F
          Reset G
          Reset E
          Reset D
          Waitms 20
          Reset S1
          Gosub Resetuj
       Loop


    czy czas od zainicjowania do odczytu (ds'a) może być większy od 750ms :?: Jeśli tak to jaka jest jego maksymalna wartość :?: