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

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

loodvis 03 Cze 2008 00:32 6335 16
  • #1 03 Cze 2008 00:32
    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:

    Code:
       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ć:
    Code:

       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

    0 16
  • Pomocny post
    #2 04 Cze 2008 09:41
    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

    1
  • Pomocny post
    #3 04 Cze 2008 10:08
    zumek
    Poziom 39  

    Po przeczytaniu tego tematu , powinieneś już sobie poradzić :D

    Piotrek

    0
  • #4 08 Cze 2008 19:31
    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ł) :)

    0
  • #5 09 Cze 2008 13:18
    cyberdar
    Poziom 31  

    Witam

    Sorki, rzeczywiście 31 a nie 63.

    --
    pozdrawiam

    0
  • #6 04 Sie 2008 20:33
    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:

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

    Code:

          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:

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

    0
  • #8 06 Sty 2009 13:10
    snow
    Poziom 28  

    Bity R0 i R1 mają mieć wartość 0 - szczegóły w PDF'ie

    0
  • #9 06 Sty 2009 14:23
    loodvis
    Poziom 14  

    Ja mam napisane dokładnie tak:

    Code:

     'zmiana na 9bit'

       1wreset
       1wwrite &HCC
       1wwrite &H4E
       1wwrite 1
       1wwrite 1
       1wwrite 31


    Działa jak trzeba.

    0
  • #10 26 Lut 2010 10:56
    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ę.

    0
  • #11 30 Mar 2010 23:38
    jousto
    Poziom 16  

    Nie mylisz się
    a dokładnie powinno tak to przebiegać

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

    0
  • #12 22 Cze 2010 20:49
    pief
    Poziom 16  

    Witam

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

    Code:


    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 .

    0
  • #13 23 Cze 2010 09:19
    jousto
    Poziom 16  

    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

    0
  • #14 23 Cze 2010 14:05
    pief
    Poziom 16  

    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

    Code:

    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

    0
  • #15 24 Cze 2010 11:32
    jousto
    Poziom 16  

    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.

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

    0
  • #16 24 Cze 2010 13:42
    pief
    Poziom 16  

    Dziękuje.
    Zaczynam testować.Dam znać co i jak.
    Pozdrawiam.

    0
  • #17 24 Cze 2010 17:22
    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

    0