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

[Atmega][Bascom] Zmiana rozdzielczości ds18b20 na 9bit

loodvis 03 Cze 2008 00:32 7190 16
REKLAMA
  • #1 5208211
    loodvis
    Poziom 14  
    Z noty katalogowej widze że trzeba zmienić w rejestrze konfiguracyjnym (czyli 4ty bajt scratchpada) bit 6 i 5 na 0.

    sam odczyt temperatury robię tak:
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       I = 1wread(2)
       S = I / 16
       T = Fusing(s , "##.#")


    chodzi mi o to żeby zmniejszyć waitms do 95
    jak trzeba by to zrobić?
    proszę o pomoc jak to powinno wyglądać:
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE 'read scratchpad
       jakaś_zmienna = 1wread(5)
    
    'coś trzeba zrobić z jakaś_zmienna
    
       1wreset 
       1wwrite &HCC
       1wwrite &H4E 'write scratchpad
       1wwrite jakaś_zmienna
  • REKLAMA
  • Pomocny post
    #2 5211920
    cyberdar
    Poziom 31  
    Witam

    W tym rejestrze tylko dwa bity dadzą się zmienić i przy okazji odpowiadają one za rozdzielczość więc wpisanie do rejestru wartości 63 dzisiętnie lub 3F hexadecymalnie załatwia sprawę.

    --
    pozdrawiam
  • Pomocny post
    #3 5211981
    zumek
    Poziom 39  
    Po przeczytaniu tego tematu , powinieneś już sobie poradzić :D

    Piotrek
  • #4 5226526
    loodvis
    Poziom 14  
    cyberdar napisał:
    Witam

    W tym rejestrze tylko dwa bity dadzą się zmienić i przy okazji odpowiadają one za rozdzielczość więc wpisanie do rejestru wartości 63 dzisiętnie lub 3F hexadecymalnie załatwia sprawę.

    --
    pozdrawiam



    wszystko działa tylko że dla 9bitowego to będzie 31, 63 to dla 10 bit
    (jakby ktoś kiedyś szukał) :)
  • REKLAMA
  • #5 5228355
    cyberdar
    Poziom 31  
    Witam

    Sorki, rzeczywiście 31 a nie 63.

    --
    pozdrawiam
  • #6 5408397
    marciu11
    Poziom 15  
    Pozwolę sobie podpiąć się pod temat.

    Zleży mi na zwiększeniu czybkości odczytu z Dallasa więc zmieniłem warość konfiguracyja w DS18B20 na odczyt 9bitowy.
    Po odczycie wartość scratchpad wynosi 31, czyli jest ustawione dobrze (9bitów).
    Teraz nie wiem jak to poprawnie odczytać?

    Napsiałem 2 procedurki odczytujące i wyświetlające wynik na wyśletlaczu.
    Pierwsza procedura oblicza wartość dla 12bitów i wyświetla wynik na górze wyświetlacza. Procedura standard:
          
          1wreset
          1wwrite &HCC
          1wwrite &H44
          Waitms 750
          1wreset
          1wwrite &HCC
          1wwrite &HBE
          Dallas(1) = 1wread(2)
          X = 1wread(5)
          1wreset
          Temp = Makeint(dallas(1) , Dallas(2))
          Temperatura = Temp * 10
          Temperatura = Temperatura / 16
          Temperatura = Temperatura / 10
    

    I tu mimo konfiguracji 9bit odczyt dalej jest z dokładnościa do ~.06 po przecinku

    Druga procedurka napsisana, oblicza dane według tego co znalazłem o DS1820, czyli i wyświetla na dole wynik:

    
          1wreset
          1wwrite &HCC
          1wwrite &H44
          Waitms 100
          1wreset
          1wwrite &HCC
          1wwrite &HBE
          Dallas(1) = 1wread(2)
          X = 1wread(5)
          1wreset
          Temperatura = Dallas(1) / 2
    

    ...i ta wyświetla temperatury w stylu 100.88, 98,78 itd...

    Czyli jest coś nie tak.

    Konfigurację Dallasa zmieniłem w sposób tu na forum opisany:

       
    1wreset
    1wwrite &HCC
    1wwrite &H4E
    1wwrite 31
    1wreset
    1wwrite &HCC
    1wwrite &H48
    Waitms 15
    1wreset
    


    Niestety nic więcej nie potrafię z maulala do Dallasa wycisnąć Ogranicza mnie znajomość języka angielskiego :(

    Proszę o pomoc i naprowadzenie na prawidłowy algorytm konfiguracji i odczytu 9bitowego.

    MarCiu


    ----
    Własnie dostałem opierdzel za literówki. Sory pisze jedną reką i do tego lewą. W prawej łapie własni leci mi krolówka i z tond ten brak reki.
    Ale jak to jest najważniejsza sprawą, to kogoś baardzo przepraszam...

    Przestrzeganie pisowni jest obowiązkiem i nie da się wytłumaczyć niesprawnością prawej ręki błędu , który zaznaczyłem na czerwono.Jeśli treść postu nie zostanie poprawiona , to zostanie przeniesiony do kosza.
    [zumek]
  • REKLAMA
  • #8 5958202
    snow
    Poziom 31  
    Bity R0 i R1 mają mieć wartość 0 - szczegóły w PDF'ie
  • #9 5958471
    loodvis
    Poziom 14  
    Ja mam napisane dokładnie tak:

    
     'zmiana na 9bit'
    
       1wreset
       1wwrite &HCC
       1wwrite &H4E
       1wwrite 1
       1wwrite 1
       1wwrite 31


    Działa jak trzeba.
  • #10 7752543
    redes
    Poziom 13  
    Wiem że temat już ma już trochę czasu ale podepnę się widząc że pare osób go śledzi. Czy w tym ostatnim kodzie nie powinno być jeszcze 1wwrite &H48?
    bo kolejno mamy reset, skip rom, zapis do scratchpadu, bajt th, bajt tl, bajt ustawień, i brakuje funkcji kopiującej ze scratchpadu do pamięci nieulotnej EEPROM, chyba że się tutaj coś mylę.
  • #11 7901260
    jousto
    Poziom 17  
    Nie mylisz się
    a dokładnie powinno tak to przebiegać

    1wreset
      1wwrite &HCC                                              'reset magistrali
      1wwrite &H4E                                              'zapis do scratchpad
      
                                               'zapisuje trzy bajty do scratchpad zawsze obowiązkowo i nie można zapisu przerwać resetem
       1wwrite &H00                                             '1bajt
       1wwrite &H00                                             '2bajt
       1wwrite &H7F                                             '3 bajt 
       
    
       Wait 1
       1wreset                                                  ' reset
       1wwrite &HCC                                          'skip ROM
       1wwrite &H48                                          ' zapis do EEPROM
    
  • #12 8219622
    pief
    Poziom 17  
    Witam

    Mam problem ze zmianą rozdzielczości ds18b20 na 9bit

    
    
    Sub Odczyt_temp
    
    1wreset                                                     'początek 1 sesji łączności
       1wwrite &H55                                             'rozkaz match rom - adresowanie indywidualne
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE                                             'rozkaz odczytania z kostki danych
       T1 = 1wread(2)
    '---------------------------------
       1wreset                                                  'początek 2 sesji łączności
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       T2 = 1wread(2)
    '---------------------------------
       1wreset                                                  'początek 3 sesji łączności
       1wwrite &H55
       1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
       1wwrite &HBE
       T3 = 1wread(2)
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44                                             'rozkaz pomiaru temperatury
    Waitms 750                                                  'czekaj ,bo konwersja trwa
    
     '*******************************************************************************
       T1 = T1 * 10                                             'obliczanie temp 1 czujnika
       T1 = T1 / 16
       T1 = T1 / 10
    
    '*******************************************************************************
       T2 = T2 * 10                                             'obliczanie temp 2 czujnika
       T2 = T2 / 16
       T2 = T2 / 10
    
    '*******************************************************************************
       T3 = T3 * 10                                             'obliczanie temp 3 czujnika
       T3 = T3 / 16
       T3 = T3 / 10
     End Sub
    

    Męczę się z tym gdzie wstawić te nieszczęsne bity konfiguracyjne w tym kodzie by
    zmienić na 9 bit , mimo że przeczytałem ten i inne posty.
    Z góry dziękuje i pozdrawiam .
  • REKLAMA
  • #13 8221172
    jousto
    Poziom 17  
    Rozdzielczość konwersji temperatury zmienia się tylko raz, po zapisaniu do EEPROMU czujnik pamięta rozdzielczosć nawet po odłączeniu od zasilania. Zmiana rozdzielczosći przy każdym odpytywaniu czujnik ajest bezsensowna i zabiera tylko czas.
    Po pierwsze w Twoim programie na początku zaraz po uruchomieniu powinna znaleźć się procedura odpytująca każdy czujnik o zaprogramowaną rozdzielczość a następnie zmieniająca ją w razie potrzeby, i to właśnie tam powinienieś wstawić zestaw komend o których pisałem wcześniej
  • #14 8222187
    pief
    Poziom 17  
    Dzięki za odpowiedź .

    Po deklaracjach zmiennych przed wejściem do pętli głównej programu mam
    ilość znalezionych czujników i sprawdzanie id czujnika

    
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
    Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
    '*******************************************************************************
    '*******************Odczyt numerów ID czujników temperatury*********************
    '*******************************************************************************
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
     Locate 1 , 1
     Lcd "Czujnik 1 ID OK"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    Wait 1
    
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "Czujnik 2 ID OK"
     Wait 1
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
    End If
    Wait 1
    
    If Dsid3(8) = Crc8(dsid3(1) , 7) Then
     Locate 3 , 1
     Lcd "Czujnik 3 ID OK"
     Wait 1
     Locate 3 , 1
     For B = 1 To 8
     Lcd Hex(dsid3(b))
     Next
    End If
    Wait 1
    


    I w którym miejscu przeprowadzić zmianę rozdzielczości DSa.
    Słąbo to rozumiem i prosiłbym o pomoc.
    Dziękuje
  • #15 8225604
    jousto
    Poziom 17  
    To mogłoby wyglądać następująco (dla pierwszego czujnika)
    Nie uruchamiałem tego, piszę z pamieci i nie daję głowy że to zadziała od pierwszego kopa. Proponuję wyremować na czas testowania obsługę pozostalych czujników i uruchomic to dla pierwszego a następnie dodawać kolejne czujniki. Można jeszcze dodać aby najpierw odczytywał zawartość rejestu i sprawdzał czy zapisana zawartość rejestru odpowieda wymaganej rozdzielczości jeśli nie to wtedy dopiero uruchamiałby się procedura zapisu właściwej zawartości rejestru.

    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu 
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu 
    Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu 
    '******************************************************************************* 
    '*******************Odczyt numerów ID czujników temperatury********************* 
    '******************************************************************************* 
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia 
     Locate 1 , 1 
     Lcd "Czujnik 1 ID OK" 
     Wait 1 
     Locate 1 , 1 
     For B = 1 To 8 
     Lcd Hex(dsid1(b)) 
     Next 
    End If
       1wreset                                                      
       1wwrite &H55                                              
       1wverify Dsid1(1)
       1wwrite &H4E
       1wwrite &H00                                             '1bajt 
       1wwrite &H00                                             '2bajt 
       1wwrite &H1F                                             '3 bajt 
        
       Waitms 500 
       1wreset                                                  
       1wwrite &H55
       1wverify Dsid1(1)                                           
       1wwrite &H48                                          
       Waitms 500 
    
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then 
     Locate 2 , 1 
     Lcd "Czujnik 2 ID OK" 
     Wait 1 
     Locate 2 , 1 
     For B = 1 To 8 
     Lcd Hex(dsid2(b)) 
     Next 
    End If 
    Wait 1 
    
    If Dsid3(8) = Crc8(dsid3(1) , 7) Then 
     Locate 3 , 1 
     Lcd "Czujnik 3 ID OK" 
     Wait 1 
     Locate 3 , 1 
     For B = 1 To 8 
     Lcd Hex(dsid3(b)) 
     Next 
    End If 
    Wait 1 
    
  • #16 8226106
    pief
    Poziom 17  
    Dziękuje.
    Zaczynam testować.Dam znać co i jak.
    Pozdrawiam.
  • #17 8227036
    flapo213
    Poziom 21  
    Witam,

    Mała sugestia po co przeszukujesz magistralę w poszukiwaniu czujników. Przeszukiwanie magistrali ma sens jedynie wtedy gdy chesz stwierdzić jakie urządzenia i ile masz podpiętych na magistrali. W profesjonalnych sterownikach przeszukiwanie magistrali zawierającej jedynie czujniki DS18B20 mija się z celem, a wyjaśnienie jest bardzo proste proste skąd będziesz wiedział który czujnik jest który ? Czyli jeśli masz 3 czujniki i jeden przewód to jeśli podłączysz w to samo miejsce kolejne 3 sztuki to mogą one zostać innaczej zinterpretowane. Ale to taka mała moja sugestia odnośnie samego projektowania takich systemów.

    Pozdrawiam
REKLAMA