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 (WDT – Watchdog 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.
Narysowałem schemat tego układu – 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
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.