- zakres pomiarowy temperatury: –40…125°C
- rozdzielczość pomiaru temperatury: 0,5°C
- dokładność pomiaru temperatury: ±2°C
- obsługiwane rozkazy: SEARCH_ROM, READ_ROM, MATCH_ROM, SKIP_ROM, CONVERT_T oraz READ_SCRATCHPAD,
- napięcie zasilania: 2,7…5 V, pobierany prąd: 6 mA.
To niewyobrażalne, aby element tego typu osiągał tak kuriozalne ceny, gdy jeszcze jakiś czas temu można było go kupić za równowartość 1$. Rozumiem bieżące problemy z dostępnością jakichkolwiek półprzewodników (a zwłaszcza mikrokontrolerów) lecz nic nie uzasadnia tak absurdalnej sytuacji. Na pocieszenie można dodać, że znacznie przystępniejsze, powiedziałbym normalne, ceny ma inny termometr tego producenta a mianowicie DS18B20. Niestety oba wspomniane peryferia nie są bezpośrednimi odpowiednikami, gdyż różnią się dokładnością, a co najważniejsze mają inną organizację wbudowanej pamięci (scratchpad) przechowującej wartość mierzonej temperatury a co za tym idzie nie można ich stosować zamiennie. I właśnie wtedy do głowy wpadł mi dość oryginalny, jak mi się wydaje, pomysł skonstruowania własnego termometru DS1820, którego projekt nazwałem dość sugestywnie, a mianowicie DS18SW20 (SW od słowa software).
Jednak zaznaczam, że nie będę realizował całej dostępnej funkcjonalności termometru DS1820 (choć zapewne z 90%) a skupię się wyłącznie na tych możliwościach, które zazwyczaj potrzebne są w systemach mikroprocesorowych. Zaprezentuję jednak szczegółowy opis implementacji w języku C, w związku z czym zainteresowani Czytelnicy bez problemu będą mogli dodać brakujące funkcje.
Magistrala 1-Wire
Zanim jednak przejdę do opisu samego urządzenia, jak i szczegółów implementacyjnych, nie sposób choćby skrótowo nie przypomnieć informacji na temat bardzo interesującej magistrali 1-Wire, tym razem jednak z punktu widzenia układu podrzędnego typu Slave. Tak jak wspomniano wcześniej, komunikacja na magistrali 1-Wire odbywa się przy udziale wyłącznie jednego przewodu (stąd nazwa interfejsu) oznaczonego jako DQ, który może jednocześnie pełnić rolę przewodu zasilającego w konfiguracji tzw. zasilania pasożytniczego (de facto nieobsługiwanego przez nasze urządzenie DS18SW20). W przypadku magistrali 1-Wire, tak jak w przypadku większości interfejsów szeregowych, transmisja przebiega w konfiguracji Master↔Slave.
Układ nadrzędny (Master) steruje wyszukiwaniem i adresowaniem układów podrzędnych (Slave), steruje przepływem danych oraz generuje sygnał zegarowy (inicjuje wysyłanie i odbieranie danych). Dane przesyłane są synchronicznie z prędkością do 16,3 kbps w trybie standard oraz do 115 kbps w trybie overdrive. Należy szczególnie podkreślić, że przesłanie każdego bitu informacji niezależnie od kierunku transmisji inicjowane jest wyłącznie przez układ Master za pomocą wygenerowania opadającego zbocza sygnału (ściągnięcie magistrali do logicznego „0” przez czas z zakresu 1…5 μs). Po wystąpieniu takiego zbocza sygnału układ Slave podejmuje różne działania, których scenariusz zależy od oczekiwanego kierunku transmisji. Tego typu organizacja protokołu transmisji zapewnia prawidłową synchronizację przesyłanych danych bez potrzeby stosowania dodatkowych linii sterujących.
Minimalny czas trwania pojedynczego bitu jest ściśle określony i wynosi 60 μs+1 μs na tak zwany czas odtworzenia zasilania (recovery time). Wyznacza on maksymalną prędkość transmisji w trybie standard (1/61 μs=16,3 kbps). Co ważne, każde z urządzeń podłączonych do magistrali musi mieć wyjście typu otwarty dren lub otwarty kolektor, a linia danych połączona jest do zasilania przez rezystor podciągający o typowej wartości 4,7 kΩ, co w stanie bezczynności powoduje utrzymywanie się stanu wysokiego na tej linii zapewniającego zasilanie urządzeń podrzędnych (jeśli pracują w trybie zasilania pasożytniczego).
Sama magistrala nie ma ustalonego formatu danych a sposób przesyłania informacji zależy od konfiguracji i właściwości układów podrzędnych. Przesyłane słowa są zawsze jednobajtowe a jako pierwszy transmitowany jest bit mniej znaczący. Dodatkową i jedną z najważniejszych cech urządzeń z interfejsem 1-Wire, o czym wspomniano na wstępie, odróżniającą je jednocześnie np. od urządzeń standardu I²C, jest unikatowy, ośmiobajtowy adres zapisany w pamięci ROM peryferium. Adres ten jest niepowtarzalny i właściwy tylko i wyłącznie pojedynczemu układowi scalonemu (dla elementów produkowanych przez firmę Maxim/Dallas zapisywany jest na etapie produkcji). Najmniej znaczący bajt tego adresu zawiera kod rodziny układów (Family code), kolejne 6 bajtów zawiera unikatowy kod konkretnego egzemplarza (właściwy adresu układu) a najbardziej znaczący bajt zawiera sumę kontrolną CRC8 (Cyclic Redundancy Check). Suma ta wyliczana jest na podstawie poprzednich siedmiu bajtów i jest ustalana na etapie produkcji (służy do kontroli poprawności transmisji).