سلام
چند وقتی بود میخواستم این بست رو بزنم .
دیدم بحث زیادی رو محور اترنت بوده اما روی enc18j60 خیلی از دوستان مانور داشتن .
راه اندازیش نسبتا سخته و من خودم جواب جالبی ازش نگرفتم و یک مشکل دیگش اینکه برنامش سنگینه رو هر میکرویی نمیشه ریخت و روی میکرویی که ریخته مشیه عملا اون میکرو کار دیگه ای نمیتونه بکنه و باید فقط برای کنترل سیستم اترنت ازش استفاده کرد . من تو تستی هم انجام دادم تو سرعت بالا هنگ داشت( البته ممکنه این از بی سوادیه من بوده باشه )
اما ای سی w5100 با توجه این که بروتکل هارو داخل خودش به صورت سخت افزاری داره کار رو خیلی راحت میکنه و از لحاظ قیمتم زیاد تفاوتی ندارن (مخصوصا که w5100 با AT tiny هم حتی راه میوفته اما enc رو من رو مگا ۳۲ جواب گرفتم اونم نه خوب ! )
رابط ای سی spi هست . مینومید شیلد w5100رو از هر جایی تهیه کنید خود فروشگاهم داره .
ما اینجا راجب ارداینو و برنامه نویسیش حرف نمیزنیم
این یه نمونه از برنامه :
تو این برنامه از هدر w5100.h استفاده شده که تو بست بعدی راجبش کامل توضیح میدم
اما کلیت برنامه :
اول از همه باید گفت ایسی w5100 یه ip میگیره و دارای ۴ تا سوکت هستش هر سوکت میتونه رو یه بورت تنطیم شه و \روتکل مخصوص خودش رو داره و این یعنی این ایسی ۴ تا کانکشن رو هندل میکنه و \روتکل های مختلف. قابلیت این رو هم داره که وسط کار بروتکل و یورتش عوض شه . اما من فعلا رو این هدر این قابلیت رو روش نزاشتم با یه دیفاین و کمی ور رفتن با کد این کار به راحتی قابل انجامه
تو بر نامه بالا اتفاقاتی که افتاده :
۲ تا متغییر تعریف شده data برای دخیره اطلاعات که از شبکه میاد . datam برای دخیره و فرستادن وضعیت ایسی از طریق سریاله . ریست بورت هم خروجی هست که ریست ایسی رو کنترل میکنه
دز خطوط بعدی سریال تنظیم شده . اون صفر یعنی اینترابت سریال خاموشه . بعدش یه وقفه 1 ثانیه . بعد spi تنظیم شده که بعدا راجبش که چجوری تنظیم شده صحبت میکنیم . خط بعد بایه ریست ۱ شده تا ایسی روشن شه و w_c_init ایسی w5100 رو تنظیم اولیه میکنه که بازم یعد راجبش صحبت میکنیم w_c_init مخفف w5100ـcontrolـinit هستش
همون طور که گفتم ایسی یه ip داره اما ۴ تا سوکت (socket 0 -3) که رو هر کدوم توش یه بورت باز میشه تو تابع w_c_init ما ip و subnet و ... رو تنطیم کردیم . حالا میاییم و socket 0 رو راه میندازیم نتظیماتی از قبیل اینکه اینکه سوکت الان رو چه بورتی هست و این که بروتکلش چیه و ...
بعد انجام تنظیمات سوکت 0 میاییم و سوکت رو open میکنیم و بعدش با listen به سوکت گوش میدیم تا ببینیم کسی کانکت میشه یا نه :agree:
بقیه کد تا قسمت while زیاد به کار نمیاد منم راجبش توضیح نمیدم :NO:
اما قسمت while :
این ایسی داخلش دارای رجیستر هست . تابع w_read این ریجیستر هارو میخونه . S0_IR هم نام ریجیستر وقفه مربوط به سوکت 0 هست که نشون میده الان وضعیت سوکت 0 به چه شکله این که کسی بهش وصل شده یا نه و این که دیتا گرفتیم یا دیتامون ارسال شده و غیره . ما این ریجیستر رو میخونیم و دیتاشو میفرستیم با سریال به کامبیوتر (یا هر جا که سریال وصله !) یادتون باشه بعد خوندن هر بیت ریجیستر اونا باید به صورت دستی باک شن با توشتن ۱ داخلشون این کار قابل انجامه
حالا یه چندتا حلقه If تعریف میکنم هر کدوم از این حلقه ها یه کاره خاصی انجام میدن :
حلقه dicoonect :
اگر اطلاعات datam که همون ریجیستر s0_ir هست نشون بده که کانکشن از طرف کامبیوتر یا کلاینت close شده میایم و تابع سوکت ریست رو اجرا میکنیم این کار دوباره سوکت رو ریست و اماده میکنه یعنی دوباره open و listen رو واسش اجرا میکنه .یادتون باشه این ایسی بعد بسته شدن کانکشن از سمت کلاینت خودش دیسکانکت نمیشه و خودمون باید دستی این کارو بکنیم . تو خط بعدشم میاییم و برچمش رو باک میکنیم . به همین راحتی !!!! :biggrin:
حلقه کانکت :
تو این حلقه اتفاقات بررسی میشه که در صورت اتصال شخصی به ای بی ما اتفاق می افته :
این جا اگه یه کلاینت به ای بی ما وصل شه ما بهش یه سلام میدیم !! "HI... "به کلاینت سند میشه بعدش برچمهای مربوط به اتصال و سند باک میشه . یادتون باشه اگه برچمها باک نشن دوباره که بریم تو حلقه while میکرو فکر میکنه بازم کانکشن رخ داده ! و باز سلام میکنه !
حلقه بعدی تایع دریافته :
این جا اتفاقی که میوفته اینکه ما اطلاعاتی میگیریم اونارو داخل data میریم بعدش برچم دریافت رو خاموش و اطلاعات رو با سریال میدیم بش بره :mrgreen: بعدش که کارا انجام شد به کلاینت از طریق اترنت یه ok میدیم که بفهمه حله ! و بعدش چون یه ok دادیم خوب برچم send هم باس باک کنیم دیگه :angry:
تو این برنامه ما اومدیم یه سرور ساختیم که وقتی بهش وصل میشیم hi میده , کد ارسالی رو میگیره با سریال از اونور میده و بعدش ok رو برمیگردونه به کلاینت .
تمام توابع استفاده شده تو این بخش تو w5100.h هست که تو بست بعدی فردا در موردش حرف میزنم الان دستم خسته شد حوصلشم ندارم زیاده :mrgreen: :mrgreen: :mrgreen: :mrgreen:
لینک دانلود :
http://www.mediafire.com/download/nohax5o3qar0rlh/w5100.h
چند وقتی بود میخواستم این بست رو بزنم .
دیدم بحث زیادی رو محور اترنت بوده اما روی enc18j60 خیلی از دوستان مانور داشتن .
راه اندازیش نسبتا سخته و من خودم جواب جالبی ازش نگرفتم و یک مشکل دیگش اینکه برنامش سنگینه رو هر میکرویی نمیشه ریخت و روی میکرویی که ریخته مشیه عملا اون میکرو کار دیگه ای نمیتونه بکنه و باید فقط برای کنترل سیستم اترنت ازش استفاده کرد . من تو تستی هم انجام دادم تو سرعت بالا هنگ داشت( البته ممکنه این از بی سوادیه من بوده باشه )
اما ای سی w5100 با توجه این که بروتکل هارو داخل خودش به صورت سخت افزاری داره کار رو خیلی راحت میکنه و از لحاظ قیمتم زیاد تفاوتی ندارن (مخصوصا که w5100 با AT tiny هم حتی راه میوفته اما enc رو من رو مگا ۳۲ جواب گرفتم اونم نه خوب ! )
رابط ای سی spi هست . مینومید شیلد w5100رو از هر جایی تهیه کنید خود فروشگاهم داره .
ما اینجا راجب ارداینو و برنامه نویسیش حرف نمیزنیم
این یه نمونه از برنامه :
کد:
#include "w5100.h" . . . void main(void) { unsigned char datam; unsigned char data[100]; RESET_PORT=0; usart_init(0,9600); delay_ms(1000); w_spi_init(); RESET_PORT=1; w_c_init(); socket0_init(); socket0_open(); socket0_listen(); datam=W_read(C_MR); putchr(datam); delay_ms(__delay_val); datam=W_read(C_SIPAR); putchr(datam); delay_ms(__delay_val); putstring ("START"); while (1) { datam=W_read(S0_IR); putchr(datam); if ((datam&V_S0_IR_CLOSED)==V_S0_IR_CLOSED) //Disconnect { socket0_reset(); W_write(S0_IR,V_S0_IR_RESET); } else if ((datam&V_S0_IR_CON)==V_S0_IR_CON) //CONNECTION { s0_send("HI..."); W_write(S0_IR,V_S0_IR_CON); //Erase The Flag W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag } else if ((datam&V_S0_IR_RECV)==V_S0_IR_RECV) //DATA RECV { s0_recv(data); //READ DATA W_write(S0_IR,V_S0_IR_RECV); //Erase The Flag putstring(" data="); //SEND " data=" BY USART putstring(data); //SEND data BY USART s0_send("OK"); //SEND BACK "OK" TO SERVER W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag } delay_ms(1000); } }
اما کلیت برنامه :
اول از همه باید گفت ایسی w5100 یه ip میگیره و دارای ۴ تا سوکت هستش هر سوکت میتونه رو یه بورت تنطیم شه و \روتکل مخصوص خودش رو داره و این یعنی این ایسی ۴ تا کانکشن رو هندل میکنه و \روتکل های مختلف. قابلیت این رو هم داره که وسط کار بروتکل و یورتش عوض شه . اما من فعلا رو این هدر این قابلیت رو روش نزاشتم با یه دیفاین و کمی ور رفتن با کد این کار به راحتی قابل انجامه
تو بر نامه بالا اتفاقاتی که افتاده :
۲ تا متغییر تعریف شده data برای دخیره اطلاعات که از شبکه میاد . datam برای دخیره و فرستادن وضعیت ایسی از طریق سریاله . ریست بورت هم خروجی هست که ریست ایسی رو کنترل میکنه
کد:
unsigned char datam; unsigned char data[100]; RESET_PORT=0;
کد:
usart_init(0,9600); delay_ms(1000); w_spi_init(); RESET_PORT=1; w_c_init();
بعد انجام تنظیمات سوکت 0 میاییم و سوکت رو open میکنیم و بعدش با listen به سوکت گوش میدیم تا ببینیم کسی کانکت میشه یا نه :agree:
کد:
socket0_init(); socket0_open(); socket0_listen();
اما قسمت while :
کد:
datam=W_read(S0_IR); putchr(datam); if ((datam&V_S0_IR_CLOSED)==V_S0_IR_CLOSED) //Disconnect { socket0_reset(); W_write(S0_IR,V_S0_IR_RESET); } else if ((datam&V_S0_IR_CON)==V_S0_IR_CON) //CONNECTION { s0_send("HI..."); W_write(S0_IR,V_S0_IR_CON); //Erase The Flag W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag } else if ((datam&V_S0_IR_RECV)==V_S0_IR_RECV) //DATA RECV { s0_recv(data); //READ DATA W_write(S0_IR,V_S0_IR_RECV); //Erase The Flag putstring(" data="); //SEND " data=" BY USART putstring(data); //SEND data BY USART s0_send("OK"); //SEND BACK "OK" TO SERVER W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag } delay_ms(1000);
حالا یه چندتا حلقه If تعریف میکنم هر کدوم از این حلقه ها یه کاره خاصی انجام میدن :
حلقه dicoonect :
کد:
if ((datam&V_S0_IR_CLOSED)==V_S0_IR_CLOSED) //Disconnect { socket0_reset(); W_write(S0_IR,V_S0_IR_RESET); }
حلقه کانکت :
تو این حلقه اتفاقات بررسی میشه که در صورت اتصال شخصی به ای بی ما اتفاق می افته :
کد:
else if ((datam&V_S0_IR_CON)==V_S0_IR_CON) //CONNECTION { s0_send("HI..."); W_write(S0_IR,V_S0_IR_CON); //Erase The Flag W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag }
حلقه بعدی تایع دریافته :
کد:
else if ((datam&V_S0_IR_RECV)==V_S0_IR_RECV) //DATA RECV { s0_recv(data); //READ DATA W_write(S0_IR,V_S0_IR_RECV); //Erase The Flag putstring(" data="); //SEND " data=" BY USART putstring(data); //SEND data BY USART s0_send("OK"); //SEND BACK "OK" TO SERVER W_write(S0_IR,V_S0_IR_SEND_OK); //Erase The Flag }
تو این برنامه ما اومدیم یه سرور ساختیم که وقتی بهش وصل میشیم hi میده , کد ارسالی رو میگیره با سریال از اونور میده و بعدش ok رو برمیگردونه به کلاینت .
تمام توابع استفاده شده تو این بخش تو w5100.h هست که تو بست بعدی فردا در موردش حرف میزنم الان دستم خسته شد حوصلشم ندارم زیاده :mrgreen: :mrgreen: :mrgreen: :mrgreen:
لینک دانلود :
http://www.mediafire.com/download/nohax5o3qar0rlh/w5100.h
دیدگاه