اطلاعیه

Collapse
No announcement yet.

درخواست کمک در مورد ارتباط i2c

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    درخواست کمک در مورد ارتباط i2c

    دوستان سلام.
    دنبال نحوه ارتباط موس با میکرو هستم.جناب FUBA به من در این زمینه کمک کردند منم ازشون واقعا ممنونم،اما هنوز نتونستم جواب بگیرم.
    به من گفتند که باید با پروتکل i2c این کار رو بکنم اما توی همون ارتباط i2c هم سوالاتی برام پیش اومد.کتاب کاهه توضیح خیلی کمی داده.
    یه نمونه برنامه واسه ارتباط بین دو میکرو دانلود کردم که توی برنامه گیرنده یک خط bitwait قبل از i2cstart نوشته بود که اگه برش میداشتی جواب نمیداد.
    حالا لطف کنید یه نمونه برنامه i2c ساده بذارید واسه فهمیدن نحوه عملکردش میخوام.
    اگر هم کسی برنامه ارتباط با موس رو داره(به زبان بیسیک) لطف کنه اونم بذاره با توضیح،ممنون میشم.در ضمن اگر سخت افزار خاصی هم واسه اتصال موس به میکرو نیاز هست بگید.
    :question: :question: :question: :question: :question:

    #2
    پاسخ : درخواست کمک در مورد ارتباط i2c

    فعالان انجمن،کمک کنید لطفا :cry:

    دیدگاه


      #3
      پاسخ : درخواست کمک در مورد ارتباط i2c

      سلام :smile:
      ببین اینا خوبه :nerd::


      http://avrhelp.mcselec.com/index.htm...g_i2cslave.htm

      و

      http://www.qsl.net/p/pa3ckr//bascom%20and%20avr/i2c/

      دیدگاه


        #4
        پاسخ : درخواست کمک در مورد ارتباط i2c

        نوشته اصلی توسط rozeh
        ممنون،خوبه فقط من بیشتر دنبال توضیحات فارسی میگردم که مفهومی توضیح بده نه مثالی،یا اگر مثاله توضیح خط به خط داشته باشه،برنامه هم خیلی ساده باشه که راحت قابل فهم باشه

        دیدگاه


          #5
          پاسخ : درخواست کمک در مورد ارتباط i2c

          سلام ..

          خیلی مدت ها قبل؛ پست زیر رو برای بحث مشابهی نوشته بودم که شاید بتونه کمکتون کنه .. اگر نگارش اون کمی متفاوت با چیزی است که الان دارم مینویسم؛ به این دلیل هست که پست مربوط به حدود چهار سال پیشه .. بعلاوه؛ در انتهای این پست هم فایلی ضمیمه شده که آموزش مختصری در مورد پروتکل I2C هست .. (نکته ی کوتاه: آدرس ایمیلی که در انتهای اون هست؛ ایمیل قدیمی من هست که به دلایلی زیاد چک نمیشه) .. امید که این مطالب بتونن براتون مفید باشن .. موفق و سلامت و شاد باشید ..

          سلام …........

          ببینید همون طور که می دونید برای برقراری ارتباط با معماری I2C و یا ارسال و دریافت دیتا و راه اندازی تراشه های مختلف با این پروتکل، مانند خیلی پروتکل های دیگه، نیاز به دونستن قوانین و اطلاعاتی داریم .. همون طور که در پروتکل SPI برای برقراری ارتباط به 4 خط MOSI ،MISO ، SCK و SS نیاز داریم، یا برای ارتباط سریال به دو خط TX وRX نیاز داریم، در پروتکل I2C هم برای برقرای ارتباط به دو خط SDA وSCL نیاز داریم .. اما نوع پروتکل و ویژگی هایی که داره یه کم با اون دو تای دیگه فرق داره .. احتمالا کم و بیش با این پروتکل آشنایی دارید، اما برای اینکه نمونه ی برنامه ای که در فایل زیر به اون اشاره شده رو خوب متوجه بشید، باید به چند تا نکته خوب توجه کنید .. اول اینکه برای اینکه بتونید یه بر قراری ارتباط خوب داشته باشید، همون طور که در پست های قبلی هم به اون اشاره کردیم، باید از اتصال متقابل دو خط SDA و SCL در دو طرف Master وSlave مطمئن باشیم .. نکته ی دیگه در این مورد اینه که باید دو خط رو با مقاومت های Pull Up با مقاومت 10K به ولتاژ مرجع وصل کنیم .. دوم اینکه باید یه درک درست از Master وSlave داشته باشیم .. عنصر Master عنصریه که در شبکه بندی از طریق پروتکل I2C نقش Handshaking رو بر عهده داره، یعنی به واسطه ی تولید کلاک مناسب روی خط SCL ، باعث کنترل و سنکرون سازی ارسال اطلاعات میشه .. به علاوه؛ این عنصر وظیفه ی کنترل شروع و پایان ارسال اطلاعات و نیز چک کردن آدرس سایر عناصر برای ارسال صحیح دیتا رو بر عهده داره .. عنصرSlave هم عنصریه که با دریافت کلاکی که حاصل تولید Master هست، انتقال اطلاعات رو انجام میده .. یه نکته ی مهم اینکه، در تعریف دو عنصر Master وSlave از یک جهته بودن انتقال دیتا صحبت نکردیم؛ یعنی چی؟ یعنی اینکه عنصری که به عنوان Master (دائمی و یا پیروز در رقابتArbitration ) در شبکه شناخته می شه، با تولید کلاک روی خط SCL ، هم میتونه به ارسال اطلاعات بپردازه و هم به دریافت اطلاعات. در مورد Slave هم وضع به همین ترتیب پیش میره .. سوم اینکه باید بدونیم در زمان ارسال یا دریافت اطلاعات، چه مواردی در پروتکل پیش بینی شده؟ فرض کنید، عنصر Master قصد ارسال اطلاعات رو به عنصر Slave ای با آدرس 0x23 داشته باشه .. خب در ابتدا؛ کاری که انجام میشه اینه که یه وضعیت شروع در شبکه ایجاد میشه، به این معنا که در زمان بالا بودن خط SCL ، روی خط SDA یک گذر از 1 به 0 ایجاد میشه و این آغازیه برای انتقال اطلاعات .. پس از این مرحله، آدرسی که مقصد انتقال اطلاعاته، روی خط قرار میگیره .، پس از دریافت آدرس توسط Slave ، این عنصر با تولید یه پالس ACK تائید آمادگی میکنه و با دریافت این پالس توسط Master ، انتقال اطلاعات با ارسال بیت به بیت اطلاعات (یک بایت کامل) با اولویت MSB آغاز میشه و بعد از دریافت بایت توسط مقصد، Slave یه پالس ACK تولید میکنه (روی خط قرار میده) تا صحت دریافت اطلاعات رو به Master اطلاع بده .. حالا یه سوال پیش میاد که از کجا جهت انتقال مشخص میشه؟ جواب اینه که اگه قالب آدرس دهی 7 بیتی پروتکل رو نگاه کنید، متوجه میشید که کم ارزش ترین بیت (بیت صفرم!) مربوطه به تعیین جهت انتقال و این بیت با هفت بیت آدرس، میشن فریم آدرسی که روی SAD قرار میگیره ..

          اما در مورد تنظیمات این پروتکل در CodeWizard : در شکل زیر گزینه ای رو می بینید که همون دو تا خطی که ما به عنوان خطوط ارتباطی این پروتکل در بالا تعریف کردیم رو مشخص میکنه .. همون طور که میبینید؛ می تونید هر پورتی رو که میخواید برای این ارتباط تعریف کنید .. SDA Bit شماره ی پایه در اون پورتی رو تعیین میکنه که شما تعیین کردید (از بیت صفر تا هفت) و SCL Bit هم شماره ی پایه ای رو تعیین میکنه که به خط SCL اختصاص پیدا میکنه .. انتخاب های بعدی هم به آیسی هایی اختصاص داره که با این پروتکل کار میکنن و می تونن با از اون طریق به میکرو متصل بشن ..


          در شکل زیر نتیجه ی این تنظیمات رو در محیط CodeVision مشاهده می کنید .. همون طور که میبینید، کتابخانه ی I2C که توسط کامپایلر پشتیبانی میشه، فراخوانی شده هست الان ..



          در شکل زیر گزینه ی دیگه ای رو مشاهده می کنید که اون هم با label تنظیم I2C مشخص شده .. ببینید این بخش برای تنظیمات جانبی و کامل تر این واحد به کار میره .. مثلا میتونید میزان کلاک رو تعیین کنید یا تنظیمات دیگه ای که با توجه به توضیحات بالا تقریبا مشخصه .. فقط یه گزینه میمونه و اونم General Call Recognition هست اونم بر میگرده به حالتی در شبکه .. ببینید بعضی وقتا توی شبکه لازمه که یه پیام یا یه داده ی خاص به تمام عناصر Slave موجود در شبکه ارسال بشه .. در این وضعیت Master باید یک پیام رو به همه ی آدرسها بفرسه و برای این منظور آدرس 0 اختصاص داده شده به این حالت یعنی اگه روی خط SDA آدرس 0 قرار بگیره، یک حالت فراخوانی عمومی برای تمام Slave های شبکه هست ..



          در شکل زیر هم تنظیمات محیط کامپایلر رو بر طبق تنظیماتCodeWizard می تونید مشاهده کنید ..


          در شکل زیر هم تنظیمات Bit rate رو مشاهده میکنید که از طریق تنظیم TWBR انجام میشه ..


          و امــا در مورد بر نامه ای که در زیر بررسی میکنیم .. ببینید این بر نامه ایه که خواندن دیتا از و نوشتن دیتا رو بر روی تراشه ی EEPROM نشون میده .. همون طور که میبینید، دیگه خبری از دستورات رجیستری نیست، چرا؟ به این دلیل که در CodeVision یه سری تابع برای این پروتکل در نظر گرفته شده که به ترتیب بهشون اشاره می کنیم :

          تابع i2c_init : این تابع پیکره بندی میکرو برای پروتکل I2C رو نشون میده .. (1 در صورت صحت)
          تابع unsigned char i2c_start : این تابع برای ایجاد وضعیت شروع به کار میره .. (1 در صورت آزاد بودن و 0 در صورت اشغال بودن باس)
          تابع void i2c_stop : این تابع هم برای ایجاد حالت توقف به کار میره ..
          تابع (unsigned char i2c_read(unsigned char ack : این تابع یک بایت داده رو از باس میخونه .. در صورتی که برای ارسالمون از فاکتور ack به عنوان همون دلیلی که در بالا گفتیم استفاده کنیم، اونوقت، اگه برای انتقال ack در کار باشه، مقدار 1 و اگر هم نباشه مقدار 0 بر گردونده میشه ..
          تابع (unsigned char i2c_write(unsigned char data : این تابع هم برای خواندن یک بایت داده به کار میره .. این تابع در صورت صحت نوشتن (ارسال) اطلاعات به Slave مقدار 1 و در غیر این صورت مقدار صفر رو بر میگردونه ..

          خب حالا توضیح برنامه :
          شکل 1 : این شکل تعریف تابعیه که وظیفش خوندن اطلاعات از خط باسمونه .. همون طور که در شکل نام تابع مشخص شده، این تابع به گونه ای تعریف شده که آرگومان وردیش آدرسه .. یعنی برای استفاده از این تابع (در حلقه ی while یا بعد از void) تنها باید آدرس Slave معلوم باشه و به دیتا کاری نداریم .. اما برنامه به چه ترتیبه؟ ببینید در ابتدا یه دیتایی تعریف میشه که همون دیتای ارسالی از جانب Slave هست اما بعد از اون: ایجاد یه وضعیت شروع، بعد فراخوانی آدرس Slave ، بعد ارسال آدرس روی خط، بعد چک کردن صحت انتقال دیتا، بعد جایگذاری اطلاعات دریافتی به متغییر data (با شرطی که ack در کار نباشه، دیتای خالص)، بعد ایجاد وضعیت پایان انتقال و در آخر هم بر گردوندن دیتا به عنوان دریافتی از Slave ..


          شکل 2 : این شکل هم تعریف تابعیه که وظیفش نقطه ی مقابل تابع بالاییه، یعنی نوشتن اطلاعات بر روی EEPROM که همون ارسال از Master به Slave هست .. اولا همون طور که در تعریف تابع مشاهده می کنید، این تابع برگشتی نداره (Void) و از دو آرگومان به عنوان ورودی استفاده می کنه، یکی آدرس Slave و دیگری هم دیتایی که برای ارسال در نظر گرفته شده .. اما تعریف خط به خط بر نامه: ابتدا ایجاد وضعیت شروع، بعد فراخوانی آدرس Slave ، بعد ارسال آدرس روی خط، بعد ارسال دیتا (چرا مثل بالا نگفتیم دوباره start ؟ به این دلیل که این دستورات داره از طرف Master اجرا میشه و همون واحدی که موظفه وضعیت شروع ایجاد کنه، همین واحده .. اما در بالا Slave باید از جانب Master یک اجازه یا وضعیت شروع برای ارسال دیتا کسب کنه که این حالت توی Master وجود نداره)، بعد ایجاد وضعیت توقف و در آخر هم یه تاخیر کوتاه برای تکمیل اجرای عملیات ..



          شکل 3 : در این قسمت هم می تونیم از توابع تعریف شده در بالا استفاده کنیم .. فکر کنم این قسمتش دیگه نیازی به توضیح بیشتر نداشته باشه (روی شکل تقریبا روند کار مشخصه) ..


          امیدوارم مطالب بالا باتون مفید باشه و مشکلتون رو حل کنه .. موفق باشید ..
          فایل های پیوست شده
          دوستان! مدتی کمتر به سایت میام ..

          دیدگاه


            #6
            پاسخ : درخواست کمک در مورد ارتباط i2c

            سلام دوستان
            من می خوام بدونم با I2C میکرو AVR میشه داده های 12 بیتی ارسال کرد؟!!!
            هیچ چیز غیر ممکن نیست مگر شما آنرا غیر ممکن سازید.

            دیدگاه


              #7
              ارسال دیتا روی خط DC

              با سلام
              بنده میخوام دیتا رو روی خط dc در مسافت 10 کیلومتر بفرستم لطفا راهنمایی بفرمایید
              با تشکر

              دیدگاه


                #8
                پاسخ : ارسال دیتا روی خط DC

                نوشته اصلی توسط mohammad gholamian نمایش پست ها
                با سلام
                بنده میخوام دیتا رو روی خط dc در مسافت 10 کیلومتر بفرستم لطفا راهنمایی بفرمایید
                با تشکر
                یه پست جدید در زیر انجمن مناسب با سوالتون ایجادکنید و سوالتونو توش مطرح کنید نه اینهجا که مربوط به I2C هستش.
                اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

                اگه دوس دارید سریع به جواب برسید :
                1) قبل از پرسیدن سوال، بسرچید.
                2) سوالاتون رو با جزئیات کامل مطرح کنید.

                دیدگاه

                لطفا صبر کنید...
                X