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

[Bascom]20xDS18b20 zapis/odczyt ID EEPROM

tasiaop 21 Maj 2010 19:55 2219 4
REKLAMA
  • #1 8103139
    tasiaop
    Poziom 10  
    Witam.

    Szukałam już tutaj na forum i na google, ale nie znalazłam odpowiedzi na moje pytanie. Otóż mam zrobić na zaliczenie projekt termometru 20xDS18b20 z zapisem numerów ID czujników do EEPROM-u. Następnie chciałabym przy pomocy tych numerów ID zapisanych w EEPROM komunikować się z wybranym przeze mnie czujnikiem w celu odczytu temperatury.
    Na razie udawało mi się realizować proste programiki typu led i wyświetlanie tekstu na LCD. Prosiłabym o wyrozumiałość i pomoc w nakierowaniu mnie na rozwiązanie problemu.

    Pozdrawiam i z góry dziękuje.

    Kasia!
  • REKLAMA
  • #2 8104790
    tasiaop
    Poziom 10  
    Nikt nie jest mi w stanie pomóc? :cry:
  • REKLAMA
  • Pomocny post
    #3 8104818
    wicy
    Poziom 22  
    tasiaop napisał:
    Prosiłabym o wyrozumiałość i pomoc w nakierowaniu mnie na rozwiązanie problemu.

    Spróbuję nakierować :)
    Jeśli zapis ID do eeprom ma być jednorazowy, w kodzie programu deklarujesz (wcześniej innym programikiem i LCD odczytane) ID
    
    $eeprom
    Termometr2:                                                 'nr seryjny termometru 1
    Data 40 , 25 , 0 , 133 , 2 , 0 , 0 , 196
    Termometr1:                                                 'nr seryjny termometru 2
    Data 40 , 93 , 233 , 132 , 2 , 0 , 0 , 203

    Odczyt
    
       If Termometr = 1 Then                                    'termometr wewnętrzny
          1wreset
          1wwrite &H55
          1wwrite Dsid1(1) , 8
          1wwrite &HBE                                          'SKIP ROM + dokonaj konwersji
          Odczyt(1) = 1wread(2)                                 'odczytaj dwa pierwsze bajty
    

    i konwersja
    
          Minus = 0
          If Odczyt(2) >= 248 Then                              'wartość ujemna
                Odczyt(1) = 255 - Odczyt(1)
                Odczyt(2) = 255 - Odczyt(2)
                Minus = 1
          End If
          T1_j = Makeint(odczyt(1) , Odczyt(2))
          T1 = T1_j * 10
          T1 = T1 / 16
          T1_j = T1
          T1_d = T1_j Mod 10
          T1_j = T1_j / 10
          If Minus = 1 Then T1_j = -t1_j
          S1 = Str(t1_j)
          S2 = Str(t1_d)
          S1 = S1 + "," + S2
    

    zmienne
    
    Dim Dsid1(8) As Byte                    'ID termometru 1
    Dim Dsid2(8) As Byte
    Dim Odczyt(2) As Byte
    Dim T1_j As Integer                                         'czujnik 1 - całości temperatury
    Dim T1_d As Integer                                         'czujnik 1 - ułamek temperatury
    Dim S1 As String * 8
    Dim S2 As String * 8
    

    Odczytu termometru 1 lub 2 dokonujesz wstawiając stosowny warunek zamiast linii
    
    1wwrite Dsid1(1) , 8
    

    np
    
    if ktory_termometr=1 then
    1wwrite Dsid1(1) , 8
    else
    1wwrite Dsid2(1) , 8
    end if
    

    Jeśli zapis ID do eeprom ma być dokonywany przez program, trzeba dopisać procedury jednorazowego odczytu ID na starcie programu, ale o tym to już w Bascomowym helpie o 1wsearchfirst, 1wsearchnext.
  • REKLAMA
  • #4 8105339
    tasiaop
    Poziom 10  
    Dziękuje za pomoc, jednak nadal nie umiem tego złożyć w jedną całość. Mógłbyś udostępnić cały kod na forum, lub podesłać na meila. Proszę... i zarazem dziękuję.
  • Pomocny post
    #5 8106143
    wicy
    Poziom 22  
    Całego kodu nie mogę podrzucić, bo:
    - nie mam odczytu z eepromu,
    - nie wiem, czy zapis do eeprom ma być jednorazowy w momencie programowania procesora, czy ma być jednorazowy po pierwszym uruchomieniu programu, czy ma być wielokrotny w dowolnym momencie np. po zmianie termometru i wciśnięciu - dajmy na to - dowolnego guzika,
    - nie mam zrealizowanego szukania termometrów a tylko dane ich mam wpisane na sztywno w pamięci programu.
    - nie specjalnie wiem jak używać 1wsearchfirst, ale daję Ci pkt zaczepienia. Na podstawie Helpu i forum łatwo dojść o co w tym biega.

    Całe moje procedury odczytu masz niżej. Zmienne już podałem. Problem jest tylko taki, że przed napisaniem programu musisz znać ID termometrów.

    
    Config 1wire = Portb.3                                      'linia dwóch termometrów
    
    Gosub Inicjalizacja_ds
    Do
        'tu jakis warunek w którym następuje odczyt temperatur
        'plus obsługa wyświetlania stringów na LCD
    Loop
    End
    
    Inicjalizacja_ds:
       Restore Termometr1                                       'wczytuje ID rermometru 1 do zmiennej DSID1
       For I = 1 To 8
          Read Odczyt(2)
          Dsid1(i) = Odczyt(2)
       Next I
       Restore Termometr2                                       'wczytuje ID rermometru 2 do zmiennej DSID2
       For I = 1 To 8
          Read Odczyt(2)
          Dsid2(i) = Odczyt(2)
       Next I
    Return
    
    Pomiar_temperatury:
       'pobranie temperatur z termometrow
       'i przypisanie wyników stringom S1..S3
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
       'Waitms 750
    
       Toggle Termometr                                         'odczyt naprzemienny obu termometrów
       If Termometr = 1 Then                                    'termometr wewnętrzny
          1wreset
          1wwrite &H55
          1wwrite Dsid1(1) , 8
          1wwrite &HBE                                          'SKIP ROM + dokonaj konwersji
          Odczyt(1) = 1wread(2)                                 'odczytaj dwa pierwsze bajty
          Minus = 0
          If Odczyt(2) >= 248 Then                              'wartość ujemna
                Odczyt(1) = 255 - Odczyt(1)
                Odczyt(2) = 255 - Odczyt(2)
                Minus = 1
          End If
          T1_j = Makeint(odczyt(1) , Odczyt(2))
          T1 = T1_j * 10
          T1 = T1 / 16
          T1_j = T1
          T1_d = T1_j Mod 10
          T1_j = T1_j / 10
          If Minus = 1 Then T1_j = -t1_j
          S1 = Str(t1_j)
          S2 = Str(t1_d)
          S1 = S1 + "," + S2
          X = Len(s1)
          Select Case X
             Case 3 : S2 = "T)   " + S1
             Case 4 : S2 = "T)  " + S1
             Case 5 : S2 = "T) " + S1
             Case 6 : S2 = "T)" + S1
          End Select
       Else                                                     'termometr zewnętrzny
          1wreset
          1wwrite &H55
          1wwrite Dsid2(1) , 8
          1wwrite &HBE                                          'SKIP ROM + dokonaj konwersji
          Odczyt(1) = 1wread(2)                                 'odczytaj dwa pierwsze bajty
          Minus = 0
          If Odczyt(2) >= 248 Then                              'wartość ujemna
                Odczyt(1) = 255 - Odczyt(1)
                Odczyt(2) = 255 - Odczyt(2)
                Minus = 1
          End If
          T1_j = Makeint(odczyt(1) , Odczyt(2))
          T1 = T1_j * 10
          T1 = T1 / 16
          T1_j = T1
          T1_d = T1_j Mod 10
          T1_j = T1_j / 10
          If Minus = 1 Then T1_j = -t1_j
          S1 = Str(t1_j)
          S3 = Str(t1_d)
          S1 = S1 + "," + S3
          X = Len(s1)
          Select Case X
             Case 3 : S3 = "T(   " + S1
             Case 4 : S3 = "T(  " + S1
             Case 5 : S3 = "T( " + S1
             Case 6 : S3 = "T(" + S1
          End Select
       End If
       'linia 1
       S1 = "        "
    Return
    
    $eeprom
    Termometr2:                                                 'nr seryjny termometru 1
    Data 40 , 25 , 0 , 133 , 2 , 0 , 0 , 196
    Termometr1:                                                 'nr seryjny termometru 2
    Data 40 , 93 , 233 , 132 , 2 , 0 , 0 , 203
    
REKLAMA