(http://www.cncdesigner.com/wordpress/wp-content/uploads/IOT_STM32F103C8-KIT1.png)
Keil proje dosyaları (https://github.com/Bunalmis/ENC28J60---STM32F103C8)
(Paket kaybı ile ilgilenmez. İnternet ortamında test edilmedi)
/****************************************************************************
WebInit fonksiyonu STM32F103C8 ve ENC28J60 cipinin init islemlerini yapar
WebStart fonksiyonu Server yazilimini baslatir
AddString fonksiyonu verilen stringi hedef rama yazar ve son adresi dondurur
PageLoad fonksiyonu hazirladiginiz web sayfasinini yayinlar ve ziyaretci sayisini okur
WebPage fonksiyonu icine kendi kodlarimizi yaziyoruz
Dikkat: Yayinladiginiz MyWeb alani (array'i) ustunde yapacaginiz her degisiklik aninda
yayinlanan sayfada da degisime neden olur. Sayfayi bir kez hazirlayip bir daha
degistirmeyecekseniz tek MyWeb gibi bir array ile calisabilirsiniz.
Dinamik sayfa uygulamasi yapacaksaniz iki ayri MyWeb arayi ile calismalisiniz
Dikkat: Sayfa hazirlamadan ziyaret sayacini okumamalisiniz
Devre semasi ve aciklamalar icin : w w w .cncdesigner.com/wordpress/?p=6424
****************************************************************************/
#include "stdio.h"
#include "Web.h"
char MyWeb1[1460]; // MYyWeb1 degistiriken MyWeb2'i yayinla
char MyWeb2[1460]; // MYyWeb2 degistiriken MyWeb1'i yayinla
char MyMAC [6]={0x77,0x77,0x77,0x77,0x77,0x77};
char MyIP [4]={95,0,177,1}; // ipconfig ile ogreneceksiniz ya da modemden ayirdiginiz IP
void SystemInit()
{
WebInit(MyMAC, MyIP); // Donanimi ayarla
}
int main()
{
WebStart(); // Serveri calistir
}
void WebPage()
{
char* index;
char dinamik[50];
int ziyaret=1;
int TextSize=1;
while(1)
{
index= AddString(MyWeb1,&StartHtml);
index= AddString(index, (char*) "<H1>STM32F103C8 - ENC28J60</H1>");
sprintf(dinamik,"<H%d>Text Size=%d</H%d>",TextSize,TextSize,TextSize);
index=AddString(index, dinamik);
if (++TextSize>6) TextSize=1;
sprintf(dinamik,"<H4>Ziyaretci: %d </H4>",ziyaret);
index=AddString(index, dinamik);
index=AddString(index,&Ver);
*index=0; // Sayfanin sonuna null karakteri ekler
ziyaret=PageLoad(MyWeb1); // MyWeb1 alani gosterilecek
// Su anda MyWeb1 yayinda. MyWeb1 uzerindeki html kodlari bozarsak sayfa da bozulur
// Radikal degisiklikleri MyWeb2 uzerinde yapalim
index= AddString(MyWeb2,&StartHtml);
index= AddString(index, (char*) "<H1>Merhaba, Picproje uyeleri</H1>");
index=AddString(index,&Ver);
sprintf(dinamik,"<H2>Ziyaretci: %d </H2>",ziyaret);
index=AddString(index, dinamik);
sprintf(dinamik,"<H%d>Text Size=%d</H%d>",TextSize,TextSize,TextSize);
index=AddString(index, dinamik);
if (++TextSize>6) TextSize=1;
*index=0; // Sayfanin sonuna null karakteri ekler
ziyaret=PageLoad(MyWeb2); // MyWeb2 alani yayinda
// Su anda MyWeb2 gosterimde. Artik MyWeb1 uzerinde oynayabilirsiniz.
}
}
@gerbay hocam bak bende C ile kodlamaya başladım. Bu ne rahatlıkmış yahu.
Pinler, SPI kanalı bile değiştirilemiyor hocam
gelen buruk dönmesin,
buyrun komple açık kaynak demo program,
keilin eski versiyonuna göredir mdk legacy yüklemeniz gerekmektedir.
http://www.mediafire.com/file/33fcxfm16qfldzu/STM32_ENC28J60_DEMO.rar (http://www.mediafire.com/file/33fcxfm16qfldzu/STM32_ENC28J60_DEMO.rar)
Z peki bundan sonra kodu gelistirecekmisin. Aynı anda birden fazla cihaz bağlanı kurarsa ne olacak. Beni en çok meraklandıran yer burası.
Evet geliştirmek istiyorum fakat önümde 2 engel var.
1) Birden fazla client ile yazılımı zorlayacak ortamım yok.
2) TCP de gönderdiğim pakete ACK almazsam yada karşı taraf paketi yanlış aldığını bildirse
ne yapacağımı bilmiyorum.
Bu projenin asıl zevki zaten bundan sonraki kodlamada. Şuana kadar yapılan işler işin hikaye kısmıydı.
Önce bu sorunları çözmem gerekiyor.
Stress Test uygulamaları var. Ama saniyede binlerce bağlantı yapıyorlar. Bağlantı hızını iyice kısman lazım. Çıktısı biraz çorba gibi olur.
Peki kodlamayı şöyle yapsan. Birinci istemciden ilk bağlantı geldi. Buna geç cevap ver ve beklet. Hemen 2. client ile bağlantıyı kur ve ardından ilk bağlantıya devam et bakalım olacak mı? Böyle bir yapay durum oluşturursan olabilir gibi.
El insaf. ARM CM3 çiplerde bahsediyorum. ST'nin Stellaris serisi içinde öyleydi. Bayağı bir hazır CMSIS fonksiyon vardı.
Aşağıdaki kodlar demo kodlar. Örnek olması için yazıldı.
Sana da bir şey beğendiremiyoruz.
Neyse onu bunu bırak da şimdi ne yapacağız?
Belli bir süre içinde ACK gelmedi ise son gönderdiğim paketi sorgusuz sualsiz tekrar yollayayım mı?
En başında UDP ile işim yok demiştik. Sırf TCP öncesi pratik kazanmak adına UDP'ye bulamıştık.
Hocam sen en iyisi kafamda oluşan bu tip sorulara cevap bulabileceğim kitap önerisinde bulun.
Yanlış olan, sorunu tam anlamadan kod yazmaya başlamam oldu. Kervan yolda düzeliyor fakat çok zaman kaybediyorum.
aradığınız kitap bu hocam buyurun https://www.redbooks.ibm.com/redbooks/pdfs/gg243376.pdf (https://www.redbooks.ibm.com/redbooks/pdfs/gg243376.pdf)
TCP/IP konusundaki sorularınız sayfa 153 te detaylıca basit bir dille anlatılıyor.
Anasını sattığımın Client'i, sana yolladığım dataları almadıysan yada bana yolladığın ACK bana ulaşmadı ise bana ne, bunun derdine ben mi düşeceğim.
!!! Hey sen !!!! O makinenin başında oturan arkadaş !!!!
Explorer da hani refresh butonu var ya ona bir daha bası ver. Diyerek bu projeyi kapatacağım.
Bu pojede web sayfasının max data boyu tek bir IP pakete sığacak boyutta olmak zorunda. IP parçalama işine girmedim. (Bu da demektir ki 1460 Byte dan oluşan bir HTML sayfa olusturabilirsiniz, yani html komutlar dahil yanyana 80 karakter 18 satır)
Türkcell kullandığım modemde port yönlendirmesi yapmadığı için serverimi dış dünyaya açamıyorum. Dolayısı ile projemi gerçek anlamda deneyemiyorum.
Mevcut projede sorun olursa bunları gidereceğim. Eğer allı güllü sayfalar yapmayacaksanız
projenin işinizi göreceğini düşünüyorum.
Evet projeyi (kütüphaneyi) ASM ile geliştirdim. Ancak C konforunu devam ettirdim.
Verdiğim örnek proje tamamen C ile yazılmıştır. C ile kendi eklentilerinizi yapabilirsiniz.
Bu arada GitHub daki dosya yenilendi.
Port yönlendirme imkanına, STM32F103C8 ve ENC28J60 kitine sahip bir arkadaş projeyi deneyip webe açılırsa sayfasını ziyaret etmeyi çok isterim.
Konu içindeki kişisel tartışmalar ve atışmalar konu seyri açısından kaldırıldı. Ortaya çıkan iyi kötü vs her emeğe saygı duymak gerektiğini düşünüyorum.
Bu başlık hakkında üyelerimiz teknik eleştiriler yapılabilir, konuyu gereksiz görülebilir veyahut çağ dışı sayılabilir. Fakat eleştirilerinde ve önerilerinde kibar uslüpları olmalı. Bu her iki üstadım içinde geçerli.
Bu konudaki atışma şeklindeki tartışmayı Genel Sohbette devam ettirebilirsiniz. Forumun esenliği adına bize yardımcı olacağınıza eminim.
Teşekkürler;
@z keil kullanmıyorum. Hex kodunu da yüklersen deneyebilirim.
Bu arada şahsım adına konuyu kirlettiğim için özür dilerim.
mesaj birleştirme:: 12 Ekim 2016, 13:31:57
IP numarasını da 192.168.1.xxx
alt ağ geçidini de 192.168.1.1 olarak ayarlamalısın.
Tamam hex dosya hazırlayıp göndereceğim.
Ancak acelesi yok,
Şu anda biraz allı güllü sayfa hazırlamaya çalışıyorum. 1460 byte ile neler yapılabiliyor onu görmek istiyorum. Bu yüzden hemen yollayamayacağım.
Tamam hocam ben de müsait olduğum en kısa sürede denerim.
Hex dosya linki.
https://github.com/Bunalmis/ENC28J60---STM32F103C8/blob/master/MiniServer.hex (https://github.com/Bunalmis/ENC28J60---STM32F103C8/blob/master/MiniServer.hex)
Server IP: 192.168.1.7
1460 byte ile bu kadar sayfa yapılabiliyor. Tablolar kaldırılırsa bir kaç satır daha fazla sayfa olur.
Text dekorasyonlarından vazgeçilirse mektup bile yazılır.
(http://i.hizliresim.com/znk2yj.png) (http://hizliresim.com/znk2yj)
Alıntı yapılan: z - 12 Ekim 2016, 18:30:30
...
1460 byte ile bu kadar sayfa yapılabiliyor. Tablolar kaldırılırsa bir kaç satır daha fazla sayfa olur.
...
Aslında 1460 byte ile daha çok şey yapılabilir. Tüm iş kullandığınız teknolojiler, biraz text optimizasyonu ve tabiki gzip ile alakalı. :)
Bu arada PendSV_Handler fonksiyonunuzdaki değişken isimleri çok manidar. Aşağı yukarı şöyle bişi.
char *PendSV_Handler_0()
{
char *result; // r0@1
char v5; // r1@2
int v6; // r1@2
int v7; // t1@2
int v8; // [sp+0h] [bp-20h]@2
result = &Fuck_C;
if ( Fuck_C != 1 )
{
__asm { CPSID F }
v5 = Task;
result = (char *)Z_Stack;
Z_Stack[2 * (unsigned __int8)Task] = (int)&v8;
v6 = (v5 + 1) & 1;
Task = v6;
v7 = Z_Stack[2 * v6];
__asm { CPSIE F }
}
return result;
Client'dan servere sayfa içeriğini gönder talebi geliyor. Güzelim asm kodlar sayfayı gönderirken system tick düüüt devre arası, Asm hadi bırak biraz da C MCU ile oynasın diyor.
Asm de ".dittirme ebeni" şu an kritik bir iş yapıyorum eğer şimdi C MCU yu alırsa web sayfasının ..ına kor, C sonra oynasın diyor.
Yazdığım dile karışıyorsunuz yetmedi sıra değişken isimlerime mi geldi?.
Estafirullah ne haddime. Koddaki espri anlayışı hoşuma gittiği için paylaşmak istedim.
Tek sayfaya yüklenmek yerine ana sayfa olsun butonlar olsun. Butona basınca servere istek gelsin ve serverde isteğe özel yeni bir sayfa oluştursun üzerine uğraşmak istiyorum.
Bu durumda ziyaretçiye 1400 byttetan çok daha fazlasını farklı sayfalarda sunabilirim.
Gzip algoritmasını bir şekilde buluruz da bahsettiğim yöntem daha basit olmaz mı?
İyi hatırlattın v6 = (v5 + 1) & 1; burayı v6 = v5 xor 1 yapalım 4 byte daha kazanalım. Kısa günün kârı.
Bakın ben
@gerbay değilim. Yani direkt hazır bilgi vermek adetim değildir. Ama ipucu veriyorum neden gzip' i sizin yazmanız gereksin ki ? Bırakın browser halletsin canım. :) Sizin kod yazmanıza gerek yok. Yani acaba neler HTTP header da -Accept- oluyor. Ayrıca javascript diye bir dil var. Neler yapabildiğine inanamazsınız ! Acaba 1460 bayta javascript ile neler ne tür algoritmalar ve işlevler sığdırılabilir. Hemde gzip de kullanılırsa bunu katlar bile...
Server içinde dinamik sayfa oluşturmuyor muyum? Dinamik bir sayfayı kim zipliyecek?
Ben mi yanlış anladım?
Herşeyde dinamik değilki. Sabit veriler için bir payload hazırlanıp. Dinamik veriler pekala enjekte edilebilir gibi geliyor bana. ;) Mesela browserda bir adamınız olsa ve sizden sadece belli veriler için GET yapsa. Kabaca buna AJAX deniyor.
Yok ben o kadarından anlamam. (Aslını sorarsanız bu projeye bulaşıncaya kadar bunların hiç birinden anlamıyordum)
Client'daki tıklanan buton, radio button, check box vs konumlarını, text boxdan alınan şifre bilgisi okumayı öğrenirsem proje biraz daha anlam kazanacak en azından uzaktan bir evdeki cihazları açıp kapatabilirim.
Html kodlarla da program geliştiriciyi bunaltmak istemiyorum. Oraya da bir kolaylık getireceğim.
Yalnız sizin mantığınızı anlamıyorum. Forumda biz bayağı yardımcı olmaya çalışıyoruz. İp ucu ile geçiştirmiyoruz.
Bir iki kutsalımız dışında her soruya cevap veriyoruz. Hata mı ediyoruz?
Her yiğidin bir yoğurt yiyişi var diyelim. Buna saygı duymak lazım.
Bahsettiğiniz işleri yapabilmeniz için GET ve POST headerları oluşturabilmeniz ve yorumlayabilmeniz gerek. Şunu unutmayın HTTP ve HTML Hypertext üzerine kurulu bir dünya. Yani bolca hafıza ve string işlemi yapmak gerekiyor.
Gene de bu projeye katkılarınız dan dolayı hakkınız ödenmez.
Bahsettiğim soruların cevabını muhtemelen Wireshark ile kendim de deneyerek bulabilirim.
Tahminimce explorer aldığı sayfa bilgilerinden sonra ekranda buton tıklanırsa bana yeni bir paket yollayacak.
Ben de içinde Get arar gibi butonla ilgili bir ipucu arayacağım.
Gene de sağol.
Wireshark' ın yeri ayrı. Firefox için Firebug (https://getfirebug.com/) diye çok faydalı bir eklenti var. Mutlaka inceleyin. Kurun. Sayfaya sağ tıklayıp -Inspect with firebug- deyin. Açılan paneli gezin. Özellikle -Net- sekmesine bir gözatın. İşlerim bitti bana müsade. :) Size kolay gelsin.
Alıntı yapılan: z - 13 Ekim 2016, 02:44:47
Gene de bu projeye katkılarınız dan dolayı hakkınız ödenmez.
Bahsettiğim soruların cevabını muhtemelen Wireshark ile kendim de deneyerek bulabilirim.
Tahminimce explorer aldığı sayfa bilgilerinden sonra ekranda buton tıklanırsa bana yeni bir paket yollayacak.
Ben de içinde Get arar gibi butonla ilgili bir ipucu arayacağım.
Gene de sağol.
Hocam normalde ajax kullanmazsanız sayfanın herhangi bir yerinde değişiklik yapmanız için tüm sayfayı yenilemeniz gerekir.
Ayrıca charles proxy adında bir program var.Bu hhtp işlerinde baya işinize yarar.http paketlerini yakalıp ve durdurup üzerinde değişiklik yapmanıza dahi izin verir.Http için wiresharktan daha çok işinize yarar bence.
Bütün dünya artık ssl bağlantıya geçiyor, let's encrypt gibi çözümler çıkmaya başladı maliyetten kurtulmak için.
eğer bir cihaz çalıştıracağım x işini buna yükleyeceğim diyorsanız güvenlik önlemleride almak gerekiyor.
Bu sebepten 1KB lik veri ile bağlantı işi zor hocam.
HTTP ye girmeden raw veri ile işinizi halletseniz neyse ama http ile bu yapı kısa ömürlü
Anasayfa altına linkler koyarak sayfa sayısını artırdım.
Dolayısı ile bu çok rahatlattı.
http://youtu.be/vEpDRtwMf_I (http://youtu.be/vEpDRtwMf_I)
Bazı şeyler daha konforlu olsu.
Github dosyaları henüz yeni yazılım dosyaları ile değiştirilmedi.
Client'dan gelen sayfa isteği eskiden kütüphane tarafından cevaplanıyordu, C tarafı sadece sayfa bilgilerini yeniliyordu.
Projenin yeni halinde istek doğrudan C tarafına bildiriliyor.
HTML kodlarla link verme, get ve post metodu nasıl kullanılır, radio buton, button, text alanı, şifre degerleri nasıl okunuyor konusunda örnek.
/*
[url=http://www.cncdesigner.com]www.cncdesigner.com[/url]
facebook.com/Cnc-Designer-337826782908966
Dikkat: TexCopy ile yerlestireceginiz datalarin toplam uzunlugu
en fazla 1460 byte olabilir. Program kontrol etmez
Demo program
*/
#include "stm32f10x.h"
#include "Web.h"
#include "stdio.h"
#include "string.h"
unsigned counter=0; // Ziyaretci sayaci
char DestinationMAC [6]; // Paketin geldigi cihazin MAC adresi
char DestinationIP[4]; // IP paketin geldigi cihazin IP nosu
short DestinationPort[2]; // IP paketin gonderen cihazin port nosu
char text[128]; // Dinamik islemler icin yazboz alani
char Cikis=0; // Cihazlari calistirma/durdurma bilgisi
char Giris=0; // Switch bilgileri
unsigned short PortA;
unsigned short PortB;
unsigned short PortC;
short ADC_CH0;
short ADC_CH1;
char MyMAC [6]={0x77,0x77,0x77,0x77,0x77,0x77};
char MyIP [4]={192,168,1,7}; // ipconfig ile ogreneceksiniz ya da modemden ayirdiginiz IP
void AnaSayfa(void);
void Sayfa1(char*, int);
void Sayfa2(char*, int);
void Sayfa3(char*, int);
void Sayfa4(char*, int);
void SystemInit()
{
WebInit(MyMAC, MyIP); // Donanimi ayarla
}
int main()
{
WebStart(); // Serveri calistir
}
/*************************************************************************************
Sayfada Link veren html dizilimi
*************************************************************************************/
void LinkVer(char SayfaNo)
{
sprintf(text,"<a href=~http://%d.%d.%d.%d/%c~>",MyIP[0],MyIP[1],MyIP[2],MyIP[3],SayfaNo); TextCopy(text);
}
/*************************************************************************************
Yeni html sayfaya baslarken html kod dizilisi
*************************************************************************************/
void Baslik()
{
TextCopy((char*) "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
TextCopy((char*) "<div align=~center~>");
TextCopy((char*) "<table border=~0~ width=~620~><tr><td colspan=~4~ align=~center~ height=~50~>");
TextCopy((char*) "<p><font size=~6~ color=~blue~>STM32F103C8-ENC28J60 Web Server</font></p></td></tr>");
// TextCopy((char*) "<tr><td colspan=~4~ align=~center~><img src=~http://www.cncdesigner.com/asm.gif~></td></tr>");
}
/*************************************************************************************
Basligi kapatan b�l�m
*************************************************************************************/
void Bitir(char ver)
{
if (ver)
{
TextCopy((char*)"<tr><td height=~100~colspan=~4~ align=~center~>");
LinkVer(' ');
TextCopy(text);
TextCopy((char*)"<p><font size=~4~ color=~green~>Ana Sayfaya geri d�n</font></p>");
}
TextCopy((char*)"</td></tr></table></div>");
}
/*************************************************************************************
Serverde bulunmayan bir sayfa izlenmek isteniyor
*************************************************************************************/
void SayfaYok()
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p><font size=~4~ color=~red~>Hata 404</font></p></b>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p><font size=~4~ color=~red~>B�yle bir sayfa bulunmamaktadir</font></p></b>");
Bitir(1);
}
/*************************************************************************************
Servera gelen sayfa izleme talebi bu rutine yonlendirilir
Datalar TCP paket icinde gelen verileri saklayan array dir
Len, Datalar alanindaki verilerin byte cinsinden uzunlugudur
Not: Datalar alani siz sayfa hazirlamaya basladiginizda bozulur
*************************************************************************************/
void WebPage(char* Datalar, int len)
{
short SayfaNo;
counter++;
SayfaNo=' ';
if (ThereAre((char*)"GET " )) SayfaNo=Datalar[5]; // Sayfa adlarini tek karakterle olusturun
else if (ThereAre((char*)"POST ")) SayfaNo=Datalar[6]; // Yada bu kismi yeniden kodlayin
switch(SayfaNo)
{
case ' ': AnaSayfa(); break;
case '1': Sayfa1(Datalar, len) ; break;
case '2': Sayfa2(Datalar, len) ; break;
case '3': Sayfa3(Datalar, len) ; break;
case '4': Sayfa4(Datalar, len) ; break;
default: SayfaYok();
}
}
/*************************************************************************************
Ana sayfamiz
*************************************************************************************/
void AnaSayfa()
{
Baslik();
TextCopy((char*)"<tr><td width=~155~ align=~center~>"); LinkVer('1'); TextCopy(text); TextCopy((char*)"<p><font size=~4~ color=~green~>MCU Bilgileri</font></p></td>");
TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('2'); TextCopy(text); TextCopy((char*)"<p><font size=~4~ color=~green~>Cihazlari ac kapat</font></p></td>");
TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('3'); TextCopy(text); TextCopy((char*)"<p><font size=~4~ color=~green~>Sifreli menu</font></p></td>");
TextCopy((char*)"<td width=~155~ align=~center~>"); LinkVer('4'); TextCopy(text); TextCopy((char*)"<p><font size=~4~ color=~green~>Bakim menusu</font></p></td></tr>");
Bitir(0);
}
/*************************************************************************************
1. sayfa
*************************************************************************************/
void Sayfa1(char* Datalar, int len)
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>MCU Bilgileri</font></p></b>");
TextCopy((char*)"<tr><td colspan=~4~ align=~center~><table border=~0~ width=~200~ align=~center~>");
sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO A</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortA);TextCopy(text);
sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO B</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortB);TextCopy(text);
sprintf(text,"<tr><td width=~80~ align=~center~><p>GPIO C</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",PortC);TextCopy(text);
sprintf(text,"<tr><td width=~80~ align=~center~><p>An.Ch1</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",ADC_CH0);TextCopy(text);
sprintf(text,"<tr><td width=~80~ align=~center~><p>An.Ch2</p></td> <td width=~120~ align=~center~><p>0x%04X</p></td></tr>",ADC_CH1);TextCopy(text); TextCopy((char*)"</table></td></tr>");
Bitir(1);
}
/*************************************************************************************
2. sayfa
*************************************************************************************/
void Sayfa2(char* Datalar, int len)
{
if (ThereAre((char*)"A=0")) Cikis=(Cikis & ~0x01);
else if (ThereAre((char*)"A=1")) Cikis=(Cikis | 0x01);
if (ThereAre((char*)"B=0")) Cikis=(Cikis & ~0x02);
else if (ThereAre((char*)"B=1")) Cikis=(Cikis | 0x02);
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Cihazlari acip kapama ve durum ogrenme menusu</font></p></b></td></tr>");
TextCopy((char*) "<form method=~post~>");
TextCopy((char*) "<tr><td width=~200~><b><p>Kombi ");
if (Cikis&0x01) TextCopy((char*) "Calisiyor</p></b></td>");
else TextCopy((char*) "Calismiyor</p></b></td>");
TextCopy((char*) "<td><input type=~radio~; name=~A~; value=~1~> Calistir</td><td><input type=~radio~; name=~A~; value=~0~> Durdur</td></tr>");
TextCopy((char*) "<tr><td><b><p>Kettle ");
if (Cikis&0x02) TextCopy((char*) "Calisiyor</p></b></td>");
else TextCopy((char*) "Calismiyor</p></b></td>");
TextCopy((char*) "<td><input type=~radio~; name=~B~; value=~1~> Calistir</td><td><input type=~radio~; name=~B~; value=~0~> Durdur</td></tr>");
TextCopy((char*) "<tr><td><b><p>Pencere ");
if (Giris&0x01) TextCopy((char*) "Acik</p></b></td></tr>"); else TextCopy((char*) "kapali</p></b></td></tr>");
TextCopy((char*) "<tr><td><b><p>Kapi ");
if (Giris&0x02) TextCopy((char*) "Acik</p></b></td></tr>"); else TextCopy((char*) "kapali</p></b></td></tr>");
TextCopy((char*) "<tr><td><b><p>Kedi ");
if (Giris&0x04) TextCopy((char*) "disari cikti</p></b></td></tr>"); else TextCopy((char*)"i�eri girdi</p></b></td></tr>");
TextCopy((char*) "<tr><td><b><p>Iceride ");
if (Giris&0x08) TextCopy((char*) "birisi var</p></b></td></tr>"); else TextCopy((char*) "kimse yok</p></b></td></tr>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Kombi ve Kettle PA0 ve PA1 pinlerine baglidir</font></p></b></td></tr>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~80~><b><p><input type=~submit~ value=~Gonder~></td></tr>");
Bitir(1);
}
/*************************************************************************************
3. sayfa
*************************************************************************************/
void Sayfa3(char* Datalar, int len)
{
if ((ThereAre((char*)"Z=123456"))&&(ThereAre((char*)"W=Hirsizi+Vur")))
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi</font></p></b>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p>Isteginiz yerine getirildi</p></b></td></tr>");
}
else if ((ThereAre((char*)"Z="))||(ThereAre((char*)"W=")))
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi</font></p></b>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~><b><p>Yetkiniz yok ya da yanlis emir verdiniz</p></b></td></tr>");
}
else
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~ height=~150~><b><p><font size=~4~ color=~black~>Gizli Gorev Sayfasi ( Gorev: Hirsizi Vur Sifre: 123456 )</font></p></b>");
}
TextCopy((char*) "<form method=~post~>");
TextCopy((char*) "<tr><td></td></tr>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><p>Gorev <input type=~text~; name=~W~></p></b></td></tr>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><p>Sifre <input type=~password~; name=~Z~></p></b></td></tr>");
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~50~><b><b><p><input type=~submit~ value=~Gonder~></td></tr>");
TextCopy((char*) "<tr><td></td></tr>");
Bitir(1);
}
/*************************************************************************************
4. sayfa
*************************************************************************************/
void Sayfa4(char* Datalar, int len)
{
Baslik();
TextCopy((char*) "<tr><td colspan=~4~ align=~center~height=~100~><b><p><font size=~4~ color=~black~>Bakim menusu</font></p></b>");
Bitir(1);
}
/*************************************************************************************
Serverdan bagimsiz calisan kullanici kodlari
Mevcut yapida asagidaki yapilandirmalar yapilmistir fakat degistirebilirsiniz
A0..7 Output
B8..B9 ADC
B10..B15 Input
PC15..PC13 Input
A15, B3, B4, B5, B6 pin tanimlarini degistiremezsiniz. (SPI1 reserve)
*************************************************************************************/
void STM32F103()
{
while(1)
{
PortA=GPIOA->IDR&0x0FFFF;
PortB=GPIOB->IDR&0x0FFFF;
PortC=GPIOC->IDR&0x0FFFF;
ADC_CH0= ADC1->JDR1;
ADC_CH1= ADC1->JDR2;
if (!(ADC1->CR2&0x200000)) ADC1->CR2|=0x200000;
GPIOA->BSRR=Cikis&~0x8000; // A15 Sisteme ait (reserve)
GPIOA->BRR=~Cikis&~0x8000; // A15 Sisteme ait (reserve)
Giris=(GPIOB->IDR>>8)&~0x03; // B8 B9 ADC
}
}
Yeni kütüphane ve yeni örnek demo program gene aynı linkten indirilebilir.
Keil proje dosyaları (https://github.com/Bunalmis/ENC28J60---STM32F103C8)
Örnek demo program daha zengin HTML kodlama ile yapıldı.
İstediğiniz kadar web sayfası ekleyebilirsiniz.
8 adet elektrikli cihazı internet üzerinden çalıştırılıp durdurulabilirsiniz.
8 adet switchi internet üzerinden okuyabilirsiniz.
2 adet analog voltajı internet üzerinden okuyabilirsiniz.
PA0..PA7 digital çıkışlar.
PC15, PC14, PC13 ve PB15..PB10 digital girişler.
PB9 ve PB8 Analog giriş.
(Bu yapılandırmayı yada I/O sayısını port çoğullama teknikleri ile değiştirebilirsiniz)
WEB sayfası ve kontroller tamamen C ile kodlanmıştır.
Her bir web sayfasının en fazla 1460 byte olacağı ve bu kontrolün denetiminin sizde olduğunu unutmayın.
(1460 byte'dan daha fazla uzun web sayfası oluşturursanız C değişkenleriniz ezilir ve kod çalışmaz)