Programowanie modułu Tibbo em1206

Programowanie modułu Tibbo em1206
Pobierz PDF Download icon
W listopadowym numerze \"Elektroniki Praktycznej\" był szczegółowo opisany \"inteligentny\" interfejs firmy Tibbo - em1206. Dziś zaczniemy krok po kroku przygodę z programowaniem wyżej wymienionego modułu. Dowiemy się, jakie narzędzia dostarcza producent oraz napiszemy pierwszy, przykładowy program sterujący diodami LED. Uruchomimy też serwer WWW. Nic nie stoi na przeszkodzie, aby diody LED z przykładu aplikacji zastąpić np. przekaźnikami i wykonać funkcjonalne, komercyjne urządzenie.
113ELEKTRONIKA PRAKTYCZNA 4/2010 Programowanie modułu Tibbo em1206 Do celów testowych posłużymy się płytą ewaluacyjną EM1206-EV. Jest ona wyposażo- na między innymi w: ? moduł Tibbo EM1206 ? 512K-00 z modu- łem złącza RJ203, ? złącze SPI do podłączenia modułu Wi-Fi ? GA1000, ? kondensator podtrzymujący zasilanie o pojemności 4 F, ? buzzer, ? 10 diod świecących LED (2 kontrolne+8 dowolnie konfigurowalnych), ? interfejs RS232 ze złączem DB9, ? złącza ARK z  doprowadzonymi liniami portu szeregowego w standardzie TTL lub RS232, w zależności od ustawień jumperów. Do zasilenia płyty ewaluacyjnej należy zastosować zasilacz stabilizowany o  napię- ciu wyjściowym 9...12 V i prądzie powyżej 500 mA. Jeżeli będziemy chcieli zasilić urzą- dzenie zewnętrzne, korzystając z dostępnego wyprowadzenia, to należy użyć odpowied- nio mocniejszego zasilacza. TAIKO Wraz z produktami Tibbo jest dostarcza- ne następujące darmowe oprogramowanie: ? TiOS ? system operacyjny Tibbo w wersji ?EM1206 Platform Firmware? (http://tibbo. com/downloads/basic/firmware.html), ? TIDE ? zintegrowane środowisko progra- mistyczne (http://tibbo.com/downloads/ basic/software.html), ? DST ? zarządzanie wirtualnymi portami szeregowymi, np.: COM1 (http://tibbo. com/downloads/soi/tdst.html). Wszystkie wymienione wyżej programy są dostępne w ramach pakietu noszącego na- Programowanie modułu Tibbo em1206 zwę handlową TAIKO. Zestaw ten umożliwia tworzenie i rozwijanie aplikacji oraz ich im- plementację w praktycznych zastosowaniach. TiOS. Zintegrowany system operacyjny wykonany przez Tibbo Technologies. Odpo- wiada on za dwa główne procesy: ? Master Process odpowiedzialny za komu- nikację oraz obsługę zdarzeń, ? Virtual Machine, który jest kontrolowa- ny przez nadrzędny Master Process. VM wykonuje polecenia programu użytkow- nika. TIDE. TIDE to zintegrowane środowisko umożliwiające zarządzanie projektami oraz oczywiście ? pisanie, edycję, symulację oraz wyszukiwanie błędów w programie. Moduł edytora automatycznie dokańcza komendy systemowe. Jak każde nowoczesne środowi- sko programistyczne, TIDE ma wbudowany kompilator, który podczas kompilacji wy- świetla komunikaty o  błędach składni pro- gramu. TibboBasic. Język programowania opra- cowany przez Tibbo, dedykowany do progra- mowania modułów. Tibbo Basic jest podob- ny do innych języków BASIC (np. VSBasic, QuickBasic, itp.), ale producent wyposażył go w dodatkowe funkcje. Tak w dużym skrócie można opisać śro- dowisko pracy z modułami Tibbo. W dalszej kolejności zajmiemy się napisaniem przykła- du programu w języku Tibbo Basic oraz jego uruchomieniem. Sterowanie diodami LED Aby zacząć, należy pobrać wyżej wymie- nione oprogramowanie ze strony producenta http://www.tibbo.com. Należy pamiętać, aby zawsze korzystać z  najnowszej, dostępnej wersji. Po instalacji Tibbo IDE oraz Tibbo DST możemy rozpocząć tworzenie aplikacji. Za- czniemy od odnalezienia modułu podłączo- nego do sieci oraz wgrania do niego systemu operacyjnego TiOS. W  tym celu otwieramy program Device Explorer znajdujący się w katalogu Tibbo\Tibbo IDE ?Menu Start?. Przy pierwszym uruchomieniu należy pamiętać o ustaleniu reguły firewalla. Z  listy wykrytych modułów w  sie- ci (rys.  1) zaznaczamy interesujący nas em1206. Jeżeli nie jesteśmy pewni, możemy zaznaczyć każdy z  modułów i  przycisnąć klawisz Buzz, co spowoduje szybkie miganie diody na wybranym module. Gdy jesteśmy pewni wyboru, możemy przystąpić do aktu- alizacji oprogramowania. W  chwili pisania artykułu najnowsza wersja była oznaczona jako tios-em1206-2_20_05.bin. Z  menu kontekstowego klawisza Uplo- ad wybieramy Load Firmware Through the Network, następnie wybieramy wcześniej pobrany plik binarny i przyciskamy klawisz Otwórz. Aktualizację oprogramowania mo- dułu można wykonać również przy użyciu portu szeregowego (COMx) oraz kabla typu null-modem. O  poprawnie zakończonej ak- tualizacji zostaniemy poinformowani odpo- wiednim komunikatem. W  listopadowym numerze ?Elektroniki Praktycznej? był szczegółowo opisany ?inteligentny? interfejs firmy Tibbo ? em1206. Dziś zaczniemy krok po kroku przygodę z  programowaniem wyżej wymienionego modułu. Dowiemy się, jakie narzędzia dostarcza producent oraz napiszemy pierwszy, przykładowy program sterujący diodami LED. Uruchomimy też serwer WWW. Nic nie stoi na przeszkodzie, aby diody LED z  przykładu aplikacji zastąpić np. przekaźnikami i  wykonać funkcjonalne, komercyjne urządzenie. Rys. 1. Rys. 2. notatnik konstruktora Dodatkowe materiały na CD i FTP 114 ELEKTRONIKA PRAKTYCZNA 4/2010 notatnik konstruktora Klikając na drugą zakładkę, zobaczy- my wszystkie możliwe zdarzenia, funkcje, zmienne globalne, z których możemy korzy- stać w  czasie tworzenia programu. Zarów- no obiekty, zdarzenia, jak i  wywołania są zależne od wybranej platformy sprzętowej (rys. 5). Jeżeli zatrzymamy kursor przez chwilę nad wybranym zdarzeniem, to pojawi się podpowiedź w  postaci chmurki z  krótkim opisem (rys. 6). Dwukrotne przyciśnięcie wybranego zdarzenia powoduje stworzenie szablonu w  treści otwartego źródła, w  miejscu gdzie aktualnie znajduje się kursor. W  tab.  1 znajduje się zestawienie wszystkich możliwych zdarzeń dla systemu em1206. Po załączeniu zasilania lub zerowaniu moduły Tibbo wymagają konfiguracji. W tym celu skorzystamy ze zdarzenia on_sys_init. Klikamy dwukrotnie na etykietę event, znaj- dującą się w  menu zakładki Browers. Spo- woduje to pojawienie się szablonu w treści otwartego pliku źródłowego (w naszym przy- padku w  main.tbs). Nasze urządzenie bę- dzie pracować w sieci Ethernet jako serwer WWW, więc musimy wpierw skonfigurować protokół IP. W  aplikacji moduł będzie miał przypisany na stałe adres IP. Wpisujemy go do zmiennej net.ip (wartość domyślna to 127.0.0.1). W  treści funkcji inicjalizującej wpisujemy np. ?net.ip = 192.168.0.95?. Te- raz nasz moduł po skompilowaniu będzie widoczny w  sieci pod tym adresem. Na- stępnie należy podać liczbę socketów, odpo- wiadającą liczbie jednoczesnych połączeń z różnymi klientami. W naszym przypadku wystarczą dwa. Każdy z  socketów należy jeszcze skonfigurować, tzn. określić, jakie typy połączeń może obsłużyć, wielkości bu- forów oraz skąd może odebrać połączenie. Służą temu kolejne odwołania systemowe, skierowane do obiektu sock: ? syscall sock.rxbuffrq(numpages as byte) as byte, przydzielenie miejsca w pamięci dla bufora odbioru w stronach, gdzie jed- na strona odpowiada 256 bajtom. Nale- ży jednak pamiętać, że realnie mamy do dyspozycji mniejszy o 16 bajtów rozmiar zalokowanej pamięci, zgodnie ze wzo- rem numpages*256-16. Wynika to z wła- sności systemu TiOS, który potrzebuje 16 bajtów pamięci do kontrolowanie bu- fora. ? syscall sock.txbufferq(numpages as byte) as byte, analogicznie do bufora odbior- czego deklaruje wielkość bufora nadawa- nia. ? syscall sock.varbufferq(numpages as byte) as byte, deklaruje przydzielenie miejsca w  pamięci dla bufora obsługi http. Wielkość ustalamy, zakładając mak- symalny string przesyłany w  metodzie Get. Rys. 4. Rys. 3. Rys. 5. Rys. 6. Dalszą część pracy wykonamy już w  środowisku programistycznym Tibbo IDE. Uruchomione środowisko przywita nas pustą przestrzenią MDI (rys.  2). Za- czniemy od założenia projektu. W tym celu należy użyć Menu programu File ?> New Project. Spośród wielu opcji należy wybrać następujące: ? Project name: . ? Location: . ? Transport: . Aby uzupełnić pole Target, należy przy- cisnąć klawisz Select. Pojawi się znane nam okno Device Explorer. Tym razem jednak zaznaczamy tylko interesujący nas moduł i przyciskamy klawisz Select. Na tym etapie zakończyliśmy konfigura- cję sprzętową projektu. Sądzę, że programi- ści mikrokontrolerów docenią prostotę opi- sanych wyżej czynności. Na koniec potwierdzamy wprowadzone dane, przyciskając klawisz OK. Teraz już mo- żemy zacząć programowanie. Na rys. 4 po- kazano główne okno programu gotowego do pracy. Po lewej stronie, w Inspektorze Projek- tu, znajduje się zakładka Files. Tutaj widzi- my wszystkie pliki, które możemy stosować w aplikacji. Program rozpoznaje pliki własne (*.tbc; *.tbs; *.tbh) oraz pliki obce (*.txt; *.html; *.jpeg; *.jpg; *.gif; *.png; itd.). ? Platform: ? definiuje platformę, na której zamierza- my uruchomić nasz program. ? Available Project types: ? szablon projektu zawierający plik główny nagłówkowa global.tbh (Tibbo Basic Header) oraz plik źródłowy main. tbs (Tibbo Basic Source). Pozostałe sza- blony zawierają odpowiednio dodatko- we funkcje: global.tbh + main.tbs + dhcp.tbs ? implementacja klienta DHCP, zawiera dodatkowo kod inicjalizacji soc- ketów TCP i portów szeregowych w tre- ści main.tbs. 115ELEKTRONIKA PRAKTYCZNA 4/2010 Programowanie modułu Tibbo em1206 Tab. 1. Wykaz zdarzeń systemu em1206 Nazwa zdarzenia Argumenty Opis on_beep brak on_button_pressed brak Zdarzenie wykonywane przy zmianie stanu linii Mode (zbocze opadające), służącej do wprowadzenia trybu aktualizacji firmwaru poprzez port szeregowy. Na płycie ewaluacyjnej przycisk ten można dowolnie oprogramo- wać on_button_released brak Jak wyżej, działa przy zboczu narastającym on_io_int linestate as byte Generowany w  momencie wykrycia zmiany stanu linii określonych, jako linie przerwań on_kp key_event as pl_kp_event_codes, key_code as byte Zdarzenie wykonywane, gdy którykolwiek z  klawiszy klawiatury zostanie przyciśnięty on_kp_overflow brak Zdarzenie wykonywane w  przypadku przepełnienia bufora klawiatury, informuje nas o  możliwości zgubienia kolejnych znaków on_net_link_change brak Zdarzenie wykonywane przy zmianie stanu linku war- stwy fizycznej połączenia sieciowego on_net_overrun brak Zdarzenie wykonywane w  przypadku przepełnienia buforu odbiorczego interfejsu sieciowego ? układu NIC (DM9000) on_pat brak Zdarzenie wykonywane po zakończeniu wykonywania metody play na obiekcie pat, po sekwencyjnym wystero- waniu diod LED SR i  SG on_ser_data_arrival brak Zdarzenie wykonywane, gdy w  buforze odbiorczym portu szeregowego (UART) modułu em1206 znajduje się dana on_ser_data_sent brak Zdarzenie wykonywane analogicznie do powyższego, z  tą różnicą, że badany jest bufor nadawczy portu szeregowego on_ser_esc brak Zdarzenie wykonywane po wykrycie znaku zdefiniowane- go poprzez użycie ser.escchar(), w  buforze odbiorczym on_ser_overrun brak Zdarzenie wykonywane w  przypadku przepełnienia bufo- ra odbiorczego portu szeregowego modułu em1206 on_sock_data_ arrival brak Zdarzenie wykonywane w  momencie pojawienia się danych w  buforze odbiorczym zadeklarowanego socketu. W  przypadku socketu obsługującego protokół TCP, gdy program nie zdąży odczytać całego strumienia danych, generowane jest kolejne zdarzenie, a  dane nie są traco- ne. W  przypadku UDP nieodczytane dane są tracone on_sock_data_sent brak Zdarzenie wykonywane analogicznie do powyższego, z  tą różnicą, że badany jest bufor nadawczy połączeń sieciowych on_sock_event newstate as pl_sock_state, newstatesimple as pl_sock_state_ simple Zdarzenie wykonywane po zmianie stanu socketu on_sock_inband brak Zdarzenie występuje, jeżeli włączona jest obsługa ko- mend inband i  zostanie rozpoznana komenda on_sock_overrun brak Zdarzenie wykonywane w  chwili przepełnienia buforu odbiorczego. Wykonywane przy komunikacji po UDP on_sock_postdata brak Zdarzenie generowane w  momencie gdy ostatni bajt jest przesłany do VAR bufora, dla połączeń HTTP on_sock_tcp_ packet_arrival len as word Zdarzenie informujące nasz program, że ramka o  okre- ślonej długości została odebrana, dotyczy protokołu TCP on_sys_init brak Zdarzenie wykonywane tuż po zerowaniu systemu (re- start lub załączenie do sieci) on_sys_timer brak Zdarzenie generowane co 500ms (default) lub co minimum 10ms przy zmianie wartości parametru sys. timercount ? syscall sys.buffalloc() ? alokuje wcześniej zadeklarowane przestrzenie w pamięci Po ustaleniu buforów należy skonfiguro- wać własności działania komunikacji: ? property sock.protocol as pl_sock_pro- tocol ? protokół transportowy socketu. Ustawiamy TCP. ? property sock.inconmode as pl_sock_in- conmode ? własność gniazda odpowia- dająca za akceptację połączeń. Mamy do wyboru następujące wartości: ? sock.inconmode = PL_SOCK_INCON- MODE_NONE, socket nie będzie ak- ceptował połączeń ? sock.inconmode = PL_SOCK_INCON- MODE_SPECIFIC_IPPORT, socket będzie akceptować połączenia z okre- ślonego adresu IP (zmienna zawiera- 116 ELEKTRONIKA PRAKTYCZNA 4/2010 notatnik konstruktora List. 1. Kod inicjalizacji modułu em1206, main.tbs: ?---------------------------- ?Inicjalizacja systemu ?---------------------------- sub on_sys_init() ?zdarzenie wykonywane po zerowaniu (restart, włączenie ?zasilania) net.ip = ?192.168.0.95? ?stały adres IP dim i as byte ?zmienna i typu byte for i = 0 to 2 ?pętla wykonywana 2-krotnie sock.num = i sock.rxbuffrq(4) ?bufor odbioru sock.txbuffrq(4) ?bufor nadawczy sock.varbuffrq(4) ?bufor http sock.protocol = PL_SOCK_PROTOCOL_TCP ?protokół TCP sock.inconmode = PL_SOCK_INCONMODE_ANY_IP_ANY_PORT ?akceptuje wszystkie połączenia sock.allowedinterfaces = ?NET? ?akceptuje połączenia LAN sock.httpportlist = ?8080, 80? ?numery portów dla połączenia http next i sys.buffalloc ?alokacja pamięci end sub List. 2. Licznik binarny ?----------------------- ?Licznik binarny ?----------------------- sub on_button_pressed() i = i+1 if i>8 then i=0 io.portnum=PL_IO_PORT_NUM_0 ?włączenie obsługi port io.portenabled = &hFF ?wszystkie linie jako wyjścia io.portstate = i end sub Rys. 7. Wynik będzie sygnalizowany z  użyciem diod LED. Należy zwrócić uwagę na nume- rację portu i LED-ów, ponieważ nie jest za- chowana kolejność. W  celu obsługi zdarzenia przyciśnięcia klawisza MD (Mode) należy kliknąć dwu- krotnie na event znajdujący się w zakładce Browers okna Inspektora Projektu. Diody LED są podłączone do linii portu szeregowego (rys. 7), który może też pełnić rolę zwykłego, 8-bitowego portu I/O. Aby uaktywnić 8-bito- wy styl zapisu, należy posłużyć się własno- ściami obiektu I/O: ? property io.portnum as pl_io_port_num ? wybranie aktywnego portu, działanie podobne jak własności io.num, ? io.portnum=PL_IO_PORT_NUM_0 ? po- woduje użycie linii portu 0 na płycie ewaluacyjnej połączonej z  portem sze- regowym i diodami LED, ? io.portnum=PL_IO_PORT_NUM_1 ? po- woduje użycie linii portu 1 na płycie ? property sock.allowedinterfaces as string ? własność definiująca, któ- ry z  interfejsów będzie akceptowa- ny (?NET? ? LAN, ?WLN? ? WLAN), mogą być wpisane po przecinku, ? property sock.httpportlist as string ? określa numer portu, pod którym bę- dzie można nawiązać połączenie http. Na list.  1 pokazano fragment progra- mu zawierający inicjalizację modułu. Po procesie inicjalizacji możemy napi- sać krótką aplikację 8-bitowego licznika bi- narnego, liczącego wciśnięcia klawisza MD. jąca adres sock.targetip) oraz PORTU (zmienna zawierająca nr portu sock. targetport) ? sock.inconmode = PL_SOCK_INCON- MODE_SPECIFIC_IP_ANY_PORT, soc- ket będzie akceptować połączenia z do- wolnego IP, natomiast port musi zostać określony w zmiennej sock.targetport, ? sock.inconmode = PL_SOCK_INCON- MODE_ANY_IP_ANY_PORT, socket będzie akceptować połączenia z okre- ślonego IP w  zmiennej sock.targetip, natomiast port może być dowolny, 117ELEKTRONIKA PRAKTYCZNA 4/2010 Programowanie modułu Tibbo em1206 List. 3. Strona WWW, index.html Kontrolki LED
Kolor Czerwona (R) Zielona (G)


List. 4. Strona WWW ? przesyłanie danych, post.html 0 then if green_on > 0 then pat.play(?B?,PL_PAT_CANINT) else pat.play(?R?,PL_PAT_CANINT) end if else if green_on > 0 then pat.play(?G?,PL_PAT_CANINT) else pat.play(?-?,PL_PAT_CANINT) end if end if ?> Procedura ? Metoda GET, main.tbs: ?------------------- ?Metoda GET ?------------------- public function get_http_argument(byref http_req_string as string, byref argument as string) as string dim i, j as byte i = instr(1, http_req_string, argument,1) if (i = 0) then get_http_argument = ?? exit function end if i = i + len(argument) j = instr(i, http_req_string, ?&?,1) if (j = 0) then j = instr(i, http_req_string, ? ?,1) if (j = 0) then j = len(argument) end if end if get_http_argument = mid(http_req_string, i, j - i) end function ewaluacyjnej połączonej z  portem SPI dla modułu GA1000(WiFi), ? property io.portenabled as byte ? okre- ślenie kierunku linii portu (wejście/ wyjście), ? property io.portstate as byte ? zmienna określająca stan portu (H ? wysoki/L ? niski), Na początku programu należy również zadeklarować zmienną i  typu byte. Stosu- jemy prosty zapis: dim i as byte. Kompletną procedurę realizującą licznik binarny poka- zano na list. 2. Na koniec pozostała nam jeszcze do na- pisania prosta strona, na której będziemy mogli sygnalizować stan diod statusu SR i  SG. Na list.  3 pokazano kompletny kod źródłowy strony index.html. Wymiana da- nych odbywa się poprzez przesyłanie argu- mentów funkcji w adresie URL. Jest to me- toda GET opisana w standardzie HTML 4.0. W index.html nie stykamy się bezpośrednio z platformą sprzętową. Dostęp ten realizuje dopiero post.html (list. 4). W  celu zaimplementowania kodu źró- dłowego napisanego w  Tibbo Basic w  ko- dzie HTML stosujemy znaczniki . Zarówno wyniki obliczeń, jak i wartości są przesyłane przez zmienne globalne. Aby móc odczytać zmienne przeka- zywane z poziomu strony WWW, musimy utworzyć prostą procedurę odczytującą znaczenie przesyłanego łańcucha znaków. Umieszczono ją na list. 5. Gdy już napisaliśmy całe oprogramo- wanie, przechodzimy do jego testowania. Tibbo IDE dostarcza nam możliwość nie tylko uruchomienia aplikacji, ale również jej debugowania. Debugowanie odbywa się poprzez podglądanie zmiennych i występu- jących zdarzeń. Istnieje również możliwość ustawiania pułapek w celu chwilowego za- trzymania programu bądź podglądu kroko- wego. Aby przetestować napisany program, należy skorzystać z opcji menu Debug ?> Run bądź nacisnąć F5. Jeżeli chcemy pod- glądać zmienne w czasie działania progra- mu, należy wybrać opcję Debug ?> Add to Watch List. Pojawi się wtedy nowe okno MDI (rys. 8). Efektem naszej pracy jest zaprogramo- wany moduł, którym możemy sterować za- równo zdalnie (rys. 9), jak i bezpośrednio. Do bezpośredniej interakcji z  modułem wykorzystujemy przycisk MD, podłączony do specyficznej dla modułów Tibbo linii Mode. Obsługa zdalna jest realizowana po- Rys. 8. Rys. 9. przez przesyłanie argumentów w  adresie URL metodą GET. Następnie te dane są przetwarzane w ciele programu na informa- cję użyteczną i wykonana zostaje procedura ich obsługi. Mikołaj Zarzycki m.zarzycki@soyter.pl Soyter Sp. z o.o.
Artykuł ukazał się w
Kwiecień 2010
DO POBRANIA
Pobierz PDF Download icon