Aplikacje sieciowe dla mikrokontrolerów są obecnie jednym
z gorących tematów. Chociaż rozwiązania stosowane w sieciach
LAN nie należą do prostych, to producenci mikrokontrolerów
i specjalizowanych układów peryferyjnych robią wszystko, żeby
dołączenie mikrokontrolera do sieci było tak łatwe, jak to tylko
możliwe.
75ELEKTRONIKA PRAKTYCZNA 11/2010
Flowcode w sieci
Aby programistom korzystanie z Ether-
netu i jednocześnie zachęcić ich do stosowa-
nia swoich wyrobów niektórzy producenci
udostępniają bezpłatnie biblioteki gotowych
stosów TCP/IP. Tak postępuje na przykład
firma Microchip, w której rozwiązaniu zaim-
plementowano większość protokołów z ro-
dziny TCP/IP. Jednak mimo bardzo dobrze
przygotowanych przykładów i materiałów
szkoleniowych, korzystanie z programowego
stosu wymaga od programisty pewnej wie-
dzy i doświadczenia. Początkującemu raczej
trudno będzie użyć tej biblioteki.
Innym rozwiązaniem są układy peryfe-
ryjne z wbudowanym, sprzętowym stosem
TCP/IP. Troszczą się one o warstwę sieciową,
transportu oraz mają wbudowane obwody
interfejsu Ethernet. Dzięki temu programi-
sta może skupić się tylko na tworzeniu war-
stwy aplikacji. Jednym z takich układów jest
W3100A firmy WIZnet. Oprócz zaimplemen-
towanej obsługi protokołów internetowych
TCP/IP, UDP, ICMP i ARP, układ wspiera pro-
tokoły DLC i MAC, a komunikuje się z mi-
krokontrolerem za pomocą interfejsu I2
C lub
przez magistralę równoległą.
Układ W3100A zastosowano w jednym
z modułów systemu e-block oferowanym
przez firmę Matrix Multimedia, producenta
pakietu Flowcode. System e-block dla mi-
krokontrolerów PIC składa się płyty głów-
nej, na której umieszczono układ zasilania,
mikrokontroler i programator umożliwiają-
cy zaprogramowanie mikrokontrolera przez
port USB z menu Flowcode (fotografia 1).
Linie portów są dołączone do złącz żeńskich
DSUB9. Przy ich użyciu można do płyty
głównej dołączyć układy peryferyjne sys-
temu e-block: wyświetlacz LCD, przyciski,
diody LED, przekaźniki, gniazdo kart SD,
układy Bluetooth, RFID i wiele innych.
Moduł jest dołączany do płyty głównej
za pomocą D-SUB9 (fotografia 2). Do dołą-
czenia do sieci LAN służy standardowy kabel
ethernetowy z wtykiem RJ-45.
Oprócz modułu z układem W3100A, na
płytce jest umieszczony stabilizator LDO
napięcia 3,3 V, złącze zasilania oraz zworki
łączące linie sygnałów sterujących z liniami
portów oraz służące do ustawiania adresu
slave interfejsu I2
C. Zastosowanie modułu ze
stosem sprzętowym umożliwia dołączanie
układów interfejsu Ethernet również innych
producentów.
Mimo iż W3100A zawiera kompletny
stos protokółów TCP/IP, to jego programo-
wa obsługa nie jest łatwa, jednak Flowcode
zdejmuje z programisty ciężar wnikliwego
wczytywania się w dokumentację, poznawa-
nia wszystkich rejestrów sterujących i algo-
rytmów ich programowania.
Układ modelowy
Mam do dyspozycji płytę główną e-block
dla mikrokontrolerów PIC i kilka modułów
peryferyjnych, w tym ethernetowy EB-023,
więc postanowiłem sprawdzić czy można
łatwo i szybko dołączyć mikrokontroler PIC
do sieci. Do prób wybrałem mikrokontroler
PIC16F877A i dodatkowo moduły e-block
wyświetlacza LCD EB-005 i styków EB-007,
które dołączyłem do złącz portów B i D mi-
krokontrolera. Moduł ethernetowy korzysta
z interfejsu I2
C i dlatego dołączyłem go do
portu C.
Flowcode w sieci
Aplikacje sieciowe dla mikrokontrolerów są obecnie jednym
z gorących tematów. Chociaż rozwiązania stosowane w sieciach
LAN nie należą do prostych, to producenci mikrokontrolerów
i specjalizowanych układów peryferyjnych robią wszystko, żeby
dołączenie mikrokontrolera do sieci było tak łatwe, jak to tylko
możliwe.
NOTATNIK KONSTRUKTORA
Fotografia 1. Płyta główna e-block przeznaczona dla mikrokontrolerów PIC
Fotografia 2. Sposób dołączenia modułów e-block do płyty głównej
76 ELEKTRONIKA PRAKTYCZNA 11/2010
NOTATNIK KONSTRUKTORA
chamialiśmy polecenie ipconfig. Adres IP
stacji docelowej ustawia funkcja Set_Desti-
nation. Jej argumentami są: adres IP i 2 bajty
określające numer portu.
Po wywołaniu wymienionych funkcji
program jest gotowy do przesyłania da-
nych z użyciem ICMP. Wysyłanie danych
umieszczonych w polu danych protokołu IP
musi być poprzedzone wywołaniem funkcji
Tx_start z argumentem określającym numer
kanału, w którym dane będą transmitowa-
ne. Następnie można wysyłać kolejne bajty
ramki ICMP. Pamiętamy, że stacja inicjująca
żądanie echa wysyła ramkę z typem Echo Re-
quest (0x08). Program wysyła bajty wywołu-
jąc funkcję Tx_sendbyte z argumentami okre-
ślającymi numer kanału i przesyłany bajt.
Wysłanie żądania echa będzie polegało
na wysłaniu sekwencji:
? bajtu 0x08 ? typ Echo Request,
? bajtu 0x00 ? kod,
? 2 bajtów sumy CRC,
? 2 bajtów identyfikatora na przykład
0x10,
? 2 bajtów numeru sekwencyjnego,
? 32 bajtów danych użytkownika.
Jeżeli podczas konfigurowania nie popeł-
niliśmy błędów, to pakiet powinien być ode-
brany przez stację o adresie ustalonym za po-
mocą funkcji Set_Destination. Stacja odeśle
do naszego modułu potwierdzenie z typem
Echo Reply (0x00). Moduł musi to potwier-
dzenie odebrać, aby stwierdzić czy realizacja
polecenia przebiegła prawidłowo.
W procedurze odbioru musi być rów-
nież odbieranie żądania echa wysłanego
przez inne stacje. Jeżeli pierwszy odebrany
bajt ma wartość 0x08, to oznacza, że moduł
odbiera żądanie echa Echo Request wysłane
przez inną stację. Jeżeli odebrany bajt jest ze-
i IP modułu oraz maskę pod-
sieci. Dodatkowo, ustawia się
adres MAC oraz address setup.
Ta ostatnia wartość jest adre-
sem slave interfejsu I2
C układu
W3100A. Ustawienia address
setup muszą być takie same, jak
ustawienia zworek J8, J9 i J10
w module EB-023.
?Pingowanie? można wyko-
nać łącząc bezpośrednio moduł
z komputerem PC. Można też
podłączyć naszą płytkę do ro-
utera lub switcha sieciowego.
Należy przy tym pamiętać, że
proste switche nie mają swoje-
go adresu IP, więc musi być do
niego dołączone co najmniej
jedno urządzenie mające ad-
res IP i obsługujące polecenie
PING, np. komputer PC z uru-
chomionym systemem Win-
dows lub Linux. Dodatkowo,
należy zwrócić uwagę na prze-
plot kabla Ethernet, który jest
konieczny przy bezpośrednim połączeniu
z komputerem PC.
Ustawienia sieci (brama, maska i adres
IP komputera) odczytujemy z ekranu kom-
putera po wysłaniu komendy ipconfig (rysu-
nek 4). W polu IP address w oknie konfiguro-
wania komponentu trzeba wpisać dowolny,
wolny adres w podsieci, inny niż adres wy-
świetlony ipconfig. Nie jest zaimplemento-
wany protokół DHCP, więc trzeba to zrobić
ręcznie. Po wpisaniu danych w oknie Pro-
perties klikamy Ok. Od tego momentu moż-
na już używać makr komponentu TCP_IP
w programie.
Najpierw trzeba wywołać makro Initiali-
ze. Inicjalizuje ono układ W3100A i ustawia
wcześniej wpisane w oknie Properties para-
metry.
Przesyłanie danych musi być poprzedzo-
ne zainicjowaniem gniazd transmisji. Można
zdefiniować do 4 takich gniazd (sockets). My
będziemy przesyłać ramki ICMP protokołem
IP i dlatego musimy zdefiniować socket IP.
Do tego celu jest używana funkcja Create
IP_Socket z parametrami: gniazdo, protokół,
rozgłaszanie (broadcast). Parametr gniazdo
może mieć wartość od 0 do 3. W pole pro-
tokół wpisujemy 0x01, bo taką wartość ma
mieć pole Protocol w na-
główku ramki protokołu IP
dla danych ICMP. Rozgła-
szanie włącza się wpisując
parametr 0x01, a wyłącza
się wpisując 0x00. Na ko-
niec pozostaje zdefinio-
wanie adresu IP stacji, do
której będziemy wysyłać
żądanie echa. Najlepiej jest
podać adres komputera PC,
na którym wcześniej uru-
Obsługa modułu ethernetowego jest po-
wiązana z komponentem TCP_IP dostępnym
w najnowszej wersji Flowcode v4. Wybiera
się go z zakładki Peripherial. Komponent
TCP_IP zawiera wiele makr sprzętowych
i aby go efektywnie używać, trzeba mieć
wiedzę na temat protokołów internetowych.
Wysyłanie instrukcji PING
Polecenie ping jest używane do testo-
wanie połączeń pomiędzy dwoma stacjami.
Przesyła się je z użyciem protokołu ICMP.
Ramka protokółu ICMP składa się 8-bito-
wych pól type i code, 16-bitowej sumy kon-
trolnej CRC i opcjonalnego pola danych.
Popularne ?pingowanie? jest żądaniem
odesłania echa. Stacja wysyłająca żądanie
przesyła pakiet ICMP typu 0x08 (Echo Requ-
est). Stacja pytana odsyła potwierdzenie typu
0x00 (Echo Reply). Kod ma wartość 0x00,
a pole danych zawiera 2-bajtowy identyfika-
tor i 2-bajtowy numer sekwencyjny pakietu
oraz dowolne, inne dane użytkownika. Sta-
cja , która odebrała żądanie echa umieszcza
w polu danych te same dane, które odebra-
ła. Identyfikator i numer sekwencyjny mogą
posłużyć do sprawdzenia czy odebrane po-
twierdzenie Echo Reply jest potwierdzeniem
wysłanego żądania.
Ramka protokołu ICMP jest umieszczana
w polu danych ramki IP. W ramce protoko-
łu IP interesuje nas pole Protocol, czyli typu
protokołu, którym przesyłane są dane. Dla
protokołu ICMP pole Protocol ma wartość
0x01, a dla protokołu TCP ma wartość 0x06.
Rysowanie programu zaczynamy od
postawienia na panelu elementu TCP_IP
i kliknięciu na nim prawym klawiszem.
Z menu rozwijanego wybieramy Ext Proper-
ties. W oknie Properties (rysunek 3) musimy
wpisać wartości adresów bramy domyślnej
Rysunek 3. Okno właściwości komponen-
tu TCP_IP
Rysunek 4. Okno programu ipconfig
Rysunek 5. Argumenty funkcji Set_Destination
Rysunek 6. Fragment programu odczytującego adres
IP z pakietu Echo Request
77ELEKTRONIKA PRAKTYCZNA 11/2010
Flowcode w sieci
jednocześnie otwierane. Numer portu jest
16-bitowy (zakres 0...65535). Dla przesyłania
stron WWW w protokole HTTP jest zarezer-
wowany port 80.
Strona umieszczona na serwerze wyma-
ga stałego monitorowania żądania dostępu,
na przykład dla stwierdzenia czy przeglądar-
ka nie żąda odświeżenia strony. Do tego celu
służy makro CheckSocketActivity. Argumen-
tem wejściowym jest numer kanału. Zależnie
od skonfigurowania połączenia sieciowego,
przesłanie strony może wymagać jednego
lub wielu żądań dostępu.
W zakładkach Web Page 1...4 trzeba
umieścić kod strony napisany w języku
łać funkcję Rx_flush_data.
Po jej wykonaniu jest moż-
liwe odebranie następnego
pakietu.
Na rysunku 7 pokazano
okno z wynikiem realizacji
komendy PING do nasze-
go modułu mającego adres
172.20.102.115.
Przykład użycia
komponentu
WebServer
Mając do dyspozycji moduł EB-023
można użyć innego komponentu dla aplika-
cji sieciowych ? WebServer. Umożliwia on
zbudowanie własnego serwera stron WWW
funkcjonującego w oparciu o mikrokontroler.
Komponent WebServer jest łatwy w uży-
ciu i nawet niezbyt doświadczony programi-
sta jest w stanie go użyć. Pokażę jak skonfigu-
rować WebServer i narysować własną aplika-
cję wyświetlającą wartość zmiennej w oknie
przeglądarki internetowej. Docelowo może
to być na przykład temperatura lub napięcie,
a moduł może posłużyć do wykonywania
zdalnych pomiarów.
Z komponentem WebServer są związane
trzy makra sprzętowe: Initalize, CreateSever-
Socket, CheckSocketActivity.
Makro Initialize zeruje i inicjalizuje mo-
duł EB-023 oraz ustawia parametry sieciowe:
domyślny adres bramy, maskę podsieci adres
IP i adres MAC (rysunek 8). Ustawiana jest
też maksymalna liczba stron z zakresu 1...4
i adres interfejsu I2
C układu W3100A.
Makro CreateServerSocket tworzy gniaz-
do (socket) do wysyłania i odbierania stron
internetowych. Argumentami makra są: nu-
mer kanału i numer portu. Dla gniazda moż-
na zdefiniować do 4 kanałów, które mogą być
rowy, to zaczynamy odbierać potwierdzenie
Echo Reply na przesłane przez nas żądanie.
Ponieważ wiemy jaki wysłaliśmy identyfi-
kator i numer sekwencji, to procedura od-
bioru może te wartości testować. Można też
sprawdzać prawidłowość sumy CRC pakie-
tu. W czasie testu użyłem procedury, która
odbiera cała ramkę, ale nie testuje ani iden-
tyfikatorów, ani sumy CRC, tylko wyświetla
pierwszych 8 znaków ASCII z pola danych.
Trochę bardziej skomplikowany jest frag-
ment procedury odbioru Echo Request i wy-
syłania potwierdzenia do nadawcy żądania.
Moduł odbiera pakiet ICMP i umieszcza go
w buforze odbiorczym. Żaby wysłać potwier-
dzenie Echo Request, trzeba prawidłowo wy-
liczyć 2 bajty sumy kontrolnej CRC, a do tego
są potrzebne dane z pakietu ICMP. Liczbę
bajtów danych można odczytać funkcją Rx_
readheader. Ta funkcja odczytuje informacje
dla każdego ze zdefiniowanych socketów.
Dla trybu IP funkcją Rx_readheader z iden-
tyfikatorem idx=1 można odczytać liczbę
bajtów danych (w naszym przypadku całego
pakietu ICMP) i adres IP źródła pakietu IP.
Obliczaniem sumy kontrolnej zajmuje się
makro programowe CRC. Suma kontrolna jest
wyliczana na podstawie odebranych danych
pakietu z tym, że pierwsze 4 bajty są wyzero-
wane, bo w polu typu jest bajt zerowy (Echo
Reply), w polu kodu jest bajt zerowy i nie li-
czymy CRC z dwóch bajtów odebranego CRC.
Drugim ważnym elementem jest odczy-
tanie adresu IP stacji, która wysłała Echo
Request po to, by móc do niej odesłać Echo
Reply. Ten adres jest zapisany w nagłówku
pakietu IP jako Destination Address. Jak już
wspomniałem, do jego odczytania używa
się funkcji Rx_readheader z identyfikatora-
mi idx od 2 do 5. Na rysunku 6 pokazano
fragment programu odczytywania adresu IP
z pakietu Echo Request wysłanego do naszej
płytki. Ten adres jest zapamiętywany w ta-
blicy ADR_IP, a potem funkcją Set_Destina-
tion wpisywany w polu Destination Address
pakietu IP, który zostanie wysłany z pakie-
tem ICMP w polu danych.
Mamy już wyliczoną sumę kontrolną
i ustawiony adres źródła. Teraz trzeba skom-
pletować pakiet ICMP. W poleceniu Ping
w odsyłanym Echo Reply pole danych po-
winno mieć taką samą zawartość, jak w ode-
branym Echo Request. Po doczytaniu cały
pakiet ICMP jest zapamiętywany w buforze
odbiorczym, który jest czytany sekwencyjnie
przez funkcję Rx_readbyte. Wykorzystamy to
do odesłania tych samych danych, które ode-
braliśmy. Żeby ustawić się na odebrane dane
odczytujemy zawartość bufora i dodajemy
pierwsze 4 bajty, aby licznik adresowy bufo-
ra odbiorczego ustawił się na pierwszy bajt
odebranego pola danych. Potem wysyłamy
2 bajty zerowe, 2 bajty wcześniej wyliczonej
sumy kontrolnej CRC i wszystkie bajty pola
danych. Po wysłaniu danych trzeba wywo-
Listing 1. Kod źródłowy strony głównej serwera
Main page
Test Webserver Flowcode PIC Micro
Rysunek 7. Wynik pingowania do aplikacji
Rysunek 8. Okno właściwości komponen-
tu WebServer
78 ELEKTRONIKA PRAKTYCZNA 11/2010
NOTATNIK KONSTRUKTORA
Listing 2. Kod źródłowy strony ?Page 2?
Internet E-Block Component
Wartosc zmiennej = %VALUE%
|
Index |
Rysunek 9. Okno komponentu Webserwer
z argumentami makra CreateServerSoc-
ket
Rysunek 12. Fragment strony Page2 umożliwiającej odczyt warto-
ści zmiennej
Rysunek 11. Okno główne programu serwera stron WWW
Rysunek 10. Pro-
gram Webserwera
HTML. Do prób
z serwerem wyko-
rzystałem kod źró-
dłowy pokazany na
listingu 1.
Oprócz modu-
łu internetowego
użyłem modułu wy-
świetlacza LCD do
częściowej kontroli
poprawności da-
nych przesyłanych
poprzez sieć. Na po-
czątku programu jest
inicjalizowany wy-
świetlacz LCD i jest
na nim wyświetlany
napis ?Webserwer
Test?. Po tym jest wy-
woływane opisywa-
ne wcześniej makro
Intialize komponen-
tu WebServer. Ponie-
waż na zainicjowa-
nie modułu potrzeb-
ny jest czas, to program odlicza opóźnienie
1 sekundy. W kolejnym kroku jest tworzone
gniazdo (socket) do komunikacji z portem 80
przez wywołanie makra CreateServerSocket
z argumentami numer kanału=0 i numer
portu=80 (rysunek 9).
Teraz możemy sprawdzić czy klient
(przeglądarka) nie żąda dostępu do strony
na naszym serwerze. Aby nie było to spraw-
dzeniem niczego, to w podstronę page2 zo-
stał wbudowany mechanizm przesyłania do
klienta wartości 8-bitowej zmiennej inkre-
mentowanej co około 100 ms. Kodu źródło-
wy page2 pokazano na listingu 2.
Żeby dana mogła być przesyłana z ser-
wera do przeglądarki, to najpierw należy
zdefiniować w programie nazwę zmien-
nej. W naszym przypadku jest to 8-bitowa
zmienna VALUE.
Wartość tej zmien-
nej jest przesyłana
z użyciem protoko-
łu HTTP do klienta
(przeglądarki) po
umieszczeniu jej
nazwy w otoczeniu
znaków %. W przy-
kładzie będzie to li-
nijka
Wartosc
zmiennej =
%VALUE%
. To
wystarczy, aby prze-
glądarka otrzymała
polecenie HTML
?wyświetl war-
tość zmiennej VALUE?. Ten bardzo prosty
z punktu widzenia użytkownika mechanizm
pozwala na odczytywanie z serwera warto-
ści dowolnych zmiennych zadeklarowanych
w programie po każdym poleceniu odświeże-
nia strony w przeglądarce.
Na rysunku 10 przedstawiono komplet-
ny program narysowany we Flowcode v4 dla
mikrokontrolera PIC18F458. Wartość zmien-
nej inkrementowanej w nieskończonej pętli
jest wyświetlana na wyświetlaczu LCD, tak
aby można było sprawdzić czy program wy-
świetlania na stronie działa prawidłowo.
Do testowania działania Webserwera
użyto mikrokontrolera PC18F458. Po jego za-
programowaniu trzeba połączyć moduł z sie-
cią Ethernet i w przeglądarce wpisać adres IP
172.20.102.115 ustalony dla modułu w trak-
cie inicjalizacji. Jeżeli wszystko zostało zro-
bione prawidłowo, to powinno wyświetlić
się okno strony głównej.
Z poziomu strony głównej można przejść
do 3 stron nazwanych Page2, Page3 i Page4.
Wartość VALUE z modułu serwera jest odczy-
tywana na stronie otwierającej się po kliknię-
ciu na Page2. Fragment tej strony pokazano
na rysunku 11. Zmienna jest odświeżana po
kliknięciu na przycisk odświeżania strony
w przeglądarce. Do strony głównej można
wrócić klikając na Index.
Uwagi końcowe
Dzięki pracy wykonanej przez twórców
pakietu Flowcode i układu WM3100A apli-
kacje sieciowe są tak łatwe, że może je wyko-
nać nawet mało zaawansowany programista.
Dowodzą tego dwa zademonstrowane tutaj
przykłady. Pierwszy z nich (ping) wymaga
trochę szerszej wiedzy na temat protokółów
sieciowych, ale nie jest to wiedza trudna do
opanowania. Z kolei projekt WebSerwera
jest tak pomyślany, że jest potrzebna tylko
znajomość podstaw języka HTML i pakietu
Flowcode.
Tomasz Jabłoński, EP
tomasz.jablonski@ep.com.pl
R E K L A M A
forum.ep.com.pl