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

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

sim_007 22 Sty 2010 19:16 6655 35
  • #1 7575156
    sim_007
    Poziom 11  
    Witam.
    Zrobiłem już część programu:

    $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
  • Pomocny post
    #2 7575438
    sysio10
    Poziom 16  
    wg helpa bascoma masz:

    Gosub podprogram  'wywołanie
    ....
    ....


    a oznaczenie podprogramu

    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 7575543
    sim_007
    Poziom 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

    $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
  • Pomocny post
    #4 7575554
    sysio10
    Poziom 16  
    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
     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
    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 7575636
    sim_007
    Poziom 11  
    Jak "rozbić" liczbę na dziesiątki, jedności i części dziesiętne?
    Jak zamienić stopnie na stopnie Celcjusza?
  • Pomocny post
    #6 7575681
    sysio10
    Poziom 16  
       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)
  • #7 7575684
    sim_007
    Poziom 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ę...
  • Pomocny post
    #8 7575744
    sysio10
    Poziom 16  
    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 7575780
    sim_007
    Poziom 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 7575791
    sysio10
    Poziom 16  
    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 7575802
    sim_007
    Poziom 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 7575819
    sysio10
    Poziom 16  
    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 7575831
    sim_007
    Poziom 11  
    już dopisałem do programu...

    Dodano po 55 [sekundy]:

    czekam na część główną... :D
  • #14 7575842
    sysio10
    Poziom 16  
    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
    
    
       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
       1wreset
       If Err = 0 Then
          1wwrite &HCC
          1wwrite &H44
       end if
  • #15 7575966
    sim_007
    Poziom 11  
    wartości mają być też ujemne...
    dodaj to do programu i jakiego typo ma być wtedy zmienna?
  • #16 7575984
    sysio10
    Poziom 16  
    przeczytaj jeszcze raz poprzedniego posta


    chcesz gotowca czy sam to rozgryźć?

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

    na
       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 7577937
    sim_007
    Poziom 11  
    Jak zdeklarować zmienną znak :?:
    Wtedy będą w programie zmienne:

    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]:

    $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 7579949
    sim_007
    Poziom 11  
    "O co kaman" TUTAJ ???

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

    Dodano po 1 [godziny] 14 [minuty]:

    sim_007 napisał:

    Jak zdeklarować zmienną znak :?:


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

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

    Już daje kod...
    
    $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 7580708
    sysio10
    Poziom 16  
    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 7580732
    sim_007
    Poziom 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 7580794
    sysio10
    Poziom 16  
    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 7580852
    sim_007
    Poziom 11  
    O takie coś chodzi:

    
    '-- 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 7580893
    sysio10
    Poziom 16  
    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 7580908
    sim_007
    Poziom 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 7580958
    sysio10
    Poziom 16  
    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ś
       For
    
          If Znak = 0 Then
          Gosub Minus
          End If
    
          Gosub Wlaczprzecinek
    
          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne
    
       Next 


    jezeli wstawisz
       For
    
          Gosub Minus
          Gosub Wlaczprzecinek
          Gosub Dziesiatki
          Gosub Jednosci
          Gosub Czescidziesietne
    
       Next 

    a
    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
    Cyfra3:
       Reset A
       Reset B
       Reset G
       Reset C
       Reset D
    Return


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

    to będzie to samo co
    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 7583194
    sim_007
    Poziom 11  
    Witam.

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

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


    "waitms 20"

    Dodano po 2 [minuty]:

    chyba, że zrobimy tak:

    
    If znak = 0 then
    gosub minus
    else
    waitms 20
    endif
    


    Dodano po 2 [minuty]:

    $crystal = 12000000 przy okazji :p
  • #29 7585492
    sysio10
    Poziom 16  
    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
    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 7585561
    sim_007
    Poziom 11  
    Chodzi o to aby minus był wyświetlany 20ms

    Dodano po 53 [minuty]:

    :idea: Proszę bardzo... :D

    
    $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ść :?:
REKLAMA