Dostosuj preferencje dotyczące zgody

Używamy plików cookie, aby pomóc użytkownikom w sprawnej nawigacji i wykonywaniu określonych funkcji. Szczegółowe informacje na temat wszystkich plików cookie odpowiadających poszczególnym kategoriom zgody znajdują się poniżej.

Pliki cookie sklasyfikowane jako „niezbędne” są przechowywane w przeglądarce użytkownika, ponieważ są niezbędne do włączenia podstawowych funkcji witryny.... 

Zawsze aktywne

Niezbędne pliki cookie mają kluczowe znaczenie dla podstawowych funkcji witryny i witryna nie będzie działać w zamierzony sposób bez nich. Te pliki cookie nie przechowują żadnych danych umożliwiających identyfikację osoby.

Brak plików cookie do wyświetlenia.

Funkcjonalne pliki cookie pomagają wykonywać pewne funkcje, takie jak udostępnianie zawartości witryny na platformach mediów społecznościowych, zbieranie informacji zwrotnych i inne funkcje stron trzecich.

Brak plików cookie do wyświetlenia.

Analityczne pliki cookie służą do zrozumienia, w jaki sposób użytkownicy wchodzą w interakcję z witryną. Te pliki cookie pomagają dostarczać informacje o metrykach liczby odwiedzających, współczynniku odrzuceń, źródle ruchu itp.

Brak plików cookie do wyświetlenia.

Wydajnościowe pliki cookie służą do zrozumienia i analizy kluczowych wskaźników wydajności witryny, co pomaga zapewnić lepsze wrażenia użytkownika dla odwiedzających.

Brak plików cookie do wyświetlenia.

Reklamowe pliki cookie służą do dostarczania użytkownikom spersonalizowanych reklam w oparciu o strony, które odwiedzili wcześniej, oraz do analizowania skuteczności kampanii reklamowej.

Brak plików cookie do wyświetlenia.

Powrót

DS18B20 inaczej

Tradycyjna obsługa termometru DS18B20 na Arduino ma poważną wadę – długi czas konwersji przez co reakcja na inne zdarzenia, na przykład naciśnięcie przycisku, jest bardzo opóźniona. Problem nasila się gdy termometrów jest kilkanaście lub więcej.

Artykuł ten jest związany z materiałem DS18B20 – oryginał czy podróbka? oraz jest kontynuacją idei „Arduino profesjonalnie?”. Pokazuje, że czasem trzeba odejść od szablonowych rozwiązań aby usunąć jakiś problem.

Problem obsługi DS18B20

We wcześniejszym artykule (U070) była mowa o obsłudze watchdoga (WDTWatchdog timer). W przypadku termometrów DS18B20 czas konwersji wynosi nawet 750 ms, co wymusza długie czasy dla WDT. Gdy termometrów jest dużo czas może przekroczyć maksymalny dopuszczalny przez WDT. Ponadto w czasie konwersji temperatury CPU nie robi nic innego jak czeka na jej koniec, pracują tylko przerwania. Z tego powodu dane przychodzące do UART mogą przepełnić jego bufor, przez co utracimy dane. W czasie konwersji nie działa ewentualna klawiatura, przez co reakcja na naciskanie przycisków jest bardzo opóźniona. W jaki sposób rozwiązać problem długiego czasu konwersji?

Rozwiązanie

Pierwsze co przychodzi do głowy to RTOS. Niestety, jest to zły kierunek! Dlaczego? Aby używać RTOS trzeba dobrze go znać, a ponadto, dobrze znać architekturę mikrokontrolera (uC), biegle posługiwać się przerwaniami, doskonale znać układy peryferyjne uC. Jest jeszcze jedna, bardzo duża przeszkoda – zapotrzebowanie na RAM, której w AVR jest bardzo mało. W przypadku AVR jest jeszcze problem braku timerów, dlatego RTOS dla AVR zazwyczaj korzysta z WDT do przełączania tasków co ma poważne wady, tracimy układ WDT i mamy niekonfigurowany czas przełączania tasków wykonujących się zbyt długo wynoszący około 16 ms, podczas gdy we współczesnych CPU normą jest czas 1 ms. I kolejny raz widać przewagę ARM nad AVR – duża liczba timerów i pojemność pamięci RAM. Kolejny problem, to ustawienie wielkości stosu dla poszczególnych tasków. Na forach często widzę wypowiedzi „użyj RTOS” ale nie widziałem ani jednej wypowiedzi wyjaśniającej, jaką wielkość stosu ustawić i dlaczego. Temat stosu tasków jest dosyć skomplikowany, zwłaszcza, gdy RAM jest mało. Wyjaśnienie jak sprawdzić zajętość stosu poszczególnych tasków to temat bardziej na książkę niż artykuł, a jest jeszcze problem skonfigurowania RTOS, aby działał tak, jak tego chcemy, dlatego odradzam RTOS osobom nie znających dobrze tego systemu i architektury uC.

Jak więc rozwiązać problem?

Zbudowałem prosty układ według rysunku 1, nazywanego błędnie przez arduinowców schematem.

Rysunek 1

Narysowałem schemat tego układu – rysunek 2.

Rysunek 2

Sami oceńcie, który jest czytelniejszy i jak wyglądałby skomplikowany pseudoschemat gdyby urządzenie było bardzo skomplikowane, z tysiącami połączeń.

Standardowa obsługa termometru znajduje się w pliku „Wielowatkowosc_DS18B20_L1”, którego istotne fragmenty pokazuje listing 1.

Listing 1
void loop() {
  uint32_t timPomiar = millis();
  // Requests sensor for measurement
  sensors.request(sensorAddress);

  // Waiting (block the program) for measurement reesults
  while (!sensors.available());

  // Reads the temperature from sensor
  float temperature = sensors.readTemperature(sensorAddress);
  timPomiar = millis() - timPomiar;
  // Prints the temperature on Serial Monitor
  //  Serial.print(temperature);
  //  Serial.println(F(" 'C"));
  char txt[10];
  uint16_t t = temperature * 100;
  sprintf(txt, "%d.%02d *C\r\ntimPomiar %dms", t / 100, abs(t % 100), timPomiar );
  Serial.println(txt);
}

Do programu dodałem pomiar czasu konwersji temperatury – zmienna „timPomiar”. Pod koniec kodu widać zakomentowany fragment odpowiedzialny za wysyłanie wyniku pomiaru przez UART.

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w numerze wrześniowym czasopisma Zrozumieć Elektronikę (ZE 9/2023). Pełna wersja czasopisma umieszczona jest pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 9/2023 znajduje się tutaj.

 

SaS, ZE
sas.ze@vp.pl

 

Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (Cappuccino = 10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Postaw mi kawę na buycoffee.to
Następnie wybrać:
– jeśli jeden numer ZE – CAPPUCINO (10 zł),
– jeśli kilka numerów ZE – WSPIERAM ZA. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dołączyć wiadomość dla Twórcy” i tu wpisać, który numer lub numery mamy wysłać na podany adres e-mailowy.