Takarékos webszerver
A mikrokontrollerekkel, beágyazott rendszerekkel foglalkozó kollégák mindennapos problémája, hogy az általuk létrehozott eszköz hogyan kommunikáljon a nagyvilággal, mondjuk egy PC-vel. Az egyszerű és elterjedt megoldás a soros port: a legtöbb kontroller hardveresen támogatja. A soros porttal viszont sok baj van: lassú, nem ad tápot, a maximális vezetékhossz kicsi, és a legújabb hordozható PC-ken már nincs is soros port. Csak idő kérdése, és az asztali gépekről is eltűnik. A párhuzamos port hasonló eset: ugyan legalább egy nagyságrenddel gyorsabb, de cserébe több vezetéket kell bekötni, és szoftveresen kell lekezelni az adatátvitelt. Az USB egy nagy előrelépés: gyors, tápfeszültséget is ad, többféle adatátvitel közül is választhatunk. 2-3 ezer Ft-ért lehet beszerezni univerzális USB-illesztő IC-t, amely 8 bites buszra vagy i2c-re fordít. Sajnos a kis vezetékhossz itt is korlátozó tényező, ráadásul esetenként kénytelenek vagyunk PC oldali USB drivert írni.
Az igazán elegáns megoldás az Ethernet: mikrokontrolleres készülékünk egy százméteres UTP kábel végén lóg, és az adatokat (mérési eredményeket, vezérlési információkat) otthonról, egy webböngészőn keresztül nézegethetjük. Még tápegység sem kell a végpontra, hiszen a TX/RX vezetékpárok mellett marad még 4 vezeték, amibe tápot és földet patch-elhetünk, ez a PoE (Power over Ethernet). Lehet, hogy meglepően hangzik, de néhány ezer forintos költségvetésből, kommersz alkatrészekből gond nélkül össze lehet hozni az Ethernetet.
A jól ismert 8 bites PIC-ekkel kezdtem hozzá, ehhez illesztettem Realtek 8019-et. Ez utóbbi chipet 1500 Ft-ért lehet kapni, de akár le is lehet szedni egy régi hálókártyáról (hőlégfúvóval, borotvapengével, ami épp akad). Ethernet transzformátort sajnos nem lehet kapni kis tételben, úgyhogy itt szintén a kiforrasztás a módszer. Mivel a Realtek százlábú, ezért mindenképpen nyákot kell készíteni, a próbapanel nem praktikus. A képen látható 6x10 centis eszköz nyákja a V2-ben készült. Igazából csak a két soros port miatt ilyen nagy: ha a méretre optimalizáltam volna, és csak Ethernet lenne rajta, 3x4 centi is lehetne (kontroller a hátoldalon, a Realtek és egy RJ45-tel egybeépített transzformátor az előoldalon). Nyáktervezéshez Eagle-t használtam (szabadon letölthető, linuxos is van, kicsi, gyors, egyszerű).
Elmondható, hogy egy PIC-en működő minimális webszerverhez minden adva van: a gyártó, a Microchip honlapjáról letölthető a PicdemNet kapcsolási rajza és a Microchip TCP/IP forráskódja. Ha ezt valaki megépíti, biztosan sikerélménye lesz. A dolog akkor válik igazán érdekessé, ha a meglévő áramkört és a szoftvert átszabjuk a saját igényeink szerint, valamint kijavítjuk a hibákat. A TCP/IP kód szintén minimális méretű, nagyon sokat lehet belőle tanulni. Persze bug és strukturális hiba is akad benne, de nem ez a lényeg: segítségével gyorsan beleláthatunk a TCP/IP működésébe. Mitől stack a TCP/IP stack, hogyan ágyazódnak egymásba a különböző protokollok adathalmazai, melyik fejlécben van IP cím, és melyikben MAC address: ez mind-mind olyan információ, mely már ismerős valahonnan, de csak akkor érti meg igazán az ember, ha programozza is. Elméleti hálózatismeretünk alaposabb tudássá válhat ezen egyszerű és áttekinthető TCP/IP kód tanulmányozásával. Nézzük először, hogy a kapcsoláson mit kell módosítani:
– A Microchipnél rosszul tudják, hogy a TX és RX ledet hogy kell bekötni, fordított logikájú a kapcsoláson. Új alkalmazás fejlesztésénél zavaró, ha épp akkor világít egyszerre mindkét led, ha nincs adatforgalom.
– A Realtek INT0 lába be van kötve a PIC-re, de ezt a szoftver nem használja ki. Nem is tudná, mert szoftverből nem lehet interrupt módba kapcsolni a Realteket, ehhez egy soros EPROM-ot kell illeszteni hozzá (ez megvan minden hálókártyán, ebben tárolódik a MAC address is, és nem a Realtek-ben, ahogy a közhiedelem tartja).
– Ha mégis szeretnénk interruptot (ami sokkal elegánsabb megoldás, mint a ciklikus ellenőrizgetés, hogy jött-e adat), akkor megtehetjük, hogy bekötjük az EEDI, EEDO és EESK lábakat a kontrollerre. Így megtakarítjuk a 9346-ost, mert szoftverből szimulálhatjuk az adatátvitelét (128 byte, és csak bekapcsoláskor).
A kód sokkal több fejtörést okoz. Tényleg csak arra jó, amire kitalálták: a kísérletező kedvű fejlesztő letölti, kipróbálja, és örül. Először is írjunk át két konstanst az ICMP kódban valami 60-nál nagyobb értékre, hogy linuxról is lehessen pingetni az eszközünket! Érdemes bővíteni a meglévő TCPPut eljárást, hogy ne csak bájtosan lehessen adatot küldeni. Sajnos a PIC elég lassú jószág még 40 MHz-en is (hiába állítja a Microchip, hogy "high speed microcontroller", ne higgyük el nekik, gondolatban mindig osszuk el 4-gyel az órajelet). Módosítás nélkül a TCP adatküldésben 17 kByte/sec a csúcs, ezt könnyedén a két-háromszorosára növelhetjük. A legnagyobb probléma, hogy mindenre állapotgépet kell írni. Ha például kliens módban használom a stack-et (letöltök egy fájlt valahonnan), akkor nem tehetem meg, hogy egymás után hívogatom a TCPConnect, TCPPut, TCPGet eljárásokat. Ahhoz, hogy működjön a dolog, mindig vissza kell adni a vezérlést a fő ciklusnak, ahol lekezelődik az összes adatcsomag, és összeáll a TCP adatfolyam. Néhol még időzítésre is szükség van.
A TCP/IP beágyazott alkalmazásának az a nagy előnye, hogy nem eshet meg az a csúfság, hogy nagyobb sebességgel küldik az adatot, mint ahogy azt fel tudnánk dolgozni. A protokoll része ugyanis a csúszóablakos eljárás, azaz a fogadó oldal tájékoztatja a küldőt, hogy a következő lépésben maximálisan mennyi adatot tud fogadni. Az adatfolyam hibamentes is, gond esetén a fogadó nem ad ACK-ot, a küldő pedig újraküldi a csomagot.
Mai szemmel nézve a hardverigény nem túl nagy: egy PIC18F452-es kontrollerrel (32 kByte flash, 1,5 kByte RAM) bőségesen megoldható az Ethernet, ha nem túl összetett az alkalmazás, amit hálózatra kötünk. Ha azonban komplett hálózati alkalmazást fejlesztünk C-ben, akkor érdemes PIC18F6720-szal kezdeni (128 kByte flash, 3,5 kByte RAM). A webszerver kódja és memóriaigénye is kicsi, egyetlen korlátozó tényező a háttértár. Flash-ben vagy soros EEPROM-ban tárolhatjuk a page-et, ez utóbbinál ftp-vel tölthetjük fel az anyagot. Lehetőség van CGI scriptek futtatására is! Sajnos azok a PIC-ek, amikben 128 kByte flash van, nem mennek 40 Mhz-en, csak 25-ön. Van még mit fejlesztenie a Microchipnek... Némi szoftveres munkával kiválthatjuk a PIC programozó hardvert is: mivel ezek a kontrollerek önprogramozóak, ezért megtehetjük, hogy Etherneten keresztül töltünk le szoftverfrissítést!
Ha újra az alapoktól kezdve kellene Ethernetet építenem kontrollerből, valószínűleg nem PIC-kel tenném. Zavaró, hogy a PIC processzora lassú és elavult, a fejlesztőrendszere (Mplab) egészen gyakran produkál vicces hibákat, a hardveres debugger (ICD2) csak egy töréspontot támogat, meglepően lassan dolgozik, és a drivere is bugos (kilépek, belépek, kihúzom, bedugom, és már működik is).
Atmel Atmega 128 alapokra épül az Ethernut projekt, szabadon letölthető a kapcsolás és a real time operációs rendszer forráskódja is.
(http://www.ethernut.de)
Magáról a kontrollerről annyit, hogy gyorsabb, fejlettebb és olcsóbb, mint a PIC-es megfelelői. Neten sokféle megoldással találkozhatunk, például van abszolút minimálmegoldás is: az Ethernetet egy régi, ISA-s hálókártya képviseli, a kontroller lábait pedig közvetlenül kötik a csatlakozósorra :).
Remélhetőleg a fentiekkel sikerült meghoznom a kedvet a barkácsoláshoz, ha valakinek konkrét kérdése van a témában, mail-ben elérhet!
bereg@impulzus.com