Mikroserwer PIC18F67J60

Mikroserwer bazujący na mikrokontrolerze PIC18F67J60.

Układ PIC18F67J60 to mikrokontroler 8-bitowy z dużą ilością wbudowanej pamięci FLASH (128 kB) i zintegrowanym kontrolerem Ethernet i PHY analogicznym do popularniejszego "dostępnego luzem" ENC28J60.

Skuszony prostotą jednoukładowego mikroserwera wykonałem jego eksperymentalną wersję na niewielkiej jednostronnej płytce drukowanej z kawałkiem przestrzeni przypominającej płytkę uniwersalną.

Pierwszym oprogramowaniem które wypróbowałem był stos TCP/IP Microchipa zmodyfikowany przez Jorge'a Amodio. Ponieważ na płytce nie umieściłem pamięci EEPROM na system plików dla serwera www makro MPFS_USE_EEPROM powinno zostać wyłączone a pliki umieszczone w wewnętrznej pamięci FLASH (szczegółowy opis na ww. stronie w rozdziale "Building the code image").

Dodatkowy link (wygląda na to, strona ljcv.net jest w przebudowie): http://www.ljcv.net/library/en/en002b.pdf.

Schemat elektryczny mikroserwera PIC18F67J60 (pdf)
2010.05.05: Zwiększone pojemności przy pinie VCAP, datasheet zaleca min. 1uF, typ. 10uF (sumarycznie). Na schemacie PCB pozostawione zostały obudowy 0805, łatwiejsze może być znalezienie kondensatorów 1..10uF w obudowie 1206 (nawet jako wyluty ze starej płyty głównej PC).
Schemat elektryczny + PCB (Eagle Light)
Biblioteka Eagle (5.0) z transformatorem Pulse H1102
Transformator Pulse H1102
Inne sugerowane transformatory

Do zaprogramowania mikrokontrolera niezbędny jest programator pickit 2, ICD2 lub podobny. Układ nie jest obsługiwany przez proste programatory pracujące na porcie szeregowym (JDM, COM84).

Zaskakujące cechy:

Układ pracuje obecnie jako "termometr" mierząc temperaturę, wilgotność i ciśnienie powietrza. Spakowane źródła projektu (MPLAB 8.14 + C18): MCHPTCP_v3.75.6.7z. Ponieważ MPLAB korzysta z bezwzględnych ścieżek do narzędzi przy otwarciu projektu konieczne będzie prawdopodobnie potwierdzenie zmiany ścieżek kompilatora C18.
Dane pomiarowe udostępniane są na żądanie przy połączeniu z serwerem tcp na porcie 7777 oraz cyklicznie składowane są w bazie danych za pośrednictwem protokołu http. Źródła klienta http zawarte są w pliku tcp_client_ex1.c. Wymagana jest docelowego hosta (some_host.com) i wywoływanego pliku (hidden.php):

BYTE ServerName[] = "www.some_host.com";
WORD ServerPort = 80;

BYTE httpPost1[] = 	"POST /hidden.php HTTP/1.0\r\n"\
    "Host: some_host.com\r\n"
    "Content-type: application/x-www-form-urlencoded\r\n"
    "Content-length: ";  
  

Przykładowy plik php interpretujący dane i zapisujący do bazy:

<?php
$string=$_POST['s'];
connect_to_database();  // replace with your code
$n = sscanf($string,
  "Temp: %fC  RH: %d%%  %dhPa", $temperature, $humidity, $pressure);
$result = mysql_query("insert into logi_temp (temp,czas)
  values('$temperature',NOW())",$db);
if (result)
	$result = mysql_query("insert into logi_rh (rh,czas)
    values('$humidity',NOW())",$db);
if (result)
	$result = mysql_query("insert into logi_pressure (pressure,czas)
    values('$pressure',NOW())",$db);
?>  
  

Skrypt php przetestować można używając narzędzia curl:

  curl --data-urlencode "s=Temp: -3.4C  RH: 81%  1021hPa" www.tomeko.net/hidden.php
  

Kod mikroserwera nie zawiera w tym momencie funkcji urlencode (lenistwo) generując zapytanie które jest niepoprawnie sformułowane i może nie być akceptowane przez wszystkie serwery HTTP, jest to odpowiednik testu:

  curl -d "s=Temp: -3.4C  RH: 81%  1021hPa" www.tomeko.net/hidden.php  
  

Dla bezpieczeństwa wskazane jest dodanie funkcji urlencode lub sformułowanie zapytania w taki sposób any nie wymagało kodowania.

Uaktualnienie: wskazana jest modyfikacja źródeł, podstawienie innego (i unikalnego w skali projektu) numeru portu źródłowego niż zerowy w pliku dns.c, MySocket = UDPOpen(0, &Remote, DNS_PORT);. Pozostawienie wartości zerowej skutkuje losowym niedziałaniem klienta DSN (brak odpowiedzi z serwera).

microserver_PIC18F67J60_top.jpg microserver_PIC18F67J60_bottom.jpg

 "Cookie monsters": 3040811    Parse time: 0.001 s