Tere! Olen mikrokontroller
See leht näitab kontrolleri viigu olekut
VIIDE
ON
Hoolimata hulgast protokollidest mida on vaja veebilehe edastamiseks on seda Ethernet liidese olemasolul võimalik teha ka mikrokontrolleriga, sest kõik teised protokollid on realiseeritavad tarkvaras. Kasutades mikrokontrollerit veebiserverina on võimalik oma veebibrauserist muuta kontrolleri väljundeid või lugeda sisendite olekut.
===== Praktika =====
Robootika Kodulabori arvutivõrguga ühendamiseks on Kodulabor II kontrolleriplaadil RJ45 standardile vastav ühenduspesa ja Kodulabor III eraldi Etherneti moodul, mida juhib Etherneti kontroller ENC28J60. ENC28J60 ühendub mikrokontrolleriga SPI liidese kaudu. Kiibi maksimaalne ühenduskiirus on 10 Mbps.
ENC28J60 vastab kõigile IEEE 802.3 poolt kehtestatud nõuetele ja sisaldab mitmeid pakettide filtreerimise võimalusi, sisenevate ja väljuvate pakettide jaoks omaette puhvrit ja MAC (inglise keeles //Medium Access Control//) ja PHY (inglise keeles //Physical Layer//) kihte. Tänu sellele tehakse keerukas Etherneti kaadrite töötlus nagu näiteks aadressi- ja veakontrolli lisamine lõppkasutaja eest automaatselt ära.
[{{:et:examples:communication:ethernet_enc_skeem.png?580|Tüüpilise ENC28J60-põhise liidese skeem}}]
~~CL~~
Etherneti kasutamiseks on Kodulabori teegis järgmised funktsioonid:
// Etherneti kontrolleri algseadistus koos MAC ja IP aadressidega
void ethernet_init(uint8_t *mac, uint8_t *ip)
{
// ENC28J60 seadistamine
enc28j60Init(mac);
// Vaikimisi clkout 6,25 MHz muutmine 12,5 MHz
enc28j60clkout(2);
hw_delay_ms(12);
// Magjack LED-ide seadistamine (vaata enc28j60 andmelehte, lehekülg 11)
// LEDB = kollane, LEDA = roheline
// 0x476 on PHLCON LEDA = ühenduse staatus, LEDB = vastuvõtmine või edastamine
enc28j60PhyWrite(PHLCON,0x476);
hw_delay_ms(12); // 12ms
// Etherneti/IP kihtide seadistamine
init_ip_arp_udp_tcp(mac,ip,MYWWWPORT);
}
// Võrgu kuulamine (kuni saab endale mõeldud ja andmeid sisaldava andmepaketi)
uint16_t ethernet_get_packet (uint16_t maxlen, uint8_t* packet)
{
return(enc28j60PacketReceive(maxlen, packet));
}
// HTML-koodi kontrolleri programmimälust TCP saatmise puhvrisse laadimine
uint16_t ethernet_load_data (uint8_t *buf,uint16_t pos, const prog_char *progmem_s)
{
return(fill_tcp_data_p(buf,pos, progmem_s));
}
// Veebilehe kuvamine vastavalt valmislaetud HTML-koodile
void ethernet_print_webpage (uint8_t *buf,uint16_t dlen)
{
return(www_server_reply(buf,dlen));
}
// Vastuvõetud andmepaketist URL-i tuvastamine ja pingile vastamine
uint16_t ethernet_analyse_packet(uint8_t *buf,uint16_t plen)
{
return(packetloop_icmp_tcp(buf,plen));
}
Etherneti kontrolleri kasutamiseks tuleb kõigepealt välja kutsuda funktsioon //ethernet_init//, mis seadistab Etherneti kontrolleri. Parameetrina tuleb ette anda MAC ja IP aadress. Peale seda, kasutades funktsiooni //ethernet_get_packet// saadakse kätte varem seadistatud IP aadressile saabunud paketid. Kui pakett on saabunud, tagastab selle pikkuse baitides, vastasel juhul tagastab 0. Funktsioon //ethernet_analyse_packet// analüüsib, kas vastuvõetud andmepakett sisaldab URL-i kohta andmeid. Vajadusel vastab ka pingile ja tagastab URL-i esimese tähemärgi aadressi, kui URL on tühi, siis tagastab nulli. Funktsiooni kasutusotstarve on edasise töötlemise eesmärgil URL-i eraldamine muust infost. Funktsioone //ethernet_get_packet// ja //ethernet_analyse_packet// on soovitav välja kutsuda programmi tsükli lõpus.
Veebileht laetakse funktsiooniga //ethernet_load_data//. Funktsioon laeb HTML-koodi kontrolleri programmimälust TCP saatmise puhvrisse. Funktsioon tagastab andmejada lõpu aadressi, mida saab sisestada parameetrina järgmise HTML-koodi laadimiseks. Lõpuks kuvatakse varem TCP puhvrisse laetud veebileht funktsiooniga //ethernet_print_webpage//.
Näide on mõeldud lihtsa veebiserveri loomiseks. Allpool toodud näiteprogramm loob IP aadressile 192.168.1.100 veebilehe, millel oleva lingi kaudu on võimalik lülitada sisse ja välja Kontrollermoodulil olevat LED-i. Selleks töödeldakse URL-is olevat informatsiooni, mis on eelnevalt salvestatud muutujasse //gPlen//. Otsitakse sealt LED-i olekut määravat tunnust "/1" või "/0". Veebilehe HTML kood asub eraldiseisvas funktsioonis //ethernet_load_webpage// kus see on PSTR makroga salvestatud kontrolleri programmimälusse.
// Kodulabori Etherneti kasutamise näidisprogramm
// Kodulabor III ühendused: CS - PE0, SCK - PE1, MISO - PE2, MOSI - PE3
#include
#include
#include
// Veebilehe koostamise funktsioon
uint16_t ethernet_load_webpage(uint8_t on_off);
// MAC ja IP peavad olema kohtvõrgus olema unikaalsed
// Antud näites olev MAC on juhuslik (üldjuhul see ka sobib)
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
// IP vastavalt kohtvõrgule (viimane number valida ise)
static uint8_t myip[4] = {192,168,1,100};
// Andmejada pikkus
static uint16_t gPlen;
// Andmete puhvri suurus
#define BUFFER_SIZE 600
static uint8_t buf[BUFFER_SIZE+1];
// Põhiprogramm
int main(void)
{
uint16_t pktlen;
char *str;
// Kontrollerplaadil oleva LED-i väljundiks määramine
pin_setup_output(LED0);
// Etherneti algväärtustamine vastavalt etteantud aadressidele
ethernet_init(mymac, myip);
// Lõputu tsükkel
while (1)
{
// Pakettide muutmine, kuni endale määratud andmetega paketi saamiseni
pktlen=ethernet_get_packet(BUFFER_SIZE, buf);
// Paketi eeltöötluse tegemine ja "ping" paketile vastamine
// Paketi URL-i tagastamine
gPlen=ethernet_analyse_packet(buf,pktlen);
// URL-is oleva info analüüsimine
if (gPlen!=0)
{
// URL-i aadressiosa viida "str" laadimine
// URL-is on neli esimest kohta IP aadressi numbrid
str = (char *)&(buf[gPlen+4]);
// URL-ist stringi "/1" laadimine
if (strncmp("/1",str,2)==0)
{
// Veebilehe laadimine
gPlen = ethernet_load_webpage(0);
led_on(LED0);
}
// URL-ist stringi "/0" otsimine
else if (strncmp("/0",str,2)==0)
{
// Veebilehe laadimine
gPlen = ethernet_load_webpage(1);
led_off(LED0);
}
// Muul juhul veebilehe laadimine vastavalt LED olekule
else
gPlen=ethernet_load_webpage(pin_get_value(LED1));
// Varem valmis laetud veebilehe kuvamine
ethernet_print_webpage (buf,gPlen);
}
}
}
// Funktsioon veebilehe kuvamiseks, kirjutades andmed TCP saatmise puhvrisse
uint16_t ethernet_load_webpage(uint8_t on_off)
{
uint16_t plen=0;
// Veebilehe päise laadimine
plen=ethernet_load_data(buf,0,
PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
plen=ethernet_load_data(buf,plen,PSTR("Homelab PB7 LED: "));
// Kui LED ei põle
if (on_off)
plen=ethernet_load_data(buf,plen,PSTR(" OFF"));
// Kui LED põleb
else
plen=ethernet_load_data(buf,plen,PSTR(" ON"));
// "Refresh" nupu laadimine
plen=ethernet_load_data(buf,plen,
PSTR(" [refresh status]
\n"));
else
plen=ethernet_load_data(buf,plen,PSTR("/0\">Switch off
"));
// Andmete lõpu aadressi väljastamine puhvrist
return(plen);
}