DS18B20 Bascom, przedstawiam mój algorytm

5/5 - (1 vote)

Przez te „wszystkie lata” i kilka projektów, z którymi miałem do czynienia, zarówno w Bascom AVR jak i Bascom 8051 udało mi się utworzyć bardzo optymalny kod dotyczący obsługi tego sensora temperatury i niezbędnych obliczeń. Mam na myśli kod najbardziej „oszczędzający” zasoby µC jaki udało mi się do tego celu stworzyć. Tak więc ten temat będzie o DS18B20 Bascom. Zawierać będzie przykładowe kody i procedury które popełniłem do obsługi tego termometru cyfrowego – oraz podobnych być może po kosmetycznych zmianach.

 

Przedstawiony wycinek programu obrazuje jak sobie praktycznie radzę w Bascom 8051 z tematem cyklicznego pomiaru i odczytu temperatury z sensora DS18B20, bez jego adresowania. Zmienna sterująca pomiar_odczyt cyklicznie, w miarę upływu czasu zmienia swoją wartość i wpływa na wykonywane procedury przez scalony sensor. W tym akurat przypadku nie potrzebowałem obsługi wartości ujemnych, lecz kod zawiera ich detekcję. Poszczególne instrukcje i obliczenia zostały przeze mnie tak dobrane aby podczas kompilacji powstawał możliwie mały kod wynikowy. Dla objaśnień kod zawiera obfite opisy.

Przykład kodu wywoływanego co stały okres czasu,

oraz niezbędne deklaracje

 

W tym przypadku instrukcja Shift Temp , Right , 4 generowała więcej kodu wynikowego niż instrukcja dzielenia. tak więc walcząc o każdy bajt w pamięci flash zdecydowałem się na takie rozwiązanie ;-P

Teraz z „innej beczki” 😉  dla wygody kiedyś przygotowałem sobie procedurę do obsługi kilku sensorów (DS18B20 Bascom AVR) podłączanych do osobnych wyprowadzeń MCU. Jakoś nie lubię stosować adresowania sensorów z uwagi na dużą ilość przetwarzanych danych. Nie przypadła mi też do gustu możliwość skanowania magistrali 1wire, i obsługa sensorów w ten sposób, z uwagi na przypadkowe „zamieszanie” mogące powstać w wyniku rozłączenia lub uszkodzenia jednego z nich. Więc kosztem dodatkowych wyprowadzeń stosuję poniższe rozwiązanie, i jemu podobne.

Niezbędne zmienne globalne do prawidłowej pracy przedstawiam poniżej.

Jak inicjować działanie procedury?

 Dla wyjaśnienia: pierwszy parametr decyduje o numerze pina w porcie do którego podłączono sensor oraz o pozycji (indeksie) w tablicy. W związku z tym nie może przyjmować wartości zero. Dodatkowo ze względu na rozległość tablicy najlepiej aby obsadzone były kolejne piny portu. Rozmiar tablicy warto dostosować do ilości używanych scalonych termometrów DS. Parametr drugi określa czy wysłany będzie rozkaz konwersji i uruchomienia wewnętrznego przetwornika, czy dane będą sczytane i przetworzone na potrzeby programu.

Poniżej kawałek kodu w postaci procedury do zmiany rozdzielczości dla DS18B20 i Bascom AVR.

Wartości Temp_hi, i Temp_lo, dla wspomnianej konfiguracji nie mają znaczenia, natomiast wartość Cfg_val trzeba odpowiednio dostosować dla uzyskania spodziewanego działania. Ja z zasady najpierw odczytuję bajt konfiguracyjny, a potem modyfikuję bity konfiguracyjne rozdzielczości. Po czym zapisuję tak zmodyfikowany bajt do układu scalonego Warto jeszcze wspomnieć, iż kiedy nie używamy funkcjonalności alarmu dwa bajty Temp_hi, i Temp_lo z rejestru układu DS można użytkować jako pamięć ogólnego przeznaczenia.

Dla przypomnienia przytaczam najistotniejsze dane z mojego opisu DS18B20.

Po podłączeniu zasilania IC przechodzi w stan bezczynności o obniżonym poborze mocy, a domyślną wartością rozdzielczości (zdefiniowaną przez producenta)  jest 12 bitów. W rejestrach ustawiona jest wtedy temperatura +85°C. Aby zainicjować pomiar temperatury i przeprowadzenie konwersji A-to-D, urządzenie master musi wydać polecenie Convert T [44h]. Po zakończeniu konwersji uzyskane dane termiczne są przechowywane w rejestrze temperatury 2-bajty pamięci ScratchPad i DS18B20 wraca do stanu nieaktywnego. Dane określające temperaturę wyrażone są w stopniach Celsjusza. Przechowywane są w rejestrze temperatury jako 16 bitowa liczba z rozszerzonym kodowaniem znaku w formacie uzupełnień do dwóch.
rejestry temperatury układu DS18B20 Bity, znaku (S) wskazują, czy temperatura jest dodatnia czy ujemna. Dla dodatnich liczb S = 0 a dla liczb ujemnych S = 1. Jeśli DS18B20 jest skonfigurowany dla rozdzielczości 12-bitowej, wszystkie bity w rejestrze temperatury będą zawierać ważne dane. Dla rozdzielczości 11-bitowej, bit 0 jest niezdefiniowany, dla 10-bitowej bity 1 i 0, a dla rozdzielczości 9-bitowej bity 2, 1 i 0 są nieokreślone.

Każde urządzenie posiada unikalny 64 – bitowy kod seryjny przechowywany w wewnętrznej pamięci ROM.

MEMORY

Organizacja pamięci DS18B20:
mapa pamięci DS18B20CONFIGURATION REGISTER

Bajt 4 pamięci ScratchPad zawiera rejestr konfiguracji. Użytkownik może ustawić rozdzielczość wyniku konwersji temperatury DS18B20 wykorzystując w tym celu bity R0 i R1 w tym rejestrze… Domyślna wartość (default) tych bitów po załączeniu zasilania to R0 = 1, a R1 = 1 (rozdzielczość 12 bitów).
Należy pamiętać, że istnieje bezpośredni kompromis między rozdzielczością i czasem konwersji (zależy on od ustawionej precyzji).

rozdzielczość wyniku i czas konwersji DS18B20

Sekwencja transakcji dostępu do DS18B20 jest następująca:

Krok 1. Inicjowanie magistrali,
Krok 2. ROM Command (wymagane dla każdej kolejnej wymiany danych),
Krok 3. DS18B20 Function Command (wymagane dla każdej kolejnej wymiany danych).

Bardzo ważne jest, aby postępować zgodnie sekwencją dla każdego dostępu do DS18B20. Układ DS18B20 nie odpowiada, jeśli jakiekolwiek kroku w sekwencji brakuje lub krok jest poza kolejnością.

Polecenia ROM DS18B20

READ ROM [33h]
MATCH ROM [55h]
SKIP ROM [CCh]
ALARM SEARCH [ECh]

Polecenia FUNKCYJNE DS18B20

CONVERT T [44h]
WRITE SCRATCHPAD [4Eh]
READ SCRATCHPAD [BEh]
COPY SCRATCHPAD [48h]
RECALL E2 [B8h]
READ POWER SUPPLY [B4h]

 Trochę o sprzęcie …

Wielkiej filozofii tutaj nie ma bo sensor posiada tylko trzy piny 😉 GND, DQ, VDD. Do pełni szczęścia wymagany jest rezystor pull-up podłączony do linii danych DQ, o wartości 4,7kΩ. Napięcie zasilania powinno zawierać się w zakresie 3.0V do 5.5V. Wygodną alternatywą może być zasilanie pasożytnicze gdzie IC „kradnie” moc z magistrali 1-Wire. W takim wypadku pin VDD należy podłączyć do sygnału GND. Tryb ten nie jest zalecany do pomiaru temperatur wyższych od 100°C. Maksymalny prąd pobierany przez sensor w trybie standby może wynieść 1000 nA (typowo 750nA). Natomiast w 125 °C prąd czuwania zazwyczaj wynosi 3μA. Najwyższy pobór mocy może wystąpić podczas przepisywania wartości z  EEPROM do ScratchPad lub podczas wykonywania konwersji temperatury i nie powinien przekroczyć 1,5 mA.

A.D. 2015-09-19 komunikacja z sensorem – nowe spojrzenie …

Idąc w kierunku dalszej głębszej optymalizacji kodu, i zaglądając na ciąg instrukcji niezbędnych do odczytania temperatury z sensora, z innego kierunku, można całą procedurę przeprowadzić jeszcze lepiej. 😉
Do tej pory preferowałem drogę postępowania następującą:
kod wyposażony był w zmienną sterującą na przemiennym wysyłaniem rozkazu konwersji, lub ciągu instrukcji do odczytania danych.
Od tej pory zmienna ta niekoniecznie będzie potrzebna w większości prostych zastosowań. Sprawę można załatwić w sposób następujący:
przy starcie programu wysłanie rozkazu konwersji, co zadany interwał czasu (jak do tej pory) odczyt danych a po jego zakończeniu od razu rozkaz konwersji. Tym sposobem zbędna staje się zmienna sterująca i odczyty przebiegną dwa razy sprawniej 😛


Prezentacja układu z pomiarem temperatury za pośrednictwem przedstawionej metody.


 

Zestawienie aktualnie produkowanych termometrów DS* na witrynie producenta.

opis DS1822
opis DS1821
opis DS18B20
opis DS18S20
opis DS18S20-PAR

Otagowano , , , .Dodaj do zakładek Link.

2 odpowiedzi na „DS18B20 Bascom, przedstawiam mój algorytm

  1. Łukasz komentarz:

    Czy aby ten algorytm nie obcina 0,1°C w dół?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

cztery × 5 =

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.