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

Atmega8 i 4xDS18B20: Weryfikacja kodu dla 1-Wire z zasilaniem pasożytniczym

T.J.Storm 22 Sty 2008 10:44 1752 8
REKLAMA
  • #1 4721399
    T.J.Storm
    Poziom 10  
    Posty: 30
    Ocena: 5
    Witam

    Proszę osoby które są dobrze obeznane w pisaniu softu o sprawdzenie poniższego:

    A i dodam że to jest soft na 1 wire 4 czujniki podpięte do 1 portu :D z zasilaniem pasożytniczym

    Z góry dzięki za sprawdzenie i ewentualne poprawki

    Pozdro T.J.Storm

    Oto kod:

    
    '******************************************************************************
    '*****************************Deklaracja Procesora*****************************
    '******************************************************************************
    
       $regfile = "m8def.DAT"
    
    '******************************************************************************
    '************************Deklaracja Częstotliwości Pracy***********************
    '***************Wewnętrzny Oscylator 1MHz W Zupełności Wystarcza***************
    '******************************************************************************
    
       $crystal = 1000000
    
    '******************************************************************************
    '**************************Konfiguracja Połączeń LCD***************************
    '******************************************************************************
    
       Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    '******************************************************************************
    '***************************Wybór Typu Wyświetlacza****************************
    '******************************************************************************
    
       Config Lcd = 16 * 4
    
    '*************************************WAŻNE************************************
    '************Konfiguracja portu Na Którym Będą Podpięte DS18B20****************
    '******************************************************************************
    
       Config 1wire = Portd.0
    
    '******************************************************************************
    '*********************Zmienne Dotyczące Pomiaru Temperatur*********************
    '******************************************************************************
    
       Dim B1 As Byte
       Dim B2 As Byte
       Dim R As Byte
       Dim W As Byte
       Dim B As Byte
       Dim Znak As String * 1
       Dim Tmp As String * 4
       R = 255
       Dim T1 As Single
       Dim T2 As Single
       Dim Dsid1(8) As Byte
       Dim Dsid2(8) As Byte
       Dim Dsid3(8) As Byte
       Dim Dsid4(8) As Byte
    
    '******************************************************************************
    '***************************Deklaracja Podprogramu*****************************
    '******************Przetwarzanie Temperatury Dla Czujników ********************
    '*************Oraz Wyświetlanie Temperatury Z Dokładnością 0.1 st C************
    '******************************************************************************
    
       Declare Sub Wysw_temp_ds
    
    
    '******************************************************************************
    '****************************Znak Stopnia Celcjusza****************************
    '******************************************************************************
    
       Deflcdchar 1 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    
    '******************************************************************************
    '*******************Znajdź 1,2,3,4 Czujnik Podpięty Do Portu*******************
    '******************************************************************************
    
       Dsid1(1) = 1wsearchfirst()
       Dsid2(1) = 1wsearchnext()
       Dsid3(1) = 1wsearchnext()
       Dsid4(1) = 1wsearchnext()
    
    '******************************************************************************
    '*************************Opis Poszczególnch Czujników*************************
    '******************************************************************************
    
    '******************************************************************************
    '********************************Czujnik 1 DS_1********************************
    '******************************************************************************
    
       Locate 1 , 1
       Lcd "1       :"
    
    '******************************************************************************
    '********************************Czujnik 2 DS_2********************************
    '******************************************************************************
    
       Locate 2 , 1
       Lcd "2       :"
    
    '******************************************************************************
    '********************************Czujnik 3 DS_3********************************
    '******************************************************************************
    
       Locate 3 , 1
       Lcd "3       :"
    
    '******************************************************************************
    '********************************Czujnik 4 DS_4********************************
    '******************************************************************************
    
       Locate 4 , 1
       Lcd "4       :"
    
    '******************************************************************************
    '*********************************Pętla Główna*********************************
    '******************************************************************************
    
    Do
    
    '******************************************************************************
    '************************Wysyłanie Polecenia"Match Rom"************************
    '************Oraz Żądanie Przetwarzania Temperatury Dla Czujnika DS1***********
    '*********************Odczyt Temperatury Dla Czujnika 1 DS1********************
    '******************Wyświetlanie Temperatury Dla Czujnika 1 DS1*****************
    '*****************Przetwarzanie Temperatury Dla Czujnika 1 DS1*****************
    '******************************************************************************
    
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
    
       B1 = 1wread(2)
       B2 = 1wread(2)
    
       Locate 1 , 10
       Wysw_temp_ds
    
    '******************************************************************************
    '************************Wysyłanie Polecenia"Match Rom"************************
    '************Oraz Żądanie Przetwarzania Temperatury Dla Czujnika DS2***********
    '*********************Odczyt Temperatury Dla Czujnika 2 DS2********************
    '******************Wyświetlanie Temperatury Dla Czujnika 2 DS2*****************
    '*****************Przetwarzanie Temperatury Dla Czujnika 2 DS2*****************
    '******************************************************************************
    
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
    
       B1 = 1wread(2)
       B2 = 1wread(2)
    
       Locate 2 , 10
       Wysw_temp_ds
    
    '******************************************************************************
    '************************Wysyłanie Polecenia"Match Rom"************************
    '************Oraz Żądanie Przetwarzania Temperatury Dla Czujnika DS3***********
    '*********************Odczyt Temperatury Dla Czujnika 3 DS3********************
    '******************Wyświetlanie Temperatury Dla Czujnika 3 DS3*****************
    '*****************Przetwarzanie Temperatury Dla Czujnika 3 DS3*****************
    '******************************************************************************
    
       1wreset
       1wwrite &H55
       1wverify Dsid3(1)
       1wwrite &HBE
    
       B1 = 1wread(2)
       B2 = 1wread(2)
    
       Locate 3 , 10
       Wysw_temp_ds
    
    '******************************************************************************
    '************************Wysyłanie Polecenia"Match Rom"************************
    '************Oraz Żądanie Przetwarzania Temperatury Dla Czujnika DS4***********
    '*********************Odczyt Temperatury Dla Czujnika 4 DS4********************
    '******************Wyświetlanie Temperatury Dla Czujnika 4 DS4*****************
    '*****************Przetwarzanie Temperatury Dla Czujnika 4 DS4*****************
    '******************************************************************************
    
       1wreset
       1wwrite &H55
       1wverify Dsid4(1)
       1wwrite &HBE
    
       B1 = 1wread(2)
       B2 = 1wread(2)
    
       Locate 4 , 10
       Wysw_temp_ds
    
    '******************************************************************************
    '*******************Konwersja Temperatur Dla Wszystkich Ds18B20****************
    '******************************************************************************
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
    '******************************************************************************
    '********************************Delay Czujników*******************************
    '******************************************************************************
    
       Waitms 800
    
    '******************************************************************************
    '*****************************Koniec Pętli Głównej*****************************
    '******************************************************************************
    
       Loop
    
    
    
    
    
    Sub Wysw_temp_ds
    
       If B2 >= 248 Then
       B1 = R - B1
       B2 = R - B2
       Znak = "-"
       Else
       Znak = " "
       End If
       T1 = B1 / 16
       T2 = B2 * 16
       T1 = T1 + T2
    
       T1 = T1 + 0.05
       Tmp = Fusing(t1 , "##.&")
    
       If T1 > 99.999 Then
       Lcd Tmp ; Chr(1)
       Else
    
       If T1 > 9.999 Then
       Lcd Znak ; Tmp ; Chr(1)
       Else
       Lcd Znak ; "" ; Tmp ; Chr(1)
    
     End If
    
     End If
    
     End Sub
    
  • REKLAMA
  • #2 4721428
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 4765142
    Konto nie istnieje
    Poziom 1  
  • #4 4766942
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    Witam.
    A może tak wykożystać jeszcze jeden port i z niego przez jakiegoś BAT46 (dioda) podawać na linię danych napięcie w odpowiednim momencie........np. podczas globalnego żądania o pomiar temperatury......
    pozdrawiam.

    Dodano po 9 [minuty]:

    Witam.
    A może tak wykożystać jeszcze jeden port i z niego przez jakiegoś BAT46 (dioda) podawać na linię danych napięcie w odpowiednim momencie........np. podczas globalnego żądania o pomiar temperatury......
    pozdrawiam.
  • #5 4767280
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    kijok napisał:
    Po co lutowac jeszcze jeden kobelek? ja bym uzyl DS1822 ma wieksza rozdzielczosc


    DS1822 ma taką samą rozdzielczość. Za to ma dużo mniejszą dokładność:)
    W mikrokontrolerach AVR wystarczy ustawić stan wysoki na linii danych na czas konwersji i czujniki śmigają aż miło w trybie parasite.
  • REKLAMA
  • #6 4769222
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Podziele się swoimi doświadczeniami na ten temat.
    Własnie podłączyłem 12 DS18b20 do atmegi8 poprzez kabel 2 -żyłowy 100m więcej nie miałem. Wszysko śmiga aż miło.
  • #7 4769284
    T.J.Storm
    Poziom 10  
    Posty: 30
    Ocena: 5
    Witam, aż miło jak wszyscy się dzielą swoimi doświadczeniami z ds'ami :D

    Ale przejdę do rzeczy czyli lepiej dać zasilanie z linii danych czyli parasite, czy lepiej dać zasilanie z osobnej linii??

    @ don diego

    Możesz wyjaśnić mi
    stan wysoki na linii danych na czas konwersji

    bo ja chyba stan niski jakoś ustawiłem podpinając pin 5 lub 6 do masy(dokładniej nie pamiętam)??

    @ asembler
    Podzielę się swoimi doświadczeniami na ten temat.
    Właśnie podłączyłem 12 DS18b20 do atmegi8 poprzez kabel 2 -żyłowy 100m więcej nie miałem. Wszystko śmiga aż miło.


    Domyślam się że zasilanie z linii danych ale lepiej zapytam??
    I jeszcze jedno jak rozwiązałeś przełączanie wyników na lcd??

    Mógłbyś podrzucić schemat według którego robiłeś i wzór softu?? Wyciągnę wnioski z twojego i napisze dla siebie:D chyba że nie masz napisanego w bascom

    Pozdrawiam T.J.Storm
  • #8 4769305
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Ja mam tylko dwa czujniki. Początkowo zasilałem z zewnętrznego źródła, ale chciałem mieć cieńszy kabelek do przeciśnięcia przez okno:). Zastosowałem czujniki DS18S20P, które działają tylko w trybie parasite. Odczyt jest z dokładnością do 1 stopnia więc wersja z S nadaje się idealnie i łatwiej się oblicza temperaturę.

    Na koniec podzielę się ciekawą obserwacją. Niechcący podłączyłem odwrotnie zasilanie do DS18S20 (wersja bez P) i czujnik padł. Ale okazało się, że w trybie parasite działa nadal:)

    Stan wysoki jest potrzebny na linii w czasie konwersji temperatury i kopiowania scratchpada do EEPROM. Wszystko jest w dokumentacji, tylko tam jest to rozwiązane przez strong pullup za pomocą MOSFETa sterowanego przez oddzielny pin.
  • REKLAMA
  • #9 4769314
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Oczywiświe ze zasilanie z linii danych z jednego portu, nawet nie podciągałem dodatkowym opornikiem. Wyswietlanie na LCD nie przełączam w ogóle bo wyświetlam wszystkie wyniki naraz.


    Zobacz sobie ten post: (chyba przedostatnie zdjęcie)
    https://www.elektroda.pl/rtvforum/topic932475.html

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy weryfikacji kodu do obsługi czterech czujników temperatury DS18B20 podłączonych do jednego portu mikrokontrolera Atmega8 z wykorzystaniem magistrali 1-Wire i zasilania pasożytniczego. Poruszono kwestie stabilności i efektywności zasilania pasożytniczego, zwłaszcza podczas konwersji analogowo-cyfrowej, która jest prądożerna. Zasugerowano rozważenie zasilania czujników z osobnej linii zasilającej lub zastosowanie dodatkowego przewodu do zasilania. Wskazano także możliwość wykorzystania dodatkowego portu mikrokontrolera i diody BAT46 do podawania napięcia na linię danych w odpowiednich momentach, np. podczas globalnego żądania pomiaru temperatury. Porównano modele DS18B20 i DS1822, podkreślając, że DS1822 ma podobną rozdzielczość, ale mniejszą dokładność. Wskazano, że w mikrokontrolerach AVR wystarczy utrzymywać stan wysoki na linii danych podczas konwersji, co umożliwia poprawną pracę czujników w trybie pasożytniczym. Jeden z uczestników podzielił się doświadczeniem stabilnej pracy 12 czujników DS18B20 na 100-metrowym kablu dwużyłowym z zasilaniem pasożytniczym. Omówiono również kwestie wyświetlania wyników na LCD, gdzie jeden z użytkowników wyświetla wszystkie wyniki jednocześnie bez przełączania. Podkreślono, że dokumentacja czujników opisuje konieczność silnego podciągnięcia linii danych (strong pull-up) podczas konwersji, często realizowanego przez MOSFET sterowany osobnym pinem mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA