www.eprace.edu.pl » bezprzewodowy-pomiar » Projekt bezprzewodowego systemu pomiaru temperatury » Algorytm działania programu modułu nadrzędnego i podrzędnego

Algorytm działania programu modułu nadrzędnego i podrzędnego

Programy na mikrokontrolery AVR mogą być pisane w różnych językach programowania, jednak ze względu na dostępność predefiniowanych bibliotek i kompilatorów, realnymi opcjami są języki: asembler, Basic (w odmianie Bascom) i język C [26].

Wyższość języków wysokiego poziomu nad językami niskopoziomowymi, typu asembler jest niezaprzeczalna. Pozwalają one w dużo bardziej czytelny sposób zaimplementować określony algorytm i znacząco skracają czas pisania kodu. Wydajność (poprawnie) stworzonej aplikacji jest przy tym porównywalna z aplikacjami stworzonymi w języku asembler. Należy pamiętać, że wybranie języka wysokiego poziomu nie oznacza całkowitej rezygnacji z asemblera. Często konieczne jest umieszczanie w kodzie programu wstawek asemblerowych, dzięki którym obsługa sprzętu jest bardziej efektywna.

Programy mikrokontrolerów ATmega88 zostały napisane w języku C, w otwartym (ang. Open Source) środowisku Eclipse [29]. Eclipse dostarcza programiście profesjonalny edytor kodu i pozwala w łatwy sposób (za pomocą pluginów) zintegrować środowisko z darmowym kompilatorem AVR-GCC.

Program modułu nadrzędnego

Na rysunku 3.13 przedstawiony jest uproszczony schemat blokowy algorytmu programu modułu nadrzędnego.

Rys. 3.12: Schemat blokowy algorytmu modułu nadrzędnego.

W pierwszej kolejności inicjalizowane są układy peryferyjne mikrokontrolera ATmega88 i bloki funkcyjne układu radiowego RFM12B. Działanie programów (modułu nadrzędnego i podrzędnego) opiera się o system flag, za pomocą których poszczególne bloki funkcyjne informują program główny o zaistnieniu określonych zdarzeń. Flaga jest ustawiona jeśli jej wartość wynosi „1”, flaga nieustawiona ma wartość „0”.

Obsługa portu szeregowego UART mikrokontrolera z poziomu PC, zrealizowana jest pomocą komunikatów mających postać łańcuchów znakowych zakończonych znakiem Null – ‘\0’ (ang. Null Terminated String). Komunikaty składają się z tokenów (ciągów znaków), oddzielonych przynajmniej jednym delimiterem. Funkcję delimitera pełni znak spacji „\s”. Moment zakończenia komunikatu określany jest w chwili pojawienia się znaku CR – „\r” (ang. Carriage Return) w odbiorniku UART. Przykładowy format komunikatu „data\s4\0\r”. Wysyłanie i odbieranie komunikatów zrealizowane jest za pomocą przerwań układu UART ATmega88. W tym celu stworzone zostały bufory: nadawczy i odbiorczy, znaki odbierane/nadawane wpisywane są do nich w procedurze obsługi przerwania odbiorczego/nadawczego.

Po odebraniu stosownego komunikatu przez interfejs UART status bufora odbiorczego zmienia się na READY. Po wychwyceniu tego zdarzenia przez funkcję Uart_receiver_check następuje dekodowanie komunikatu. System początkowo pracuje w trybie pracy Master – Slave, w trybie tym akceptowane są wszystkie dostępne komendy z UART. W trybie Klient-Serwer akceptowane są komendy zmiany trybu i czasu, każda inna komenda sygnalizowana jest zwróceniem komunikatu błędu. W przypadku zaakceptowania danej komendy, ustawiana jest odpowiednia flaga w celu poinformowania funkcji programu odpowiedzialnych za wysłanie konkretnego pakietu drogą radiową.

Funkcja Send_request odpowiada za budowanie ramek dla nadajnika układu radiowego w przypadku wykrycia ustawienia odpowiedniej flagi (dla konkretnego pakietu) . W trybie Master – Slave, po wysłaniu pakietu do urządzenia podrzędnego, odczekiwany jest pewien określony czas (ang. Timeout) potrzebny na odebranie informacji ze wszystkich urządzeń. Zastosowanie Timeoutu było konieczne, ponieważ w przypadku braku reakcji modułu podrzędnego, moduł nadrzędny czekał by na informację teoretycznie w nieskończoność, blokując tym samym działanie systemu. Funkcja Receive_frame wykrywa odbiór ramki, następnie sprawdza adres odbiorcy, jeżeli adres zgadza się z adresem sieciowym (adres modułu nadrzędnego) funkcja podejmuje określone działania w zależności od typu otrzymanego pakietu (np. ustawienie flagi dla nadajnika UART). Zadaniem funkcji Uart_transmitter_check jest wykrywanie flag ustawionych dla nadajnika UART i wysyłanie odpowiednich komunikatów w formacie ASCII do komputera.

W trybie Klient –Serwer możliwa jest zmiana czasu nadawania jak i trybu pracy modułów podrzędnych. W chwili wprowadzenia komendy poprzez interfejs UART dotyczącej zmiany trybu, bądź zmiany czasu modułu podrzędnego ustawiane są odpowiednie flagi. Po odebraniu pakietu danych z modułu podrzędnego, moduł podrzędny oczekuje na pakiet potwierdzenia od modułu nadrzędnego. Zamiast oczekiwanego pakietu ACK, moduł nadrzędny automatycznie wysyła pakiet trybu, bądź pakiet czasu.

Możliwość pracy wielu sieci pomiarowych na jednym obszarze, wymusiła implementację metody dostępu do łączą transmisyjnego z detekcją nośnej, tj. CSMA/CA (ang. Carrier Sense Multiple Access).

Moduły radiowe RFM12B pozwalają na detekcję zajętości kanału transmisyjnego za pomocą wbudowanego w moduł wskaźnika mocy RSSI (ang. Recived Signal Strength Indication) odbieranego sygnału. RFM12B przekazuje informację o sile odbieranego sygnału na dwa sposoby: za pomocą wyjścia analogowego, którego poziom napięcia odpowiada odebranej mocy sygnału w kanale transmisyjnym, oraz za pomocą bitu w rejestrze statusowym. W przypadku odczytu RSSI za pomocą rejestru statusowego konieczne jest wcześniejsze ustawienie progu czułości w rejestrze odbiornika. W pracy wykorzystana jest prostsza wersja odczytu RSSI, tj. sprawdzenie wartości bitu RSSI w rejestrze statusowym.

Przed nadawaniem węzły sprawdzają zajętość kanału poprzez odczytanie bitu RSSI, jeśli bit jest nie ustawiony (wartość 0), moduł może rozpocząć nadawanie wiadomości, w przeciwnym razie odczekuje losowy odcinek czasu (do ok. 1s) i ponawia sprawdzenie bitu RSSI.

Obsługa modułu radiowego RFM12B nie obciąża procesora, gdyż jest zrealizowana w całości za pomocą przerwań na pinie INT0 mikrokontrolera ATmega88. Dzięki temu mikrokontroler nie musi na bieżąco sprawdzać rejestru statusowego modułu. W przypadku modułu nadrzędnego, wprowadzanie w tryb obniżonego poboru mocy, zarówno mikrokontrolera jak i modułu radiowego nie jest konieczne, gdyż układ zasilany jest z portu USB komputera.

Program modułu podrzędnego

Program modułu podrzędnego w dużej mierze jest podobny do programu modułu nadrzędnego. Do różnic zaliczyć można: brak obsługi interfejsu UART, implementacje obsługi interfejsu 1-Wire czujnika temperatury DS18B20, implementację mechanizmu kontroli dostępu do łącza i wprowadzenie trybów oszczędzania energii.

Uproszczony schemat blokowy algorytmu programu przedstawia rysunek 3.13.

Rys. 3.13: Schemat blokowy algorytmu modułu podrzędnego.

Początkowym trybem pracy modułów podrzędnych jest tryb Master – Slave. W trybie tym moduły nasłuchują pasmo radiowe, w momencie otrzymania wiadomości sprawdzany jest jej „adresat” i „nadawca”, w przypadku niezgodności z adresem własnym („adresat”) , lub adresem sieci („nadawca”) , wiadomość jest ignorowana. Jeśli adresy odbiorcy i nadawcy w ramce zgadzają się, bądź też adres odbiorcy jest adresem rozgłoszeniowym, następuje dekodowanie ramki. W trybie Master – Slave akceptowane są wszystkie pakiety, po odebraniu wiadomości ustawiana jest flaga dla nadajnika radiowego. W trybie Klient – Serwer akceptowane są 3 pakiety: pakiet potwierdzenia ACK, pakiet trybu i pakiet czasu. W przypadku pakietu trybu i czasu następuje zmiana pracy modułu podrzędnego, co potwierdzone jest nadaniem pakietu ACK. W przypadku otrzymania pakietu ACK, następuje ponowne „uśpienie” modułu radiowego i mikrokontrolera.

Mikrokontroler ATmega88 wprowadzany jest w tryb oszczędzania energii Power-Down, natomiast moduł radiowy przechodzi w tryb głębokiego uśpienia w którym wyłączane są wszystkie bloki funkcyjne, (łącznie z oscylatorem) oprócz bloku czasomierza (Wake-Up Timer) służącego do wybudzania modułu. Wake-Up Timer pozwala odmierzać czas z dokładnością ±10%, począwszy od 1ms, aż do kilku dni, zużywając przy tym zaledwie 1.5µA[19]. Po upłynięciu zaprogramowanego czasu, moduł radiowy wybudza stanem niskim na pinie INT0 mikrokontroler z trybu uśpienia. Po „wybudzeniu” urządzenie wysyła pakiet danych do modułu nadrzędnego, następnie oczekuje na komunikat zwrotny.

Możliwość jednoczesnego nadawania przez moduły podrzędne wymusiła wprowadzenie mechanizmu kontroli dostępu do łącza transmisyjnego (ang. Media Access Control). W celu zminimalizowania ryzyka kolizji pakietów w sieci, w każdym węźle zaimplementowano protokół wielodostępu do łącza z detekcją nośnej, tj. CSMA (ang. Carrier Sense Multiple Access).

W transmisji bezprzewodowej dosyć często dochodzi do uszkodzenia ramek, ze względu na charakter transmisji radiowej ( np.: zakłócenia elektromagnetyczne pochodzące od innych urządzeń, wygaszanie sygnału). W przypadku odebrania przez węzeł podrzędny błędnej ramki (niezgodność sumy kontrolnej), moduł podrzędny wysyła do modułu nadrzędnego ramkę NACK. Moduł główny sprawdza adres odbiorcy poprzednio wysłanej ramki, jeśli adresy się zgadzają, bądź poprzednia ramka była wysłana do wszystkich urządzeń (Brodcast), ponawia wysłanie wiadomości, w przeciwnym wypadku ignoruje pakiet NACK.

W modułach podrzędnych wprowadzony został mechanizm ARQ (ang. Automatic Repeat Query) w celu poprawy funkcjonowania systemu. Często zdarza się iż to moduł nadrzędny otrzymuje uszkodzoną ramkę, w takiej sytuacji nie jest on w stanie określić jej nadawcy. Jest to szczególnie ważne w trybie pracy Klient – Serwer, gdyż moduł podrzędny oczekuje potwierdzenia otrzymania pakietu danych. W momencie wysłania pakietu danych, włączany jest czasomierz zbudowany na liczniku T1 mikrokontrolera. Po przepełnieniu licznika, ponawiane jest wysłanie pakietu danych do modułu nadrzędnego. W przypadku braku odpowiedzi czynność powtarzana jest określoną ilość razy. Ilość powtórzeń zadeklarowana jest jako wartość stała w programie mikrokontrolera (domyślnie 3 razy). Po przekroczeniu limitu retransmisji, moduł podrzędny przechodzi w tryb oszczędzania energii. W takim przypadku konieczne jest zresetowanie modułu podrzędnego, poprzez chwilowe odłączenie zasilania i powtórne skonfigurowanie.

Moduły podrzędne wprowadzone w stan energooszczędny pobierają prąd rzędu 8µA , co przekłada się na długi okres użytkowania bez konieczności wymiany akumulatorów. W dość prosty sposób można oszacować długość pracy urządzenia, na zasilaniu akumulatorowym. Dla maksymalnej mocy nadajnika, moduł podrzędny pobiera w chwili transmisji ok. 33mA, pobór prądu przy czuwaniu odbiornika jak i bezpośrednim odbiorze jest stały i wynosi ok. 18mA. Dla prędkości transmisji równej 9600bps i czasu pomiędzy kolejnymi transmisjami równego 10min, obliczenia przedstawiają się następująco:

Przyjmując pojemność pojedynczego ogniwa AAA równą 700mAh, , poprzez szeregowe połączenie, otrzymuje się w sumie zespół ogniw o łącznej pojemności 700mAh. Dzieląc łączną pojemność akumulatorów przez całkowity roczny pobór prądu, otrzymuje się teoretyczny czas „życia” baterii, który dla omawianych parametrów wynosi ponad 8 lat. Żadne z pośród obecnie dostępnych akumulatorów nie pozwalają na eksploatację przez tak długi czas, zatem można stwierdzić iż długość pracy modułów podrzędnych bez serwisowania, ograniczona jest jedynie czasem samoistnego rozładowywania ogniw.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.