Aplikacje sieciowe dla
mikrokontrolerów to aktualnie
jeden z najgorętszych tematów.
Mimo, że rozwiązania stosowane
w sieciach komputerowych
LAN nie należą do prostych,
to producenci mikrokontrolerów
i specjalizowanych układów
peryferyjnych robią wszystko,
żeby połączenie mikrokontrolera
do sieci było tak proste, jak to
tylko możliwe.
121ELEKTRONIKA PRAKTYCZNA 9/2010
Sieciowe możliwości Flowcode
trochę wiedzy na temat protokółów interneto-
wych.
PING
Polecenie PING jest używane do diagnozo-
wania połączenia pomiędzy dwoma stacjami. Do
jego przesłania służy protokół ICMP. Ramka ICMP
składa się 8-bitowych pól: type, code, 16-bitowej
sumy kontrolnej i opcjonalnego pola danych. Pole-
cenie PING to inaczej żądanie echa. Stacja wysyła-
jąca to żądanie wysyła pakiet ICMP z typem 0x08
(Echo Request). Stacja pytana odsyła potwierdzenie
z typem 0x00 (Echo Reply). Kod ma wartość 0x00,
a pole danych zawiera 2-bajtowy identyfikator,
2-bajtowy numer sekwencyjny kolejnych pakietów
oraz dowolne inne dane. Stacja, która odebrała żą-
danie echa, odsyła w polu danych te same informa-
cje, które odebrała. Identyfikator i numer sekwen-
cyjny mogą służyć do identyfikacji czy odebrane
potwierdzenie Echo Reply jest odpowiedzią na
konkretne żądanie.
Ramka protokółu ICMP jest umieszczana
w polu danych protokołu IP. W ramce protokółu IP
będzie nas interesowało pole Protocol, czyli typ pro-
tokołu, którym przesyłane są dane w polu danych.
Dla protokołu ICMP pole Protocol ma wartość 0x01,
a dla protokółu TCP ma wartość 0x06.
D-SUB9 (fotografia 2). Do połączenia modułu z sie-
cią Ethernet służy standardowe gniazdo RJ-45.
Oprócz minimodułu z układem W3100A, na
płytce umieszczono stabilizator napięcia 3,3 V,
złącza zasilania, zwory łączące sygnały sterujące
z liniami portów i do ustawiania adresu slave in-
terfejsu I2
C.
W3100A zawiera kompletny stos protokółów
TCP/IP, ale jego programowa obsługa nie jest ba-
nalna. Jak łatwo domyślić się, Flowcode zdejmuje
z programisty ciężar wnikliwego wczytywania się
w dokumentację, poznawania wszystkich rejestrów
sterujących i algorytmów ich programowania.
Ponieważ dysponuję płytą główną E-block
dla mikrokontrolerów PIC i kilkoma modułami
peryferyjnymi w tym internetowym modułem
EB-023, postanowiłem sprawdzić, czy można
w miarę prosto i szybko dołączyć mikrokontro-
ler PIC do sieci. Jako pierwszy wybrałem mi-
krokontroler PIC16F877A i dodatkowo moduły:
wyświetlacza LCD EB-005 (dołączyłem go do
portu B) i styków EB-007 (dołączyłem go do por-
tu D). Moduł internetowy korzysta z interfejsu
I2
C i dlatego został połączony z portem C.
Obsługa modułu internetowego jest po-
wiązana z komponentem TCP_IP dostępnym
w najnowszej wersji Flowcode V4 dla mikro-
kontrolerów PIC. Moż-
na go wybrać poprzez
zakładkę Peripherial.
Komponent TCP_IP
zawiera wiele makr
sprzętowych i aby móc
go efektywnie wyko-
rzystać trzeba mieć
Niektóre firmy udostępniają gotowe bibliote-
ki zawierające stosy TCP/IP. Tak robi na przykład
Microchip. Jej rozwiązanie ma szereg trudnych do
przecenienia zalet: zaimplementowano większość
protokółów z rodziny TCP/IP, a programista może
użyć tylko tych, które są mu potrzebne. Jednak
(i ta uwaga dotyczy nie tylko Microchipa) pomimo
dostępnych, dobrze udokumentowanych przy-
kładów i materiałów szkoleniowych, korzystanie
z programowego stosu wymaga od programisty
pewnego przygotowania i doświadczenia. Począt-
kującemu raczej będzie trudno skorzystać z tego
rozwiązania.
Dobrą alternatywą są układy peryferyjne
z wbudowanym sprzętowym stosem TCP/IP.
Sprzętowy interfejs układu dba o obsługę warstw
fizycznej, sieciowej i transportowej, pozwalając
programiście skupić się tylko na warstwie aplika-
cji. Jednym z takich układów jest W3100A firmy
WIZnet. Oprócz wbudowanych protokółów inter-
netowych TCP/IP, UDP, ICMP i ARP, układ wspiera
protokóły DLC i MAC interfejsu Ethernet, a komu-
nikuje się z nadrzędnym mikrokontrolerem przez
interfejs I2
C lub magistralę równoległą. W3100A
został zastosowany w jednym z modułów systemu
E? block oferowanego przez firmę Matrix Multi-
media producenta pakietu Flowcode.
Co to jest E-block?
System E-block dla mikrokontrolerów PIC
składa się płyty głównej, na której umieszczono
obwody zasilania, mikrokontroler i programator
z interfejsem USB (fotografia 1). Linie portów dołą-
czono do żeńskich, 9-wyprowadzeniowych złączy
D-SUB. Przez nie do płyty głównej można dołączyć
układy peryferyjne systemu E-block: wyświetlacz
LCD, przyciski, diody LED, przekaźniki, gniazdo
kart SD, układy Bluetooth, RFID i wiele innych.
Wspomniany moduł z układem W3100A
jest również do płyty głównej dołączany złączem
NOTATNIK KONSTRUKTORA
Sieciowe możliwości
Flowcode
Aplikacje sieciowe dla
mikrokontrolerów to aktualnie
jeden z najgorętszych tematów.
Mimo, że rozwiązania stosowane
w sieciach komputerowych
LAN nie należą do prostych,
to producenci mikrokontrolerów
i specjalizowanych układów
peryferyjnych robią wszystko,
żeby połączenie mikrokontrolera
do sieci było tak proste, jak to
tylko możliwe.
Fotografia 1. Płyta główna E-block dla mikrokontrolerów PIC z podłączonymi modułami
Fotografia 2. Moduł internetowy E-block
Dodatkowe materiały
na CD i FTP
Dodatkowe materiały na CD i FTP:
ftp://ep.com.pl, user: 14635, pass: 6uc6eled
122 ELEKTRONIKA PRAKTYCZNA 9/2010
NOTATNIK KONSTRUKTORA
Rysowanie programu
Rysowanie programu zaczynamy od umiesz-
czenia na panelu elementu TCP_IP i kliknięcia na
nim prawym klawiszem. Z rozwijanego menu wy-
bieramy Ext Properties. W oknie Properties (rysunek
3) musimy wpisać wartości nastaw bramy domyśl-
nej, maski podsieci i adresu IP modułu. Dodatkowo
ustawia się tutaj adres MAC oraz wartość Address
Setup. Jest to adres slave układu W3100A w magi-
strali I2
C. Jego wartość musi być zgodna z ustawie-
niami zworek J8, J9 i J10 na module EB-023. Pin-
gowanie możemy przeprowadzić łącząc moduł np.
bezpośrednio z komputerem PC. Można też moduł
wpiąć do routera lub switch?a sieciowego. Obie te
metody są odpowiednie dla celów testowych, ale
trzeba zwrócić uwagę na kabel połączeniowy, po-
nieważ połączenie modułu z komputerem PC wy-
maga, aby kabel był z przeplotem.
Uwaga: moduł nie ma zaimplementowanej
funkcji klienta DHCP i adres trzeba wpisać ręcznie.
Po wpisaniu danych w oknie Properties klikamy na
Ok i zamykamy okno. W tym momencie można
używać makr komponentu TCP_IP w programie.
Na początku programu trzeba wywołać makro
Initialize. Inicjalizuje ono układ W3100A i ustawia
wcześniej wpisane w oknie Properties parametry.
Przesyłanie danych musi być poprzedzone
zainicjowaniem gniazd transmisji. Można zdefi-
niować do 4 takich gniazd (sockets). My będzie-
my przesyłać ramki ICMP z użyciem protokołu IP
i dlatego musimy zdefiniować gniazdo (socket) IP.
Do tego celu jest używana funkcja Create IP_Socket
z parametrami: numer gniazda, protokół, adres roz-
głaszeniowy (brodcast).
Numer gniazda może mieć wartości od 0 do 3.
W polu protokół wpisujemy 0x01, bo taką wartość
będzie miało pole Protocol w nagłówku ramki pro-
tokołu IP dla ICMP. Rozgłaszanie włącza się wpi-
sując w parametr 0x01, a wyłącza wpisując 0x00.
Na koniec pozostaje zdefiniowanie adresu IP stacji,
od której będziemy żądać przesłania echa. Adres IP
stacji docelowej ustawia się funkcją Set_Destina-
tion. Jej argumentami są adres IP i 2 bajty określa-
jące numer portu.
Po wywołaniu powyższych funkcji, program
jest gotowy do przesyłania danych w protokole
ICMP. Wysyłanie danych musi być poprzedzone
wywołaniem Tx_start z argumentem określającym
numer kanału, w którym będą transmitowane
dane. Potem można już wysyłać kolejne bajty ramki
ICMP. Pamiętamy, że stacja, która inicjuje żądanie
Listing 2. Kod w html strony page 2
Internet E-Block Component
Wartosc zmiennej = %VALUE%
|
Index |
Rysunek 3. Okno konfigurowania kompo-
nentu TCP_IP
Rysunek 4. Argumenty funkcji Set Destination
Rysunek 5. Ustawienie adresu IP odczytanego z nagłówka
Listing 1. Kod źródłowy strony głównej serwera
Main page
Test Webserver Flowcode PIC Micro
echa (PING) wysyła ramkę z typem Echo Request
(0x08). Program przesyła bajty wywołując funkcję
Tx_sendbyte z argumentami określającymi numer
kanału i przesyłany bajt.
Jeżeli w konfiguracji nie
popełniliśmy błędów (adresy,
maska, brama), to pakiet po-
winien zostać odebrany przez
stację o adresie ustalonym
w funkcji Set_destination. Sta-
cja odeśle do naszego modułu
potwierdzenie z typem Echo
Reply (0x00). Nasz moduł musi
teraz to potwierdzenie odebrać,
żeby stwierdzić czy realizacja
polecenia PING przebiegła pra-
widłowo.
Procedura odbioru musi
również odbierać żądanie echa
wysłane przez inna stację. Jeże-
li pierwszy odebrany bajt ma
wartość 0x08, to oznacza że
moduł odbiera żądanie echa
Echo Request wysłane przez
inną stację (komputer). Jeżeli
odebrany bajt jest 0, to zaczy-
namy odbierać potwierdzenie
Echo Reply na nasze żądanie.
Ponieważ wiemy jaki wysła-
liśmy identyfikator i numer sekwencji, to proce-
dura odbioru może te wartości testować. Można
też sprawdzać prawidłowość sumy CRC pakietu.
123ELEKTRONIKA PRAKTYCZNA 9/2010
Sieciowe możliwości Flowcode
zwyw otoczeniuznaków
%. U nas będzie to linijka
Wartosc zmiennej
= %VALUE%
.
Tyle wystarczy, aby
przeglądarka otrzyma-
ła instrukcję ?wyświetl
wartość zmiennej VA-
LUE?. Ten bardzo pro-
sty mechanizm (prosty
z punktu widzenia użyt-
kownika) pozwala na
odczytywanie z serwera
wartości dowolnych
zmiennych zdeklarowa-
nych w programie po
każdym poleceniu od-
świeżenia strony w prze-
glądarce.
Na rysunku 7 poka-
zano kompletny program
w postaci graficznej
utworzony we Flowco-
de V4 dla mikrokontro-
lerów PIC Microchip. Wartość inkrementowanej
zmiennej w pętli nieskończonej jest wyświetlana
na wyświetlaczu LCD, tak aby można było spraw-
dzić, czy program wyświetlania na stronie działa
prawidłowo.
Do testowania działania Webserwera użyto
mikrokontrolera PC18F458. Po zaprogramowaniu
trzeba połączyć moduł z siecią Ethernet i w prze-
glądarce wpisać adres IP 172.20.102.115, ustalony
dla modułu w trakcie inicjalizacji. Jeżeli wszystko
zostało zrobione prawidłowo, to powinno się wy-
świetlić okno strony głównej, takie jak pokazano na
rysunku 8.
Z poziomu strony głównej można przejść do 3
stron oznaczonych jako Page2, Page3 i Page4. War-
tość VALUE z modułu serwera jest odczytywana na
stronie 2, otwierającej się po kliknięciu na Page2.
Do strony głównej można wrócić klikając na Index.
Uwagi końcowe
Dzięki pracy wykonanej przez twórców pakie-
tu Flowcode i układu WM3100A aplikacje sieciowe
są tak proste, że może się próbować z nimi mierzyć
nawet mało zaawansowany programista. Dowodzą
tego pokazane tutaj dwa przykłady. Pierwszy z nich
(ping) wymaga trochę szerszej wiedzy na temat
protokołów sieciowych. Z kolei projekt Webserwe-
ra jest tak pomyślany, że właściwie potrzebne są
tylko podstawy języka HTML i znajomość pakietu
Flowcode.
Tomasz Jabłoński, EP
tomasz.jablonski@ep.com.pl
Po wysłaniu wszystkich danych trzeba uru-
chomić funkcję Rx_flush_data. Po jej wykonaniu
możliwe jest odebranie następnego pakietu.
Web Server
Jako kolejną aplikację przygotowano WebSe-
rver przeznaczony do zbudowania własnego ser-
wera stron www. Komponent jest tak zbudowany,
że nawet niezbyt zaawansowani użytkownicy są
w stanie stworzyć własny serwer stron.
Do komponentu WebSerwer przypisano trzy
makra sprzętowe: Initalize, CreateSeverSocket
i CheckSocketActivity.
Makro Initialize zeruje i inicjalizuje moduł
internetowy EB-023 oraz ustawia parametry sie-
ciowe: bramę domyślną, maskę podsieci, adres IP
i adres MAC. Ustawia się tu też maksymalną liczbę
stron (z zakresu 1...4) i adres interfejsu I2
C układu
W3100A.
Makro CreateServerSocket tworzy gniazdo do
wysyłania i odbierania stron internetowych. Ar-
gumentami makra są numer kanału i numer por-
tu. Dla gniazda można zdefiniować do czterech
kanałów, które mogą być jednocześnie otwierane.
Numer portu jest 16-bitowy (zakres 0...65535). Do
przesyłania stron www w protokole HTTP jest zare-
zerwowany port 80.
Strona umieszczona na serwerze wymaga sta-
łego monitorowania żądania dostępu na przykład
dla stwierdzenia czy przeglądarka nie chce odświe-
żenia strony. Do tego celu służy makro CheckSoc-
ketActivity. Argumentem wejściowym jest numer
kanału. Zależnie od skonfigurowania połączenia
sieciowego przesłanie strony może wymagać jedne-
go lub więcej żądań dostępu.
W zakładkach Web Page 1...4 trzeba umieścić
kod strony napisany w html. Napisanie prostej
strony bez grafiki nie jest trudne. Do prób z serwe-
rem użyłem kodu źródłowego zamieszczonego na
listingu 1. Program serwera jest zaskakująco prosty.
Oprócz modułu internetowego użyłem modułu wy-
świetlacza LCD do częściowej kontroli poprawno-
ści przesyłania danych w sieci.
Na początku programu jest inicjalizowany
wyświetlacz LCD i wyświetlany napis ?Webserwer
Test?. Następnie jest wywoływane makro Intialize
komponentu Web Serwer. Ponieważ inicjalizacja
trochę trwa, to program odlicza opóźnienie wyno-
szące 1 sekundę. W kolejnym kroku przez wywo-
łanie makra CreateServerSocket z argumentami 0
(numer kanału) i 80 (numer portu) jest tworzone
gniazdo do komunikacji z portem 80 (rysunek 6).
W tym momencie możemy testować, czy klient
(przeglądarka) nie żąda dostępu do strony na ser-
werze. Żeby test nie był testowaniem ?niczego?, to
w podstronę page2 został wbudowany mechanizm
przesyłania do klienta wartości 8-bitowej zmiennej
inkrementowanej co około 100 ms. Na listingu 2 za-
mieszczono kod podstrony page2.
Aby dana mogła być przesyłana z serwera do
przeglądarki, to trzeba najpierw zdefiniować w pro-
gramie nazwę zmiennej ? w naszym przypadku jest
to 8-bitowa zmienna o nazwie VALUE. Wartość tej
zmiennej jest przesyłana z użyciem protokołu http
do klienta (przeglądarki), po umieszczeniu jej na-
W czasie testu użyłem procedury, która odbiera
cała ramkę, ale nie testuje ani identyfikatorów, ani
sumy CRC, tylko wyświetla osiem pierwszych zna-
ków ASCII z pola danych.
Trochę bardziej skomplikowany jest fragment
odbierania Echo Request i wysyłania potwierdzenia
do nadawcy żądania. Moduł odbiera pakiet ICMP
i umieszcza go w buforze odbiorczym. Żaby wysłać
potwierdzenie Echo Request trzeba prawidłowo
wyliczyć 2 bajty sumy kontrolnej CRC, a do tego po-
trzebna jest ilość danych pakietu ICMP. Liczbę baj-
tów w pakiecie można odczytać funkcją Rx_readhe-
ader. W trybie IP funkcja Rx_readheader z identy-
fikatorem idx=1 odczytuje liczbę bajtów zawartą
w polu danych (w naszym przypadku liczba bajtów
wchodzących w skład całego pakietu ICMP) i adres
IP źródła pakietu IP.
CRC jest wyliczane z odebranych danych pa-
kietu z tym ,ze pierwsze cztery bajty są wyzerowa-
ne, bo typ jest bajtem zerowym (Echo Reply), kod
jest bajtem zerowym i nie liczymy CRC z dwu baj-
tów odebranego CRC. Liczeniem sumy kontrolnej
zajmuje się makro programowe CRC.
Drugim ważnym elementem jest odczytanie
adresu IP stacji, która wysłała Echo Request, po to,
aby 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
wykorzystuje się funkcję Rx_readheader z iden-
tyfikatorami idx=2...5. Na rysunku 4 pokazano
fragment programu odczytujący IP z pakietu Echo
Request, wysłanego do nas. Ten adres jest zapa-
miętywany w tablicy ADR_IP, a potem funkcją Set
Detination wpisywany w pole Destination Address
pakietu IP, który zostanie wysłany z pakietem ICMP
w polu danych ? rysunek 4.
Po obliczeniu sumy kontrolnej i ustawieniu
adresu źródła można skompletować pakiet ICMP.
W poleceniu PING w odsyłanym Echo Reply pole
danych powinno mieć taką samą zawartość, jak
w odebranym Echo Request. Po doczytaniu, cały
pakiet ICMP jest zapamiętywany w buforze odbior-
czym, który jest sekwencyjnie czytany funkcją Rx_
readbyte. Wykorzystamy to do odesłania takich sa-
mych danych, jakie odebraliśmy. Żeby ustawić się
na odebrane dane odczytujemy i dodajemy pierw-
sze cztery bajty, żeby licznik adresowy bufora od-
biorczego ustawił się na pierwszy bajt odebranego
pola danych. Potem wysyłamy dwa bajty zerowe,
dwa bajty wcześniej wyliczonej sumy kontrolnej
i wszystkie bajty pola danych.
Rysunek 6. Okno właściwości komponen-
tu Webserver
Rysunek 7. Pro-
gram Webserwera
Rysunek 8. Fragment okna głównego
strony Webserwera