Połączenie DS18B20 z STM32. Projekt dla środowiska CooCox

Połączenie DS18B20 z STM32. Projekt dla środowiska CooCox
Pobierz PDF Download icon
Artykuł stanowi uzupełnienie kursu "STM-y nie tylko dla początkujących". Pokazane zostaną przykłady procedur pozwalających kontrolerowi STM32 obsłużyć magistralę 1-Wire i podłączony termometr np. popularny DS18B20. Drugim celem będzie przybliżenie darmowego środowiska programistycznego CooCox. Za jego pomocą i korzystając z opisywanych procedur będzie można szybko napisać własny program dla STM32.

Do wykonania oprogramowania dla kontrolera potrzebne jest środowisko pozwalające na przetworzenie plików źródłowych w binarny kod wynikowy nadający się do zapisania do pamięci Flash. Pełne środowisko programistyczne to: edytor kodu źródłowego, oprogramowanie do zarządzania plikami projektu, kompilator, debuger, obsługa programatora do zapisu do pamięci Flash kontrolera. Takim bezpłatnym IDE (Integrated Development Enviroment) jest CooCox. Projekt procedur obsługujących magistralę 1-Wire będzie wykonany z jego użyciem, jednak pliki mogą być łatwo przystosowane dla dowolnego, innego kompilatora języka C dla STM32.

Jako baza sprzętowa do eksperymentu posłuży Panel Edukacyjny AVT5465 z kontrolerem STM32F103RC. Procedury magistrali 1-Wire dadzą się uruchomić także na dowolnym innym kontrolerze z rodziny STM32.

Co to jest CooCox?

CooCox jest przeznaczony dla kontrolerów ARM z rdzeniem Cortex M0/M0+/M3/M4. Obsługiwane są układy takich firm jak Atmel, Energy Micro, Feescale, Holtek, Nuvoton, NXP, Spansion, ST, TI, Toshiba. CooCox bazuje na platformie Eclipse napisanej w Javie. W istocie jest nakładką na Eclipse z obsługą wtyczek do kompilatora, debugera itd. Integruje wszystkie składniki tworząc gotowe narzędzie o dość intuicyjnym działaniu. Dodatkowo oferuje zestaw gotowych szablonów do budowy nowych projektów dla różnych typów kontrolerów a także dostęp do bazy przykładowych projektów. Dzięki temu można szybko opanować podstawy jego obsługi.

Instalacja CooCoxa

Rysunek 1. Podanie nazwy projektu

CooCox pracuje z systemem operacyjnym Windows. Został przetestowany ze starym Windows XP jak i z nowszym Windows 7. Instalacja pakietu przebiega w kilku prostych krokach i zazwyczaj jest bezproblemowa. Opiszę kolejne etapy zwracając uwagę na kluczowe momenty.

  1. Instalowanie pakietu kompilatora GNU Tools for ARM.
    CooCox z definicji nie jest wyposażony w kompilator natomiast bezproblemowo może współpracować z pakietem kompilatorów GNU Tools for ARM. Pakiet należy zainstalować w pierwszej kolejności. Pod adresem https://launchpad.net/gcc-arm-embedded/+download znajduje się strona projektu GNU GCC. Należy ściągnąć plik oznaczony "Windows installer". Plik "waży" ponad 90 MB i automatycznie zainstaluje w systemie pakiet kompilatora. W momencie pisania tekstu była to wersja gcc-armnone- eabi-4_9-2015q1-20150306-win32.exe. Po uruchomieniu plik będzie instalował oprogramowanie. Najbezpieczniej zgodzić się na domyślne lokalizacje proponowane przez instalator. Uwaga! Wśród dostępnych powinna być zaznaczona opcja "Add path to enviroment variable". Pozwala to na automatyczne dodanie do zmiennej środowiskowej "path" systemu Windows ścieżki dostępu do plików kompilatora.
  2. Instalowanie CooCox CoIDE lub CoCenter.
    W następnej kolejności należy ze strony CooCox ściągnąć IDE, czyli środowisko programistyczne. Aby to zrobić należy najpierw się zarejestrować na stronie http://www1.coocox.org/CooCox_CoIDE.htm. Jak na razie jest to jedyne ograniczenie w dostępie. Samo środowisko można zainstalować na dwa sposoby - poprzez plik programu CoCenter automatycznie instalującego różne dodatkowe programy z grupy CooCox lub bezpośrednio. Jeżeli kogoś nie interesuje oprogramowanie dodatkowe lub napotkamy trudności przy pracy z CoCenter, można pobrać plik CoIde korzystając na stronie http://www1.coocox.org/CooCox_CoIDE.htm z opcji Download the latest CoIDE directly. Plik ma wielkość ponad 450 MB.
  3. Ścieżka dostępu do pakietu kompilatora.
    Po zainstalowaniupakietu programistycznego CoIde można go uruchomić i ustawić ścieżkę dostępu do kompilatora GNU GCC. Zależnie od ustawień systemu operacyjnego Windows CooCox CoIde może dać się uruchomić bezpośrednio z zainstalowanego podczas instalacji na pulpicie skrótu, czasami trzeba to będzie zrobić z uprawnieniami administratora. Sam proces uruchamiania trwa dosyć długo, niekiedy pojawiają się ostrzeżenia o problemach którymi zazwyczaj można się nie przejmować. Należy wybrać z menu opcję: Project->Select Toolchain Path i podać ścieżkę dostępu do podkatalogu /bin kompilatora GNU GCC. Przykładowo może ona wyglądać tak: C:Program FilesGNU Tools ARM Embedded4.8 2014q3bin.

Od tego momentu CooCox CoIDE nadaje się do pracy.

Nowy projekt

Rysunek 2. Wybór płytki ewaluacyjnej

Pracując z pakietem CooCox CoIDE utworzenie nowego projektu jest proste i intuicyjne. Pokażę w punktach jak to się robi.

  1. Wybór z menu opcji Project->New Project otwiera okno, w którym należy podać katalog docelowy do zapamiętywania plików nowego projektu. Jeżeli pozostanie zaznaczona opcja "Use default path" pliki zostaną zapisane w standardowym podkatalogu programu "C:CooCoxCoIDEworkspace". Jeżeli opcja nie zostanie zaznaczona, można wybrać dowolną lokalizację. Dodatkowo, trzeba podać nazwę wybraną dla nowego projektu, tak jak na rysunku 1.
  2. Następnie należy określić czy projekt ma dotyczyć płytki ewaluacyjnej np. typu "Discovery" czy będzie tworzony dla samego kontrolera, tak jak na rysunku 2.
  3. Jeżeli (jak w przykładzie) projekt dotyczy kontrolera, należy wskazać na liście jego typ, co pokazano na rysunku 3.
  4. Korzystając z menu View ? Repository można otworzyć listę plików związanych z biblioteką standardową dla danego typu kontrolera. Zaznaczone pliki zostaną automatycznie dodane do projektu. W najprostszym przypadku, gdy oprogramowanie będzie tylko korzystało tylko z portów GPIO, należy wybrać następujące pozycje:
    • C Library,
    • CMSIS core,
    • CMSIS Boot,
    • RCC,
    • GPIO,
    • MISC.

Rysunek 3. Wybór typu mikrokontrolera

Do projektu automatycznie zostaną dodane pliki nagłówkowe i pliki biblioteki między innymi konfigurujące sygnały zegarowe kontrolera, pozwalające na sterowanie wyprowadzeniami GPIO, konieczne do obsługi samej biblioteki standardowej itd. Pulpit CooCox CoIDE będzie wyglądał podobnie do pokazanego na rysunku 4.

W katalogu projektu zostaną automatycznie utworzone podkatalogi z dodanymi plikami. Struktura podkatalogów będzie identyczna jak w umieszczonym z lewej stronie pulpitu oknie "Project". Kliknięcie na nazwę pliku w tym okienku powoduje jego otwarcie do edycji w centralnej części pulpitu. Do struktury plików dodany został także plik ze szkieletem procedury main().

Wybór programatora

Wybór z menu View → Configuration → Debugger pozwala na wybranie z listy Adapter posiadanego programator. Jeżeli to będzie np. ST-Link będzie służył zarówno do programowania jak i do debugowania. W opcji Download można zmienić ustawienia związane ze sposobem zapisu do pamięci FLASH kontrolera.

Ważne pliki projektu

Rysunek 4. Wygląd pulpitu CooCox CoIDE

Pewne ustawienia w konkretnych plikach projektu mają szczególne znaczenie dla kompilacji i utworzenia pliku wynikowego.

  • cmsis_boot/stm32f10x.h - w pliku tym znajduje się deklaracja wartości stałej HSE_VALUE. W deklaracji przypisuje się wartość w hercach częstotliwości zewnętrznego rezonatora kwarcowego. Powinna ona odpowiadać rzeczywiście zastosowanemu rezonatorowi. Żeby uniknąć zmieniania pliku stm32f10x.h można zadeklarować wartość stałej HSE_VALUE w oddzielnym pliku nagłówkowym utworzonym przez użytkownika dla np. własnych globalnych definicji programu. Deklaracja może wyglądać następująco: #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */.
  • cmsis_boot/stm32f10x_conf.h - plik zawiera listę plików nagłówkowych, które powinny być dołączone do programu podczas kompilacji. Wstępnie wszystkie pliki są opatrzone komentarzem Należy usunąć komentarz z nazw dołączanych plików np.
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    #include "misc.h"
  • cmsis_boot/system_stm32f10x.c - w tym pliku można wybrać częstotliwość głównego zegara systemowego. Dokonuje się tego przez usunięcie komentarza z wybranej deklaracji np.
    /* #define SYSCLK_FREQ_HSE HSE_VALUE */
    /* #define SYSCLK_FREQ_24MHz 24000000 */
    /* #define SYSCLK_FREQ_36MHz 36000000 */
    /* #define SYSCLK_FREQ_48MHz 48000000 */
    /* #define SYSCLK_FREQ_56MHz 56000000 */
    #define SYSCLK_FREQ_72MHz 72000000

Dodawanie do projektu własnych plików użytkownika

Użytkownik może dodawać do projektu własne podkatalogi grupujące dodatkowe pliki z własnymi procedurami. Dla utrzymania porządku drzewo katalogów w okienku "Project" na pulpicie powinno odzwierciedlać rzeczywistą strukturę dodawanych podkatalogów w katalogu projektu. Kliknięcie prawym przyciskiem myszy w obrębie okienka "Project" wyświetla menu pozwalające dodawać podkatalogi, włączać do nich istniejące pliki, usuwać itp.

Założenia do projektu testującego procedury 1-Wire

Rysunek 5. Oznaczenie wyprowadzeń DS18B20 (obudowa TO-92)

Kiedy wiadomo już jak zainstalować CooCox CoIDE, pora na stworzenie projektu do testu procedur magistrali 1-Wire przyłączonej do kontrolera STM32. Ponieważ jako płytka testowa posłuży Panel Edukacyjny kontrolerem docelowym projektu będzie STM32F103RC. W przypadku tworzenia projektu dla innej płytki należy zadeklarować właściwy typ kontrolera.

W opisywanych dalej procedurach magistrala 1-Wire obsługiwana jest przez port PB5. Numer portu może być w zasadzie dowolny, trzeba jedynie w pliku nagłówkowym zadeklarować inny wybrany port. Kontroler poprzez magistralę będzie się komunikował z czujnikiem DS18B20 lub DS18S20. Oznaczenie końcówek tego elementu w obudowie TO-92 pokazane zostało na rysunku 5.

Rysunek 6. Schemat połączenia DS18B20 z Panelem Edukacyjnym

Z pozostałych dwu wyprowadzeń termometru jedno należy podłączyć do masy a drugie oznaczone Vdd do napięcia +3,3 V. Schemat połączenia elementu DS18B20 z Panelem Edukacyjnym pokazano na rysunku 6. Dodatkowym elementem jest rezystor 1,5 kΩ podciągający magistralę do napięcia zasilania +3,3 V. Połączenie końcówki Vdd do napięcia zasilającego nie jest niezbędne, jednak poprawia zasięg i stabilność pracy szczególnie, jeśli do magistrali miało by być dołączonych więcej czujników niż jeden. Jeżeli wyprowadzenie Vdd nie będzie podłączone do zasilania, musi zostać zwarte do masy.

W przygotowanym projekcie o nazwie Termometr_LCD założono, że kontroler będzie czytał temperaturę z jednego czujnika dołączonego do magistrali. Jednak bardzo łatwo projekt można przystosować do obsługi jednocześnie wielu układów DS18B20. Po odczycie danych z czujnika podlegają one konwersji na standardową postać temperatury w °C i są wyświetlane na wyświetlaczu LCD Panelu. Dodatkowo świecenie diod LED sygnalizuje fakt odczytu danych z czujnika a po prawidłowej konwersji sukces zakończenia operacji. Kolejne odczyty temperatury odbywają się w niekończącej pętli o czasie trwania cyklu ok. 2 sekund.

Struktura plików procedur obsługi magistrali 1-Wire

Pliki procedur zgrupowane zostały w dwu podkatalogach: "Procedury 1Wire" dla plików źródłowych i "procedury_1Wire" dla plików nagłówkowych. Dzięki temu powinno być ułatwione przenoszenie plików do innych projektów, w których będą wykorzystywane. Poniżej pokazano strukturę katalogów procedur:
/inc/procedury_1Wire
Definicje_1Wire.h
GPIO_1W_procedury.h
Procedury_1W.h
/Procedury 1Wire
GPIO_1W_procedury.c
Procedury_1W.c

Deklaracje portu sterującego magistralą 1-Wire

Listing 1. Deklaracje portu mikrokontrolera, do którego będzie dołączona magistrala 1-Wire

W pliku Definicje_1Wire.h znajdują się deklaracje portu mikrokontrolera, do którego będzie dołączona magistrala 1-Wire - pokazano je na listingu 1.

Formalnie zadeklarowane zostały dwie linie: wyjściowa i wejściowa. Jednak obie wskazują na ten sam port PB5. Dwa oznaczenia pomagają łatwiej pokazać sytuacje, w których port odczytuje dane z magistrali lub je wysyła.

Inicjacja portu sterującego magistralą 1-Wire

Listing 2. Procedury wykorzystywane do obsługi transmisji 1-Wire

Na początku zanim cokolwiek zaczniemy wysyłać lub odczytywać z magistrali należy zainicjować port sterujący, przykładowo PB.5. Port jest ustawiany w trybie wyjścia z otwartym drenem. Jego obciążeniem jest dołączany na zewnątrz opornik 1,5 kΩ (rys. 6).

W tym trybie jest możliwe manipulowanie poziomem napięcia wyjściowego portu oraz odczytanie poziomu na porcie. Odpowiednie procedury znajdują się w pliku GPIO_1W_procedury.c.

Oprócz inicjacji portu w pliku umieszczone zostały procedury ustawiania portu w stanie wysokim, niskim oraz odczytu stanu portu. Na listingu 2 zamieszczono wszystkie z wymienionych procedur.

Na samym początku znajdują się tabele ze stałymi pozwalające w procedurach posługiwać się zadeklarowanymi w pliku Definicje_1Wire.h nazwami symbolicznymi: LINIA_1_WIRE_WY i LINIA_1_WIRE_WE.

Elementarne procedury magistrali 1-Wire

W pliku Procedury_1W.c znajdują się zasadnicze procedury komunikacji z termometrem DS18B20 poprzez magistralę 1-Wire. Można je podzielić na procedury elementarne i złożone. Pierwsze bezpośrednio współpracują z procedurami sterującymi portem PB.5.

Listing 3. Podstawowe procedury obsługi transmisji 1-Wire

Są to:

  • Inicjacja_1_Wire - inicjowanie 1-Wire, czyli tylko inicjowanie trybu pracy portu.
  • OW_reset - procedura generowanie impulsu RESET i odbioru potwierdzenia PRESENCE z czujnika DS18B20.
  • OW_write_bit - zapisanie pojedynczego bitu na magistralę 1-Wire.
  • OW_read_bit - odczytanie pojedynczego bitu z magistrali 1-Wire.
  • OW_write_byte - wysłanie zmiennej 1-bajtowej na magistralę.
  • OW_read_byte -odczytanie z magistrali zmiennej 1-bajtowej.

Procedury do prawidłowego działania wymagają odmierzania odcinków czasu rzędu mikrosekund. Realizuje to zewnętrzna procedura Delay_us(), która odmierza czas za pomocą pętli programowej, co zapewnia wystarczającą precyzję. Wymienione procedury zaprezentowano na listingu 3.

Złożone procedury obsługi magistrali 1-Wire

Procedury złożone odwołując się do procedur elementarnych obsługują komunikację z elementem dołączonym do magistrali.

Listing 4. Złożone procedury magistrali 1-Wire

Są to:

  • Send_rom - wysyłanie 8 bajtów adresu wybranego czujnika (termometru).
  • OW_search_first - przy pracy z wieloma czujnikami (termometrami) dołączonymi do magistrali inicjacja identyfikacji adresów kolejnych czujników.
  • OW_search_next - przy pracy z wieloma czujnikami (termometrami) dołączonymi do magistrali procedura identyfikacji kolejnego czujnika.
  • OW_crc - procedura obliczania sumy kontrolnej odebranych danych z magistrali 1-Wire. Wymienione procedury pokazano na listingu 4.

Procedury odczytu i konwersji temperatury z czujników DS18B20

Opisane dalej procedury nie są właściwie związane z obsługą magistrali 1-Wire. Przeznaczone są do obsługi konkretnych czujników -termometrów poprzez odwołanie do procedur magistrali:

  • Rejestrowanie_termometru - rejestrowanie czujnika DS18B20 dołączonego do magistrali. Właściwie zadaniem procedury jest odczytanie numeru czujnika i zapamiętanie go w statycznej tabeli ROM[]. Można ją łatwo dostosować do odczytu numerów wielu dołączonych do magistrali czujników i zapamiętania ich numerów w dwu wymiarowej tabeli ROM[].
  • Procedura_pomiaru_temperatury - właściwa procedura inicjacji i odczytu zmierzonej przez czujnik temperatury.
  • Konwersja_rejestry_temperatura_DS18B20 - konwersja danych odczytanych z czujnika DS18B20 na stopnie Celsiusa.
  • Konwersja_rejestry_temperatura_DS18S20 - konwersja danych odczytanych z czujnika DS18S20 na stopnie Celsiusa.

Wymienione procedury przestawiono na listingu 5.

Listing 5. Procedury odczytu i konwersji temperatury z czujników DS18B20

Wszystko razem

W głównej procedurze main() najpierw powinna nastąpić inicjacja procedur 1-Wire przez wywołanie Inicjacja_1_Wire(). Następnie powinien zostać odczytany numer dołączonego do magistrali termometru i zapisany w statycznej tabeli ROM[] poprzez wywołanie procedury Rejestracja_termometru(). Potem w pętli wywoływana jest procedura odczytu temperatury z dołączonego termometru przez
status =Procedura_pomiaru_temperatury (&temperatura_term);
Jeżeli status = TRUE, przesłana w zmiennej typu float temperatura_term może zostać wyświetlona na wyświetlaczu panelu LCD, po czym sytuacja się powtarza.

Ryszard Szymaniak, EP

Artykuł ukazał się w
Elektronika Praktyczna
maj 2015
DO POBRANIA
Pobierz PDF Download icon

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Automatyka, Podzespoły, Aplikacje kwiecień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów