Elektroda.pl
Elektroda.pl
X

Search our partners

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

o DS18s20 będzie mowa [BASCOM]

rysiek182 29 Dec 2007 13:51 4518 14
  • #1
    rysiek182
    Level 11  
    Witam,

    Ponawiam, swoje pytanie odno¶nie programu do komunikacji 89s52 a ds18s20 w Bascom.


    Otóż cały czas wy¶wietla mi się 85 stopni Celsjusza i doczytałem, że to kwestia złego dobrania czasu między poszczególnymi komendami, i czujnik nie jest w stanie się zresetować.
    Próbowałem już kilku kombinacji, ale i tak lipa, a najciekawsze, że ds1820 na tym samym programie, ¶migał aż huczało, a ds18s20 już nie,

    Jeżeli kto¶ z Was drodzy forumowicze poradził sobie z tym problemem, to poproszę o kilka linijek kodu, bo już sam nie wiem co robię Ľle.

    Pozdrawiam i życzę wystrzałowego sylwestra
  • #2
    thorin00
    Level 14  
    ds18s20 to nie to samo co ds1820 z tego co pamietam odczyt temperatury z ds1820 jest na 8 bitach natomiast ds18s20 na 16bitach. sciagnij sobie note katalogowa ds18s20.
  • #3
    rysiek182
    Level 11  
    Witam ponownie,

    Poniżej zamieszczam kod, który wpalony jest w AT89s52 z przy 12MHz

    Code:
    Do
    

    Disable Timer2

    Went = Not Went
      1wreset                                                   
      1wwrite &HCC                                             
      1wwrite &H44                                             
      Waitms 250
      Waitms 250
      Waitms 250
      1wreset                                                 
      1wwrite &HCC

      1wwrite &HBE                                               

      T(1) = 1wread()                                           

      T(2) = 1wread()       
                                         
      1wreset

    Cls
    Lcd T(1)
    Lowerline
    Lcd T(2)
    Wait 2
    Loop


    efektem jest pojawienie się na wy¶wietlaczu liczby 170 i poniżej 0, czyli te 85 stopni Celsjusza.

    Moim zdaniem, skoro uP odczytuje tę warto¶ć, to komunikacja jest zrobiona dobrze i jednak gdzie¶ jest bł±d w programie.

    Acha, wszystkie przerwania s± wył±czone i działa tylko ta pętelka, nic więcej.

    Mam jeszcze jedno pytanie, czy rezystor 4,7 k który wpina się między sygnałem 1wire a zasilaniem, może być umieszczony tuż przy czujniku, czy lepiej przy mikroprocesorze. Dodam, że przewód ł±cz±cy to zwykła tasiemka o długo¶ci około 20 cm.

    Pozdrawiam

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #4
    Spięcie
    Level 12  
    może sie przyda - program wła¶nie na czujnik 18s20



    Code:
       ' BASCOM College
    
    ' (EdW 2001.01 str. 20)

    ' Temat      : "Termometr z Dallas DS1820"
    '              wersja 1.1 (20.03.2001)
    ' Compiler   : BASCOM 8051 LIBRARY V 2.06
    ' Used ROM   : &H7A3     1955 (dec)  > Ok

    ' Poprawki do ver. 1.0:
    '        - poprawiony błąd odczytu temp > 41,5 st.C (bo Waitms działa tylko dla warto?ci 1-255)
    '        - optymalizacja kodu (skrócenie):
    '          - przerzucenie polecenia 1Wreset do podprocedury skróciło program o 15 bajtów
    '          - drobna poprawka procedury wy?wietlania temperatury (Wysw_temp)

    'Czę?ci składowe:
    '        TEST BOARD AVT-2500 z AT89C2051 i LCD,
    '        DS1820 na magistrali 1WIRE

    'Autor :
    '        Artur Schwartz
    '        artursch(malpa)rumia.edu.pl
    '        (058) 671-52-30


    ' Konfiguracja sprzętowa : 1WIRE, LCD

    ' 1 Wire:
    '  P 1.0

    ' LCD:
    '  RS  - P1.2
    '  EN  - P1.3
    '  DB4 - P1.4
    '  DB5 - P1.5
    '  DB6 - P1.6
    '  DB7 - P1.7

    ' 1 Wire commands:
    '  1. Read     ROM - 33h
    '  2. Match    ROM - 55h
    '  3. Search   ROM - F0h
    '  4. Skip     ROM - CCh
    '  5. Alarm Search - ECh
    '  Convert T       - 44h
    '  Read Scratchpad - BEh
    '  WriteScratchpad - 4Eh
    '  Copy Scratchpad - 48h
    '  Recall E2       - B8h
    '  Read Power Supl - B4h

    ' Konfiguracja programowa :
    Config 1wire = P3.7                                           ' wskazanie kompilatorowi do którego pinu podłączamy magistralę
    Config Lcd = 20 * 2                                           'wy?wietlacz LCD
    Deflcdchar 0 , 238 , 234 , 238 , 224 , 224 , 224 , 224 , 224       'definicja symbolu "stopień"

    ' Zmienne
    Dim Is_device As Bit                                          'zmienna wskazująca czy na magistrali jest urządzenie
    Dim Number(8) As Byte                                         'tu przechowamy serial number urządzenia

    Dim T(2) As Byte                                              'tu przechowamy odczytaną warto?ć z DS1820
    Dim X As Byte
    Dim R As Byte
    Dim Temp As Single                                            'warto?ć temperatury po przekształceniach
    Dim Str_temp As String * 5                                    'string do wy?wietlenia temperatury

    ' Stałe
    Const R_rom = &H33                                            '1. Read     ROM - 33h
    Const Con_t = &H44                                            'Convert T       - 44h
    Const M_rom = &H55                                            '2. Match    ROM - 55h
    Const R_src = &HBE                                            'Read Scratchpad - BEh

    ' Komunikaty
    Const Kom_1 = "Termometr 1.1"                                 'Komunikat powitalny
    Const Kom_2 = "Temp. :"
    Const Minus = "-"
    Const Celcj = "C"                                             'symbol stopni CELCJUSZA
    Const Err_1 = "Error: "                                       'komunikat błędu - np. przerwa na 1WIRE
    Const Err_2 = "No Device !"                                   'komunikat błędu - brak urządzenia

    'Deklaracje procedur
    Declare Sub Read_numbers                                      'Odczytaj SerialNumber urządzenia
    Declare Sub Pomiar_temp                                       'Dokonaj pomiaru temperatury
    Declare Sub Match_rom                                         'Wywołaj urządzenie na magistrali
    Declare Sub Wysw_temp                                         'Konwertuj/wy?wietl odczytaną warto?ć
    Declare Sub 1w_reset




    ' Początek programu
    Cls
    Is_device = 1                                                 'Na początek zakładamy, że urządzenie jest na magistrali
    Cursor Off
    Lcd Kom_1                                                     'Powitanie
    Wait 1
    Cls
    Cursor Off

    Lcd Kom_2

    Do                                                            'początek pętli programowej
      1w_reset                                                    'inicjacja magistrali 1WIRE
      If Err = 1 Then                                             'jeżeli żaden układ nie odpowiedział
                                                                  'na wezwanie to:
        Is_device = 0                                             ' brak urządzenia
        Cls                                                       ' wyczy?ć wy?wietlacz
        Lcd Err_1 ; Err_2                                         ' wy?wietl komunkikat
        Waitms 250
                                                      ' zaczekaj 250 ms
      Else
        Call Read_numbers                                         'przeczytaj serial układu 1WIRE
        Call Pomiar_temp                                          'Odczytaj temperaturę
        Call Wysw_temp                                            'Wy?wietl odczytaną warto?ć na LCD
      End If
    Loop
    ' Koniec programu


    'Procedury


    Sub Read_numbers                                              'Odczytaj/zapamiętaj SerialNumber urządzenia

      If Is_device = 0 Then                                       'je?li był poprzednio wy?wietlony błąd
        Cls
        Lcd Kom_2                                                 ' wyczy?ć teksty i już nie rób "czyszczenia"
        Is_device = 1                                             ' wy?wietlacza następnym razem
      End If
      1wwrite R_rom                                               'żądanie podania przez odnaleziony
                                                                  'układ jego numeru seryjnego
      For R = 1 To 11
        Number(r) = 1wread()                                      'odczytaj z magistrali 1WIRE kolejne
                                                                  'bajty numeru układu i zapamiętaj
      Next R
    End Sub


    Sub Pomiar_temp                                               'Dokonaj pomiaru temperatury

      1w_reset                                                    'inicjacja magistrali 1WIRE
      Call Match_rom                                              'Wybierz konkretne urządzenie
      1wwrite Con_t                                               'Convert T
      Wait 1                                                      'Idle DS1820 (w sumie 500 ms)
      1w_reset                                                    'inicjacja magistrali 1WIRE
      Call Match_rom                                              'Wybierz konkretne urządzenie
      1wwrite R_src                                               'żądanie odczytania temperatury
      T(1) = 1wread()                                             'odczytaj z magistrali 1WIRE 1 bajt
      T(2) = 1wread()                                             'odczytaj z magistrali 1WIRE 2 bajt
      1w_reset                                                    'inicjacja magistrali 1WIRE
    End Sub


    Sub Match_rom                                                 'Wywołaj urządzenie na magistrali

      1wwrite M_rom                                               'Żądanie "Match ROM"
      For R = 1 To 11

        1wwrite Number(r)                                         ' dla urządzenia o SerialNum.
        If Err = 1 Then                                           'jeżeli Błąd
          Is_device = 0                                           ' ustaw Brak_Urządzenia
          Cls                                                     ' wyczy?ć wy?wietlacz
          Lcd Err_1 ; R                                           ' wy?wietl komunkikat
          Wait 1                                                  ' chwilkę zaczekaj/wy?wietlaj
        End If
      Next R
    End Sub


    Sub Wysw_temp                                                 'Konwertuj/wy?wietl odczytaną warto?ć

      Locate 2 , 2
      If T(2) = 0 Then                                            'Temperatury dodatnie
        Temp = T(1) / 2                                           ' oblicz temperaturę
      Else                                                        'Temperatury ujemne
        X = 256 - T(1)                                            ' oblicz temperaturę
        Temp = X / 2                                              ' oblicz temperaturę
        Lcd Minus                                                 ' znak "minus" dla ujemnych
      End If
      Str_temp = Fusing(temp , ###.&)                             ' przekształć do string
      Lcd Str_temp ; Chr(0) ; Celcj ; " "                         'Wy?wietl temperaturę
    End Sub

    Sub 1w_reset                                                  ' dla skrócenia kodu
      1wreset
    End Sub


    Dodano po 18 [minuty]:

    Najlepiej będzie jak zerkniesz sobie na t± stronkę - znajdziesz tu to co Cię interesuje http://mirley.firlej.org/termometr_domowy

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #5
    rysiek182
    Level 11  
    hmm,

    po sprawdzeniu kodu sugerowanego przez Spięcie, wła¶ciwie ie dopatrzyłem się różnicy pomiędzy moim kodem a tym sugerowanym, zreszt± oboje korzystali¶my z tego samego Ľródła bo nawet oznaczenia zmiennych s± takie same. Jedyna różnica to instrukcja wait 1 która u mnie to waitms 250 x2, ale zmiana na 1 sekundę i nawet na więcej nic nie pomaga.

    mam pytanie jeszcze, czy jeżeli ds18s20 jest uszkodzony i nie działa prawidłowo, to czy można odczytać z niego wła¶nie te 85 stopni?
    Bo dochodzę do wniosku, że to wina wadliwej sztuki DS.

    no i jeszcze ponawiam moje pytanie odno¶nie umiejscowienia rezystora?
    Czy lepiej dać go blisko DSa, czy może blisko uP

    Pozdrawiam
  • #6
    Spięcie
    Level 12  
    Przypomniałem sobie tak± sytuację że przez jaki¶ czas też na LCD wy¶wietlała mi się temperatura 85*C , pamiętam że wtedy zmieniłem po prostu pin do którego podpięty ma być czujnik
    Code:
    1 Wire:       '  P 1.0


    spróbuj zmienić na jaki¶ inny np. P1.7 lub w ogóle inny port
    napisz czy pomogło
    pozdrawiam
  • #7
    sakohq
    Level 2  
    rysiek182 wrote:
    mam pytanie jeszcze, czy jeżeli ds18s20 jest uszkodzony i nie działa prawidłowo, to czy można odczytać z niego wła¶nie te 85 stopni?
    Bo dochodzę do wniosku, że to wina wadliwej sztuki DS.


    85 stopni to wartosc domyslna, odczytywana z czujnika po wlaczeniu zasilania bez prawidlowego pomiaru (jeszcze). Wyglada na to, ze komunikacja z DS dziala, wiec byc moze jest problem z niewystarczajacym opoznieniem przy odczycie danych z DS po konwersji, np. przez zbyt male opoznienia (DS dostaje kolejne polecenie rozpoczecia konwersji zanim skonczy poprzednia).
  • #8
    romsik
    Level 14  
    witam
    Twój problem polega najprawdopodobniej na tym, że ds 18s20 potrzebuje o połowę czasu wiecej na przetworzenie temp niz ds 1820. nie znam bascoma ale w c miałem troche podobny problem. Ty każesz mu zmierzyc temp, a on jeszcze tego niei zd±żył zrobić i juz go czytasz to zwraca waro¶ć domy¶ln±. Tak jest oczywi¶cie przy zasilaniu z lini danych. Je¶li zasilasz z osobnego wej¶cia to musisz sprawdzać czy skończył juz pomiar. Patrz nota katalogowa- algorytm na 2 strony ale jasny :). co do rezystora to u mnie działa zarówno z rezystorem jak i bez niego na porcie p1.0 - klcocek atmela ale troche inny
    ostatecznie moje rady s± takie:
    1. sprawdz czy zasilasz z linii danych
    2. upewnij sie ze procedura waitms na pewno czeka 250 ms bo z opisu dzilania programu wynika ,ze chyba jednak krócej
  • #9
    Charly
    Level 18  
    A co to jest u Ciebie w kodzie to "Went" ?
  • #10
    rysiek182
    Level 11  
    Witam ponownie, dziękuj± za zainteresowanie moim tematem.

    Zmienna went odnosi się do linii portu, do której podł±czona jest tylko katoda diody led, która obrazuje mi jedynie, czy program działa, przy zmianie z zapalonej na zgaszona i odwrotnie, wiem, że jest to moment, w którym program zaczyna inicjalizację szyny 1WIRE.

    Jeżeli chodzi o czasy, to próbowałem już różna od waitms 250 poprzez dwukrotne 2x waitms 250, oraz 3x waitms 250, no i wait 1, i wait 2 bez poż±danego efektu.

    Nie wiem, co robić, dalej.
  • #11
    Charly
    Level 18  
    No to nic tylko DS nawalił.
    Wsadziłem to u mnie tak i czyta (bajty się zmieniaj± w czasie ogrzewania i chłodzenia czujnika). Ten ostatni 1wreset jest niepotrzebny.
    Code:
    Do
    

    Disable Timer2


      1wreset
      1wwrite &HCC
      1wwrite &H44
      Waitms 250
      Waitms 250
      Waitms 250
      1wreset
      1wwrite &HCC

      1wwrite &HBE

      T1 = 1wread()

      T2 = 1wread()

      1wreset

    Cls
    Lcd T1
    Lowerline
    Lcd T2
    Wait 2
    Loop
  • #12
    rysiek182
    Level 11  
    Witam po raz kolejny.

    No i zmieniłem DSa na innego a póĽniej na jeszcze innego i ci±gle jest ten sam problem, mało tego ten ostatni pokazuje mi teraz 127,5 stopnia. Najdziwniejsze z tego wszystkiego to to, że DS1820 w tym okładzie, na tym samym programie ¶migał aż miło, po prostu go wlutowałem i od razu zacz±ł działać, a ten DS18S20 nie chce. Podejrzewam, że to wina błędnych sztuk, bo kupiłem 4 od jednego sprzedawcy i został mi tylko jeszcze jeden więc jak ten nie da rady, to zostaje mi się tylko poci±ć. :)

    Podejrzewam, że Wam też już ręce opadaj± ale jakby nasunęły się Wam jeszcze jakie¶ inne propozycje, to piszcie.

    Odno¶nie podł±czenia to nie jest on podł±czony w trybie pasożytniczym, a zasilanie ma to samo co zasilanie mikroprocesora, a rezystor jest tuż przy mikroprocesorze, ale jak był tuz przy czujniku, to działo się to samo.

    Pozdrawiam,
  • #13
    romsik
    Level 14  
    ja bym raczej tak szybko nie przekre¶lał tych ds-ów i sprzedawcy :)
    je¶li co¶ do Ciebie gadaj± to znaczy ,że chyba jednak żyj±. :)
    Rozumiem, że wait 1 czeka 1 sekundę , je¶li tak to niedobrze, ale czy na pewno dla zegara 12MHz? (może dla 4).
    Ja spróbowałbym jeszcze zrobić tak jak mówi dokumentacja, czyli po rozkazie pomiaru temp odczytujesz z ds 1 bit. jesli jest 0 tzn ,że przetwarza i dalej trzeba odczyttywać bit tak aż będzie li 1 to już skończył i można go odczytać
    pzdr rs
  • #14
    rysiek182
    Level 11  
    Panowie, już teraz nie wiem kogo mam słuchać,

    Muszę się przyznać, że do taj pory nie miałem do czynienia z układami 1wire, ale jako¶ z DS1820 sobie poradziłem, i skoro DS18S20 to podobno zamiennik, no to s±dziłem, że nie będzie problemu, a tu proszę.

    Nie wiem dokładnie co oznacza zapis w pdfie na stronie 3 "..will respond by transmitting 0 while the temperature is in progres, and 1 when the conversion is done. ..." Ok, rozumiem, że DS18S20 transmituje 0 w czasie konwersji, i zmienia 0 na 1 jak skończy sie proces konwersji, ale co to oznacza, mam sprawdzać stan linii 1wire, bo już sam nie wiem.

    No ale pomimo tego, jak zmieniłem warto¶ć wait do 5 (no to s±dzę, że juz powinien sobie poradzić z konwersja), to i tak odczytuje te 85 stopni.
  • #15
    rysiek182
    Level 11  
    Ok, już wszystko wiadomo. :P

    Problem tkwił w tym, że nie do końca dobrze odczytałem nazwę elementu, bo okazało się, że chciałem mierzyć temperaturę układem z zewnętrznym Ľródłem zasilania, a jako przetwornik używałem DS18S20p który do tej metody się nie nadaje.

    Po zakupie zwykłego DSa wszystko zaczęło na nowo ¶migać aż miło

    Ale niestety niewykorzystane leża te nieszczęsne DS18S20p i to zwracam się do Was drodzy forumowicze jaki typ tranzystora stosujecie przy podłaczeniu tych czujników w trybie pasożytniczym

    Temat uznaję za czę¶ciowo zamknięty :P

    Chciałem podziękować tym wszystkim którzy do tej pory próbowali mi pomóc, gdyż niepotrzebnie naraziłem ich na marnowanie jakże cennego czasu

    pozdrawiam Ry¶