Programowanie modułu Tibbo em1206
Czwartek, 01 Kwiecień 2010
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
List. 4. Strona WWW ? przesyłanie danych, post.html
include ?global.tbh?
dim red_on as byte
dim green_on as byte
red_on = instr(1,sock.httprqstring,?red=on?,1)
green_on = instr(1,sock.httprqstring,?green=on?,1)
pattern = get_http_argument(sock.httprqstring, ?pattern=?)
if red_on > 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.
Zobacz więcej w kategorii Notatnik konstruktora