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
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik czerwiec 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio lipiec 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje czerwiec 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna czerwiec 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich czerwiec 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów