اطلاعیه

Collapse
No announcement yet.

ارتباط twi یا i2c

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

    #16
    پاسخ : ارتباط twi یا i2c

    نوشته اصلی توسط golgolak
    حسام جان
    می شود بق :byeیه سولاتم را هم جواب بدهی ممنون :cry2:
    سلام ...........

    چشم میذارم ، اما احتمالا میفته آخر هفته ؛ چون یه مقدار در گیر شدم! :NO:
    دوستان! مدتی کمتر به سایت میام ..

    دیدگاه


      #17
      پاسخ : ارتباط twi یا i2c

      حسام جان سلام
      خوشم می آید مثل خودم شب زنده داری
      من این برنامه را به عنوان مثال دارم ولی نمی فهمم چرا مثلا در تابع write یک بار EEPROM_BUS_ADDRESS را می فرستد و یک بارADDRESS و یا اصلا توابعی را که برای دریافت و یا ارسال نوشته را نمی فهمم ضمنا توضیح تنظیمات در cod vison برای ارتباط دو تا میکرو را هم ندارم شما بیشتر از استادم در این پروژه کمکم کردید :nice:
      #asm
      .equ __i2c_port=0x18
      .equ __sda_bit=3
      .equ __scl_bit=4
      #endasm
      /* now you can include the I2C Functions */
      #include <i2c.h>
      /* function declaration for delay_ms */
      #include <delay.h>
      #define EEPROM_BUS_ADDRESS 0xa0
      /* read a byte from the EEPROM */
      unsigned char eeprom_read(unsigned char address) {
      unsigned char data;
      i2c_start();
      i2c_write(EEPROM_BUS_ADDRESS);
      i2c_write(address);
      i2c_start();
      i2c_write(EEPROM_BUS_ADDRESS | 1);
      data=i2c_read(0);
      i2c_stop();
      return data;
      }
      P a g e | 175
      www.eca.ir
      - ١٧٥ -
      /* write a byte to the EEPROM */
      void eeprom_write(unsigned char address, unsigned char
      data) {
      i2c_start();
      i2c_write(EEPROM_BUS_ADDRESS);
      i2c_write(address);
      i2c_write(data);
      i2c_stop();
      /* 10ms delay to complete the write operation */
      delay_ms(10);
      }
      void main(void) {
      unsigned char i;
      DDRD=0xFF;
      /* initialize the I2C bus */
      i2c_init();
      /* write the byte 55h at address 10h */
      eeprom_write(0x10,0x55);
      /* read the byte from address AAh */
      i=eeprom_read(0x10);
      PORTD=i;
      while (1); /* loop forever */
      یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
      هان ای صنما،دل یک دله کن
      گر سر ندهم ،وانگه گله کن

      دیدگاه


        #18
        پاسخ : ارتباط twi یا i2c

        راستی چند خط وسط برنامه است که مال شماره صفحه و اسم سایت خودتان و... است که جزئ برنامه نیست آخه فایل pdf را از همین سایت گرفتم
        یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
        هان ای صنما،دل یک دله کن
        گر سر ندهم ،وانگه گله کن

        دیدگاه


          #19
          پاسخ : ارتباط twi یا 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 :
          در شکل i گزینه ای رو می بینید که همون دو تا خطی که ما به عنوان خطوط ارتباطی این پروتکل در بالا تعریف کنیم ، مشخص میکنه . همون طور که میبینید می تونید هر پورتی رو که میخواید برای این ارتباط تعریف کنید . SDA Bit شماره ی پایه در اون پورتی رو تعیین میکنه که شما تعیین کردید (از بیت صفر تا هفت) و SCL Bit هم شماره ی پایه ای رو تعیین میکنه که به خط SCL اختصاص پیدا میکنه . انتخاب های بعدی هم به آیسی هایی اختصاص داره که با این پروتکل کار میکنن و می تونن با از اون طریق به میکرو متصل بشن .

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

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

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

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

          .... اما در مورد بر نامه ای که در فایل هست ، ببینید این بر نامه ایه که خواندن و نوشتن دیتا از و بر روی تراشه ی EEPRO رو نشون میده . همون طور که میبینید ، دیگه خبری از دستورات رجیستری نیست ، چرا؟ به این دلیل که در 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 : در این قسمت هم می تونیم از توابع تعریف شده در بالا استفاده کنیم . فکر کنم این قسمتش دیگه نیازی به توضیح بیشتر نداشته باشه (روی شکل تقریبا روند کار مشخصه) .

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



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

          دیدگاه


            #20
            پاسخ : ارتباط twi یا i2c

            حسام جان بسیار ممنون :applause: :wow:
            حتما تست می کنم و جواب را می دهم ولی آیا با توجه با پیغام خصوصی که برات گذاشتم این کار در atmega64 جواب می دهد
            یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
            هان ای صنما،دل یک دله کن
            گر سر ندهم ،وانگه گله کن

            دیدگاه


              #21
              پاسخ : ارتباط twi یا i2c

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

              بابت جواب سوال به PM تون مراجعه کنید .......

              برای اینکه مطلب برای دوستان شبهه ای ایجاد نکنه بگم که ، ایشون پرسیده بودن که آیا ممکنه کامپایلر CodeVision یه مدل میکرو رو نشناسه و مدلای دیگش رو بشناسه؟

              جواب اینه که ورژن های نامرغوب یا اونایی که رجیستر شده نیستن ، ممکنه گاهی با این مشکلات روبرو بشن (البته باز هم میکرو رو میشناسن ولی یک سری دستورات و پشتیبانی ها رو نمیشناسن) اما نسخه ای که ایشون دارن (ضمیمه شده ی یکی از تاپیک های همین سایت) با این مشکلات روبرو نیست (من خودم مدل 64 رو سخت افزاری تست کردم ، مشکلی نداشت) . موفق باشید .
              دوستان! مدتی کمتر به سایت میام ..

              دیدگاه


                #22
                پاسخ : ارتباط twi یا i2c

                باز هم سلام
                بابا من از خیر ATMEGA64 گذشتم برنامه ای را که در همین پست است را هم روی دو تا ATMEGA16 تست کردم جواب نداد کسی برنامه ای دارد که برای ارتباط دو تا میکرو توسط I2C جواب گرفته باشه لطفا با COD VISON اگر دارید بگذارید من برای قسمتی از پروژه ام نیاز دارم
                یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                هان ای صنما،دل یک دله کن
                گر سر ندهم ،وانگه گله کن

                دیدگاه


                  #23
                  پاسخ : ارتباط twi یا i2c

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

                  جناب golgolak این برنامه بارها تست شده(من خودم امتحانش کردم) . نمیدونم مشکل شما دقیقا چیه؟
                  دوستان! مدتی کمتر به سایت میام ..

                  دیدگاه


                    #24
                    پاسخ : ارتباط twi یا i2c

                    نوشته اصلی توسط حسام الدین
                    سلام ..................

                    جناب golgolak این برنامه بارها تست شده(من خودم امتحانش کردم) . نمیدونم مشکل شما دقیقا چیه؟
                    حسام جان سلام
                    نماز روزه هات قبول
                    راسیاتش چند وقت که من پیدام نبود بیکار ننشستم و داشتم این کار را تست می کردم نه در عمل و نه در پرتئوس جواب نداد :angry: حتی بی خیال شدم و هشت پورت از این میکرو را با هشت تا پورت از اون یکی میکرو به هم دیگه وصل کردم تا این طور اطلاعات رد و بدل بشه نویز زیاد بود و دقیق نمی شد و مثلا به جای عدد 8 عدد 25 می رسید سراغ spi هم رفتم و مثال حل شده کتاب پرتویی فر را تست کردم نه در عمل و نه در پرتئوس جواب نگرفتم سراغ کتاب ره افروز رفتم و مثال حل شده spi اون هم جواب نداد خلاصه مطلب این که
                    من بمرگم راضیم اما نمی آید اجل

                    بخت بد بین کز اجل هم ناز میباید کشید
                    اصلا فکر کنم باید این را هم مثل مشکل lcd که داشتم حل کنیم با عرض شرمندگی بسیار فراوان اگه بشه یک مثال حل شده با فایل پرتئوس که جواب داده باشه برای من بگذاری یک دنیا ممنون می شوم نمی دونم چطور تشکر کنم
                    یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                    هان ای صنما،دل یک دله کن
                    گر سر ندهم ،وانگه گله کن

                    دیدگاه


                      #25
                      پاسخ : ارتباط twi یا i2c

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

                      ببینید من الان دست به نقد یه نمونه برنامه دارم که شبکه بندی دوتا میکرو رو از طریق SPI انجام میده . یکیشون دیتا ارسال میکنه و اون یکی هم دریافت و بعدش هم نمایش بر روی LCD . اگه کمکتون می کنه تا براتون بذارم . (دو تا Mega8 هست) ؟
                      دوستان! مدتی کمتر به سایت میام ..

                      دیدگاه


                        #26
                        پاسخ : ارتباط twi یا i2c

                        ای جون ای جون ...... :wow: :wow:
                        بزار عزیزم بذار قربون از بسکه به این در و اون در زدم داشتم نا امید می شدم :biggrin:
                        حسام جان فقط لطف کن برنامه اش را هم بزار و یک توضیح کوچولو بده تا آدم خنگی مثل من بتونه بفهمه کی به کجاست
                        البته فکر نکم برای mega 16 تفاوتی کنه ولی اگه تفاوتی می کنه برای اون هم یک توضیح کوچولو بده
                        من اگه خدا دوستم نداشت و با اعضای این سایت با حال آشنا نمی شدم کارم به کجا می کشید خدا می دونه
                        یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                        هان ای صنما،دل یک دله کن
                        گر سر ندهم ،وانگه گله کن

                        دیدگاه


                          #27
                          پاسخ : ارتباط twi یا i2c

                          با سلام

                          من دونبال روش ارتباط twi توی فوروم گشتم اما به نظر می آید که به زور هم که شده
                          با ید باi2c کار کنم

                          :redface:لطفا کامل توضیح بدهید از نحوه ارتباط سخت افزاری 2 میکرو atmega 16
                          و بر نا مه به زبان سی در محیط code vision avr :eek: :applause: برای WTI

                          دیدگاه


                            #28
                            پاسخ : ارتباط twi یا i2c

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

                            دیدگاه


                              #29
                              پاسخ : ارتباط twi یا i2c

                              با سلام خدمت همه
                              با تشکر از استاد و دوست عزیزم حسام الدین بالا خره تونستم بین دو تا میکرو اطلاعات را رد و بدل کنم توی پرتئوس جواب نمی دهد اما در عمل جواب می دهد این کار را توسط spi کردم فعلا فایل این پروژه را در دسترس ندارم انشاء الله چند روز آینده می گذارم تا دوستان دیگر استفاده کنند
                              یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                              هان ای صنما،دل یک دله کن
                              گر سر ندهم ،وانگه گله کن

                              دیدگاه


                                #30
                                پاسخ : ارتباط twi یا i2c

                                مشکل من برای این ارسال این بود که اصلاعات ارسالی را که با حالت unsigned char می فرستادم ولی وقتی در حالت int قرار دادم و به صورت hex ننموشتم یعنی مثلا نوشتم 55 نوشتم 0x55 مشکل حل شد
                                اما حالا سولام این است که یک عدد مثل 1800 که بیشتر از یک بیت است را چگونه ارسال کنم
                                یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                                هان ای صنما،دل یک دله کن
                                گر سر ندهم ،وانگه گله کن

                                دیدگاه

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