# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > AVR >  نحوه كار با I2C در avr

## ب- تات

سوال در مورد كار با i2c در ارتباط چند مبكروكنترلر avr مي باشد.
ميشه لطفا راهنمائي كنيد منظور از آدرس دهي slave در i2c چي هست؟
واضح تر بگم master , slave به چه صورت بايد آدرس بگيرند تا بشه با دستورات I2csend , i2crecieve به اونها ديتا فرستاد؟

----------


## Mehran.GH

برای اینکه  چند میکرو را با هم از طریق I2c  ارتباط دهید نیاز دارید که از روش نرم افزاری یک آدرس برای slave  تعریف کنید  و این روش اصولا  برای  ارتباط بین میکروهای کوچک روش مناسبی نیست. 

علت ؟

به دلایل اینکه در این روش از *یک وقفه خارجی* برای Wakeup  کردن I2c  در Slave  استفاده می شود و نتیجه این است که :

1 - از اینتراپت های دیگر را نمی توانید استفاده کنید چون در صورت استفاده Bit  اول  دیتایی که از Master  آمده یا همان  Startbit  را از دست می دهید.

2- اگر به هر دلیلی در باس I2C  یک خطا اتفاق بیفتد  در همان وقفه می مانید و میکرو هنگ می کند!

3- تا زمانی که I2C-Transver   کامل نشده از وقفه خارج نمی شود و معنی آن این است که در این زمان برنامه اصلی شما معطل خروج ار وقفه می ماند

خلاصه اینکه این روش تمام منابع میکروهای فسقلی! را می بلعد و بهتر است فقط برای ارتباط میکرو با چیپ های دیگر مثل timer  و  eerom  و.... که آدرس این چیپ ها به صورت ترکیب سخت افزار و نرم افزار تعریف می شود استفاده کرد

البته در پردازنده های جدید  I2c به روش  نرم افزاری استفاده می شود اما در این پردازنده ها می توان درایور را برای کرنل لینوکس کامپایل کرد و سیستم MultiTask  است و یک پردازنده 400MHz  Arm9   را با میکروهای  کوچک نمی توان مقایسه کرد.

برگردیم به سوال

در صورتی که خواستید این روش نرم افزاری تعریف Slave را تجربه کنید  , آدرس را  7 بیت و یا 10 بیت دلخواه برای Slave  تعریف می کنید و Master که آدرس نمی خواهد. یک روش هم هست که Multi master  نامیده می شود که پیچیده است و  بعدا می توان راجع به آن صحبت کرد.

برای تعریف و استفاده از slave   نرم افزاری  هم یک کتابخانه به زبان اسمبلی سال 2003 فکر کنم شرکت atmel   بیرون داد برای این منظور که اگر در نت بگردید حتما پیدا می کنید و  یک Application Note   هم در همان سایت atmel   با شماره   AN302   بود که درباره این موضوع software  Slave  Implementation   توضیح کامل داده بود.

----------


## ب- تات

ممنون از پاسختون.
من اين كار را مطابق با مثال هاي موجود در منابع مختلف انجام دادم اما يك اتفاق جالب پيش اومده :
ميكرو مستر به يك آدرس مثل &H40  يك ديتا ميفرسته اما اسليو با وجوديكه فقط براش تعريف شده فقط به آدرس &H41  پاسخ بده باز هم ديتا رو دريافت ميكنه و كاري كه براش تعريف شده رو پشت سرش انجام ميده.
من اينك كار رو با فراهم كردن اسليو هاي ديگه هم تجربه كردم . اما حالا همه اونها هر چند كه آدرسشون با آدرسي كه مستر داره ديتا رو روش سوار ميكنه يكي نيست ، اما همه دريافت ميكنن و كار تعريف شده متناظر با اون ديتا رو انجام ميدن.
در اين زمينه ميشه راهنمائي كنيد. مگه هر اسليو نبايد فقط  ديتا هايي رو كه از طرف مستر با آدرس خودش اومده دريافت كنه و به آدرسهاي ديگه كاري نداشته باشه؟؟؟؟؟!!!!!!

----------


## Mehran.GH

slave  ها باید با آدرس خودشون فعال بشوند چون در غیر اینصورت دیگر باس ندارید.  

بیشتر از این نمی توانم مطلبی بگویم چون  اطلاعاتی که نوشتین برای تشخیص مشکل کافی نیست!

به نظرم یک مشکلی با  ACK  باید باشد .   مقاومت های Pull-Up را که فراموش نکردید؟
Timing  سیگنال ها را کنترل کردید؟  

بهترین راهنما در این موارد همان داکیومنتهای آتمل درباره  I2C است

http://www.atmel.com/dyn/Products/ap...?family_id=607

----------


## ب- تات

> به نظرم یک مشکلی با  ACK  باید باشد .   مقاومت های Pull-Up را که فراموش نکردید؟
> Timing  سیگنال ها را کنترل کردید؟


Pull-Up هم مشكلي نداره اما اين Timing كه ميگيد چي هست؟

ساده بگم : براي slave فرقي نمي كنه Master ديتا رو روي چه آدرسي ميفرسته . در واقع  همه slave ها ديتايي رو كه master فرستاده دريافت ميكنن و ack مي فرستن . انگاري آدرس براشون مهم نيست !!!!!!!!

----------

