# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > گفتگو: چگونگی ارتباط میکرو با pc از روی LAN

## ب- تات

تا به امروز بیشتر در مورد ارتباط میکرو و pc  بیشتر توسط پورت سریال بحث شده اما حالا می خواهیم در مورد ارتباط این 2 وسیله با  پروتکل UDP یا TCP تبادل نظر کنیم . لطفا دوستانی که در این مورد اطلاعات عملی دارن نظرات و راهکارهای خودشون رو اعلام کنند.

----------


## ب- تات

عجب......
یعنی واقعا هیچ کسی تا حالا در این مورد فعالیت یا اطلاعاتی نداره. ؟؟؟؟ بعید میدونم. نکنه سرور فروم down شده که هیچ کسی به این مطلب پاسخ نمیده (البته امیدوارم سرور برنامه نویس 120 سال Up UP باشه.)

----------


## farzadsw

خودم به صورت عملي كار نكردم ، ولي اگه شما ميخوايد كار كنيد ، ميتونيد از ENC28J60 استفاده كنيد .
با پروتكل spi به هر ميكرويي وصل ميشه . اطلاعات بيشترش رو ميتونيد از ديتاشيتش پيدا كنيد.

----------


## Mehran.GH

ببین دوست من ,   ابزارها و کد های زیادی برای ارتباط از طریق TCP  وجود دارد اما بعضی مفاهیم پایه ای هست که باید حتما بدانید تا دید طراحی داشته باشید یعنی اگر پروژه ای دارید و می خواهید از شبکه Lan  اطلاعاتی را منتقل کنید با دانستن این مفاهیم پایه ای می توانید انتخاب مناسب را انجام دهید.

یک مفهوم پایه ای موضوع Stack یا همان  پشته است.  

 بر اساس استاندار ISO/OSI   یک تعریف مشخصی برای ارتباط در شبکه وجود دارد که تولید کنندگان سخت افزار و برنامه نویسان بر آن اساس کار می کند و در صورتی که بخواهید کدهای آماده را استفاده کنید و کد را بفهمید باید بدانید چه اتفاقی پشت صحنه می افتد.

stack  به زبان ساده همان چیزی است که در دروس دانشگاهی هم در معماری کامپوتر و یا دروس مشابه وجود دارد و در حقیقت قرار دادن و برداشتن اطلاعات به صورتی ترتیبی یا POP  , PUSH  است

چرا این روش؟

علت استفاده از این ایده این است که مثلا در لایه یک که لایه فیزیکی است شما ممکن است یک خط تلفن داشته باشید یا یک ISDL   یا یک شبکه LAN    فرقی نمی کند اینجا یک تولید کنند سخت افزار یک ارتباط فیزیکی را برقرار می کند و یک درایور یا DLL  یا هرچی هم همراهش می دهد و مهم این است که این لایه سخت افزاری دیتا را به یک لایه بالاتر منتقل کند و یا از همان لایه بالاتر بگیرد و از کابل یا بی سیم یا شبکه موبایل یا هرچی به طرف دیگربفرستد.

در این حالت تهیه کننده نرم افزار دیگر لازم نیست غصه بخورد که با آمدن روشهای جدید باید کل سیستم عامل را مثلا از اول بنویسد بلکه می داند چیزی که می تواند انتظار داشته باشد یک استک است که دیتا را به ترتیب می تواند از آن بخواند.

بعد یک لایه بالاتر از سخت افزار می آییم که IP  پروتکل است و بعد لایه سوم TCP  که در مجموع TCP/IP  نامیده می شوند و .....






حالا در مورد ارتباط بین میکرو و Pc  یا ارتباط بین میکرو با میکرو 

کاری که باید انجام شود نوشتن نرم افزار در میکرو است که  این ساختار stack  را تحقق بخشد که البته همانطور که در ابتدا نوشتم این کار انجام شده اما به دلایلی که توضیح می دهم باید آگاهانه انتخاب شود.

مساله اصلی بحث منابعی است که در یک میکرو قابل استفاده است یعنی قدرت پردازنده , حافظه بحث اینتراپتها و ....   وقتی شما بخواهید از یک میکرو کوچک برای ارتباط از طریق شبکه استفاده کنید عملا تمامی قدرت پردازنده را مشغول این کار می کنید و در محیط صنعتی قابل اطمینان نیست. 

البته یک راه حل این است که از چیپهایی که در بازار هست و از یک طرف کابل شبکه را متصل می کنید و از طرف دیگر از روش ارتباط سریال به میکرو وصل می شود و تمامی بار برقراری ارتباط بر دوش این چیپ است که در حقیقت خودش یک میکرو برای این منظور است که این روش هم مزایا و معایب خود را دارد و در یک طراحی باید بسته به پروژه راجع بهش بررسی کرد.

نکته مهم که بنظرم در طراحی روشهای ارتباطی در ایران دقت نمی شود موضوع مهم هرم انتقال داده در محیط صنعتی است که شکل آن را می بینید



در یک محیط صنعتی واقعی پایینترین لایه که همان سنسورها و ... هستند برای ارتباط از روشهایی همانند روش 4 و 20 میلی آمپر و RS485   و... استفاده می کنند که توانایی تحمل نویز و شرایط محیطی را داشته باشند 

یک لایه بالاتر PLC  ها یا مثلا میکرو کنترلراست که از روشهای  Asi-Bus    Devicenet   SDS   یا در خودرو سازی و صنایع هوایی CanBus  و ...  استفاده می شود و یا برای کاربردهای ساده LinBus

یک لایه بالاتر که PlC  باید اطلاعات را به یک PC  صنعتی مثلا در یک واحد پالایشگاه بفرستد که Filedbus  ,  Profibus    LON  و  ..... 

یک لایه بالاتر که دیتا مثلا از هر کدام از واحدهای پالایشگاه باید به سرور مرکزی انتقال داده شود که در این روش Ethernet   یا همان TCP  به کار می رود .

البته بدیهی است که مثلا ممکن است همان لایه دوم یعنی میکروها را با TCP به هم متصل کنید و کار هم بکند اما روش طراحی مناسب نیست یک دلیل اینکه Ethernet  برای انتقال داده در این بخش که دیتای کم حجم اما پرتعداد باید منتقل شود کارایی لازم را ندارد

و یا برای ارتباط بین Pc  واحدها به سرور اصلی بیاییم از ارتباط سریال استفاه کنیم!!

خلاصه اینکه این داستان طولانی است و ده ها مورد مثال می توانم برایتان بزنم از اشتباهاتی که در صنعت انجام شده در انتخاب نا مناسب روش ارتباطی که به ضرر و خسارت منجر شده.

بنابراین پیشنهاد می کنم همیشه یک دید طراحی از بالا داشته باشید High Level Design  و بعد ابزار را انتخاب کنید.

در آخر هم بگم که بدلیل اینکه در محیطهای صنعتی مرتب حجم اطلاعاتی که باید در لایه های پایینی منتقل شود زیاد می شود اخیرا روشی در حال اجرایی شدن است با نام Real-Time Ethernet    البته ایده جدید نیست اما تا حالا نیازی به اجرایی شدنش نبوده  
 اگر مایل بودی روی یک موضوع درست حسابی! کار کنی این موضوع را پیشنهاد می کنم . یک Real-Time Ethernet  را روی لینوکس پیاده سازی کنی جالب خواهد بود.

----------


## ب- تات

یک سری به این لینک بزنید. من یکی از محصولاتش به نام EM100 رو خریداری کردم و توسط اون نتایج جالبی گرفتم که در صورت تمایل عرض میکنم.

http://tibbo.com/products

----------


## Mehran.GH

البته انتخاب ابزار به پروژه خودت بستگی داره فقط چند نکته پیشنهادی اینکه :

اینطور که در داکیومنت نوشته شده  این چیپ را با  ارتباط سریال می تونی به میکرو اتصال بدهی که چون خود اترنت  هم اصولا  یک نوع سیستم بافری برای انتقال داده ها دارد و پورت سریال هم یک نوع سیستم بافری دارد نتیجه این است که کل روش کند است و فقط  برای بعضی موارد خاص که سرعت برایت مهم نباشد می تواند جواب بدهد .

مثلا وضعیت خاموش روشن بودن رله و از این کارها  ولی  اگر پردازش داشته باشی یا پارامترهای کنترلری  بخواهی بفرستی یا کد کردن و این جور کارها به نظرم مناسب نباشد . 

من پیشنهاد می کنم تا جایی که در طراحی پروژه برایت مقدور بود گلوگاه در انتقال داده ایجاد نکنی و مثلا به جای ارتباط سریال عادی از SPI  استفاده کنی یعنی  چیپی که دوستمون farzadsw  معرفی کرد ENC28J60  

این چیپ با کمک روش ارتباط SPI  تا کلاک Mhz  20  می توانی تعریف کنی و از طرف شبکه  هم یک کارهایی مثل Multicast address  و   Group destination addresses   و   Packet Filtering   دارد  که البته شاید این EM100  هم داشته باشد من دقیق  مشخصاتش را ندیدم   اما ENC28J60  ظاهرا کارایی بیشتری دارد . 

البته اگر فقط همان وضعیت رله را بخواهی انتقال دهی که همان EM100  باید کافی باشد.

اینها هم لینکهای  پروژه های کامل انجام شده در این مورد که شاید بدرد خورد :

http://www.roland-riegel.de/mega-eth/
http://www.harbaum.org/till/spi2cf/index.shtml
http://www.sics.se/~adam/uip/index.php/Main_Page
http://www.cesko.host.sk/IgorPlugUDP...AVR%29_eng.htm

تجربه خودت را هم حتما اینجا بنویس اگر این چیپ را استفاده کردی چه مزایایی داشت و اگر نکردی  به چه دلیل بوده و چه معایبی به نظرت داشته    تا برای کسانی که در آینده می خواهند همین ابزار را استفاده کنند مفید باشد .

----------


## aliila

اون آي سي هاي  كه تو بالا مطرح شد  كلا فاتحه براشون بخونين  حالا ميكرو 32 بيتي  arm   ارزون ترينش مال شركت اتمل سري  arm7x به قيمت 8 تومن چند ده مورد امكان ارتباط داره كه يكيش lan است و لينوكس روش نصب ميشه و با C++‎ برنامه براش مي نويسن

----------


## farzadsw

> اون آي سي هاي  كه تو بالا مطرح شد  كلا فاتحه براشون بخونين  حالا ميكرو 32 بيتي  arm   ارزون ترينش مال شركت اتمل سري  arm7x به قيمت 8 تومن چند ده مورد امكان ارتباط داره كه يكيش lan است و لينوكس روش نصب ميشه و با C++‎‎ برنامه براش مي نويسن


اینطوری که شما میگید نیست .
at91sam7x لایه ی فیزیکی شبکه رو نداره ، بنابراین به یه ic دیگه برای لایه فیزیکی نیاز هست .
روی هسته arm7 نمیشه لینوکس نصب کرد (mmu نداره) . arm9 و بالاتر ازاون این قابلیت رو دارن.

البته در کل امکاناتی که میکرو کنترلر های arm دارن ، نسبت به قیمتشون خیلی عالیه اما از طرفی کار باهاشون ساده نیست و برای افراد مبتدی مناسب نیستن . بنابراین وقتی سادگی و سرعت توسعه نرم افزار در درجه اول باشه (نمونه بارزش پروژه های دانشجویی )  میکروهای avr هنوز هم بیشترین استفاده رو دارن.

----------

