اطلاعیه

Collapse
No announcement yet.

پروتکل I2C

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

    پروتکل I2C

    سلام من می خوام دو تا ATMEGA8 رو از طریق I2C به هم متصل کنم.
    مثلا اولی برای دومی عدد 3 رو ارسال کنه. بعد دومی یکی به عدد اضافه کنه و 4 رو بر گردونه به اولی!
    1- خوب کدام پایه های از میکروها باید به هم وصل بشن؟ (مقاومت هم ظاهرا می خواد کجا و چقدر بزارم؟)
    2- من توی کدویژن با کدویزارد کار می کنم و حرفه ای نیستم. کجا یا کجاهای کدویزاد رو باید تنظیم کنم؟(دقیق بگید)
    3- توابع ارسال و دریافت و ... چیا هستن مثلا کسی می تونه همین مثال رو کدش رو بنویسه؟
    مرسی

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

    #2
    پاسخ : پروتکل I2C

    سلام،
    این کتاب رو دانلود و قسمت I2C رو مطالعه بفرمایید به تموم جواب هاتون میرسین:
    http://www.avr.ir/index.php?option=com_content&task=view&id= 109&Itemid=27

    اول تمام رجیسترهاشم توضیح داده و برنامه رو با استفاده از رجیسترها و بدون تابع آماده نوشته، بعدشم توابع آماده CodeVision رو توضیح داده و یه مثال کاربردی براش زده.

    موفق باشید

    «پشتکار» «پشتکار» «پشتکار»

    دیدگاه


      #3
      پاسخ : پروتکل I2C

      همون طور که گفتم من خیلی حرفه ای نیستم و این کتاب رو اصلا نفهمیدم! :eek: در ضمن توی اون روی یک حافظه داده می نویسن! خوب حالا از کجا بفمیم انجام شد! تو مثالی که خودم زدم اگه جواب برگشتی 4 بود کار درست انجام شده ولی من نمی دونم چطور ارسال کنم! چه طور دریافت کنم و چه طور دوباره جواب رو ارسال کنم! در ضمن در کد ویژن من هم دو تا تب هست
      I2C
      و
      TWI(I2c)
      باید برم کدوم و توش چه کار کنم؟ یعنی کسی نیست خودش بتونه یه مثال بنویسه!

      دیدگاه


        #4
        پاسخ : پروتکل I2C

        نوشته اصلی توسط saate777
        همون طور که گفتم من خیلی حرفه ای نیستم و این کتاب رو اصلا نفهمیدم! :eek: در ضمن توی اون روی یک حافظه داده می نویسن! خوب حالا از کجا بفمیم انجام شد! تو مثالی که خودم زدم اگه جواب برگشتی 4 بود کار درست انجام شده ولی من نمی دونم چطور ارسال کنم! چه طور دریافت کنم و چه طور دوباره جواب رو ارسال کنم! در ضمن در کد ویژن من هم دو تا تب هست
        I2C
        و
        TWI(I2c)
        باید برم کدوم و توش چه کار کنم؟ یعنی کسی نیست خودش بتونه یه مثال بنویسه!
        سلام دوست من
        من قبلا با I2C زیاد کار کردم ولی من فقط برای خواندن و نوشتن اطلاعات در حاظفه 24c512 و آی سی ساعت ds1307 ازش استفاده کردم
        اینطوری از کد ویزارد پیداس فکر کنم شما باید از TWI که master , slave داره استفاده کنی ! :rolleyes:
        و برای یک میکرو اون رو مستر و برای دیگری slave کنی در حالت slave مقدار بافر ورودی و خروجی براش تنظیم میشه که در واقع خودش کدی برات مینویسه (البته در SLAVE) که وقتی دیتا به مقدار بافر تنظیم شده رسید اگر خطایی نداشت مثلا فلان کار رو انجام بده (که جاش در کدی که کدویزارد بهت میده مشخص شده )
        ولی اینکه ارتباط میتونه دوطرفه باشه در این حالت نمیدونم ! :sad:

        ولی زیاد دیدم که بچه ها از ارتباط سریال بین دو میکرو یا از ارتباط isp استفاده میکنن . شما چرا از این راهها استفاده نمی کنید .
        در ارتباط سریال که با استفاده از یدونه MAX میتونید با فاصله خیلی زیادی ارتباط برقرار کنید یا حتی بیسیم !
        موفق باشید .

        - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

        دیدگاه


          #5
          پاسخ : پروتکل I2C

          مجدداً سلام،

          ببین دوست من، اینکه انتظار داشته باشی دقیق همون جوابی که میخوای رو برسی، یکم بی انصافیه، چون شاید قبلاً کسی این کار رو نکرده باشه که الان کداش رو داشته باشه و واست بذاره تا کامل متوجه بشی، من یه مثال کامل میزنم از راه اندازی سنسور Compas3 که با I2C کار میکنه، با همین مثال با توابع اولیه I2C در کدویژن آشنا میشی:
          اول از همه اینکه من از زبونه I2C استفاده کردم و روی پورت A تنظیم کردم:
          کد:
          #include <mega16.h>
          #include <stdio.h>
          
          // I2C Bus functions
          #asm
            .equ __i2c_port=0x15 ;PORTC
            .equ __sda_bit=0
            .equ __scl_bit=1
          #endasm
          #include <i2c.h>
          
          void main(void)
          {
          unsigned int hb = 0;
          char buffer[16];
          
          // I2C Bus initialization
          i2c_init();
          
          while (1)
             {
               i2c_start();
               i2c_write(192);
               i2c_write(1);
               i2c_start();
               i2c_write(193);
               hb=i2c_read(0);
               i2c_stop(); 
               
               lcd_gotoxy(8,0);
               sprintf(buffer,"%d",hb);
               lcd_puts(buffer); 
          
             };
          }
          همونطور که میبینی تنها مواردی که استفاده شده یه start بود، یه تابع برای نوشتن (ارسال) write، یه تابع برای خوندن (دریافت) read و یه تابع هم برای stop!
          حالا اینکه اون مقادیری که ارسال کردم چیه و چرا اونا رو فرستادم مربوط به خود سنسوره و از دیتاشیتش استخراج شده! مثلاً یکیش آدرس خود سنسوره، یکی آدرس رجیستری که مثلاً جهت درش ذخیره شده و باید فراخونی بشه و الخ...

          حالا شما با استفاده از این توابع میتونی خودت یه الگوریتمی بنویسی که به خوبی این میکروها با هم شبکه بشن و حتی اگر داده خطا (اشتباه) هم ارسال شد تصحیح کنه و به قولی Ack و Nack رو وارد بازی کنی

          من قبلاً برای یه پروژه ای دوتا میکرو رو با I2C باهم شبکه کرده بودم که یکی فقط نقش پردازنده رو ایفا میکرد و یکی فقط وظیفه فرمان دادن های سخت افزاری (واسه کنترل بهتره موتور) رو داشت. اما هرچی گشتم برنامش پیدا نشد، مث که پاک شده! ولی برنامم رو با استفاده از همین توابعی که می بینی نوشته بودم!

          موفق باشی

          «پشتکار» «پشتکار» «پشتکار»

          دیدگاه


            #6
            پاسخ : پروتکل I2C

            من با جند تا مشکل مواجهم
            1- از کدویزارد استفاده می کنم(حالا باید برم توی قسمت twi(I2C) یا باید برم قسمت I2C)
            در قسمت TWI میشه برای slave ها آدرس تعیین کرد که منطقی هست ولی اونقت کد تولید شده توابعی که استفاده کردید رو نداره!
            در قسمت I2C توابع قابل تعریفن ولی جالبه که نمیشه برای Slave ها آدرس تعیین کرد(اصلا نمیشه Slave یا مستر بودن رو تعیین کرد)
            2- کلا من هدفم اینه که بعد از یاد گرفتن i2c برم سراغ سنسور دمای mlx90614 که با i2c کار میکنه. وی اینو نمی تونم هضم کنم که اگه من i2c رو هم خوب بفهمم اونوقت چطور باید سنسور رو پروگرم کنم و Slave تعریفش کنم؟؟؟؟؟چون هدف نهای اونه که از سه تا MLX90614 در سه طرف یه ربات استفاده کنم؟
            نکته : این سنیوری که گفتم یه سنسور دما با خروجی I2C هست که باید چندتاش رو همزمان به میکرو وصل کرد تا دمای چند طرف رو خوند. چون چند تا داریم پس میکرو باید مستر باشه و سنسورها Slave حالا سوال اینه مگه سنسور رو هم میشه پروگرم کرد که slave تعریف بشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

            دیدگاه


              #7
              پاسخ : پروتکل I2C

              خوب دوست من شما از اول که گفتی دو تا میکرو رو میخوای بهم شبکه کنی؟
              الان شد سنسور؟
              خب، برای سنسور از همون زبونه I2C استفاده کن و مشخص کن بر روی کدوم پورت (پرت) قرار بگیره. بقیش همه میشه دیتاشیت!
              من با این سنسوری که شما میگی کار نکردم، ولی دیتاشیتش رو بخونی مطمئن باش خودش گفته چطور باید ارتباط برقرار کنی!
              اونجا مشخص کرده اول چه آدرسی رو بفرستی، بعد چه رجیستری (از سنسور) رو فراخونی کنی و کی مقدار رو بخونی و الخ...
              دیتاشیت رو کامل مطالعه کن، مشکلت حل میشه

              «پشتکار» «پشتکار» «پشتکار»

              دیدگاه


                #8
                پاسخ : پروتکل I2C

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

                دیدگاه


                  #9
                  پاسخ : پروتکل I2C

                  هنوزم میگم می خوام اول بفهمم این I2C چیه! یکم باهاش کار کنم مسلط بشم بعد برم سراغ این سنسور که هدف اصلیه!
                  گیرم هم همون جایی که شما کار نکردید و نخوندین! یه سرچ بزنین می بینین این سنسور خیلی گرونه و اگه خریدی باید نهایت اسفاده رو بکنی یا کلا نخری! از طرفی اونایی که کار کردن خیلی باهاش گیر دارن(توی همین سایت یه سرچ بزنین). ضمنا اونایی که کار کردن میگن علیرغم 40 صفحه دیتا شیت مطلب درست و درمونی نداره!
                  حالا فرض کنید من که اصلا نمی دونم I2C چی هست برم اینو بخرم و مدارم کار نکنه! حالا مشکل از I2C یا از سنسور یا از جای دیگه؟؟؟؟؟؟؟؟
                  تازه مشکلات بیش تر از یانه که چنتا تاپیک دیگه هم گذاشتم ببینید می فهمید هدف نهایم خیلی دور هست! حداقل برای من که سخته!

                  دیدگاه


                    #10
                    پاسخ : پروتکل I2C

                    نوشته اصلی توسط mania59

                    ولی آدرس داره و میشه آدرس داد و اطلاعات رو ازش خوند .
                    من همین رو نمی فهمم که آدرس داره یعنی چی؟ من سه تا ازش لازم دارم! حالا آدرساشون کجا تعیین شده که من توی کدی که میزنم ازشون استفاده کنم؟

                    دیدگاه


                      #11
                      پاسخ : پروتکل I2C

                      دوست عزیز ببین در مورد سنسور شاید و قطعا دیگر دوستان می تونن بیشتر راهنمایی کنن . :agree:
                      اما در مورد آدرس باید یه مثال برات از حافظه که با ارتباط I2C به میکرو متصل میشه بزنم
                      ببین مثلا آی سی 24c512 سه تا پایه داره که برای آدرس دهی سخت افزاری است یعنی در نظر بگیر سه تا مسیر باس آدرس داریم که هر کدوم میتونه صفر یا یک باشه رو همین حساب یعنی می تونیم 8 تا از این آی سی رو با میکرو کنترل کرده و اطلاعات در آنها ذخیره و بازیابی شود . ( دقت کنید که مسیر باس آدرس در واقع وجود خارجی نداره ( البته می تونه داشته باشه ولی در موارد خاص ) در اینجا ما با زمین و vcc کردن پایه های آدرس هر کدوم از آی سی های حافظه آدرس اون رو از قبل مشخص می کنیم برای همیشه ) (ثابت )
                      خوب در نرم افزار نیز این آدرس رو برای آی سی مون این طوری تعریف میکنیم
                      کد:
                      #define EEPROM_BUS_ADDRESS 0xa0
                      در این دستور ما یک مقدار اولیه صفر برای بیت های آدرس به نام EEPROM_BUS_ADDRESS تعریف میکنیم .
                      و در تابع زیر می بینید که از این آدرس چگونه استفاده شده است در واقع ابتدا آدرس سخت افزاری در مسیر باس I2C ریخته میشه و اون دیوایس مربوطه فعال میشه تا اطلاعات را بخونه یا تحویل بده دستور بعدی اینرو معلوم میکنه به کد توابع زیر برای خواندن و نوشتن در حافظه با I2C توجه کنید راستی البته اینجا آدرس نرم افزاری هم داریم که مربوطه به حافظه است اگر نیاز به توضیحا بیشتر بود در خدمتم .



                      کد:
                      unsigned char eeprom_read(int AddressInt)
                      {
                       
                        unsigned char addressL = AddressInt&0xff;
                        unsigned char addressH = AddressInt>>8;
                        unsigned char data;
                        i2c_start();
                        i2c_write(EEPROM_BUS_ADDRESS);  
                        i2c_write(addressH); 
                        i2c_write(addressL); 
                        i2c_start(); 
                        i2c_write(EEPROM_BUS_ADDRESS | 1); 
                        data = i2c_read(0);
                        i2c_stop();
                        return data;
                      }
                      
                      /* Write a byte to the EEprom */
                      void eeprom_write(unsigned char data,int AddressInt)
                      {
                      
                        unsigned char addressL = AddressInt&0xff;
                        unsigned char addressH = AddressInt>>8;
                        i2c_start();
                        i2c_write(EEPROM_BUS_ADDRESS); 
                        i2c_write(addressH);
                        i2c_write(addressL);   
                        i2c_write(data);
                        i2c_stop(); 
                        delay_ms(10);
                      }
                      - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

                      دیدگاه


                        #12
                        پاسخ : پروتکل I2C

                        نوشته اصلی توسط saate777
                        من با جند تا مشکل مواجهم
                        1- از کدویزارد استفاده می کنم(حالا باید برم توی قسمت twi(I2C) یا باید برم قسمت I2C)
                        در قسمت TWI میشه برای slave ها آدرس تعیین کرد که منطقی هست ولی اونقت کد تولید شده توابعی که استفاده کردید رو نداره!
                        در قسمت I2C توابع قابل تعریفن ولی جالبه که نمیشه برای Slave ها آدرس تعیین کرد(اصلا نمیشه Slave یا مستر بودن رو تعیین کرد)
                        2- کلا من هدفم اینه که بعد از یاد گرفتن i2c برم سراغ سنسور دمای mlx90614 که با i2c کار میکنه. وی اینو نمی تونم هضم کنم که اگه من i2c رو هم خوب بفهمم اونوقت چطور باید سنسور رو پروگرم کنم و Slave تعریفش کنم؟؟؟؟؟چون هدف نهای اونه که از سه تا MLX90614 در سه طرف یه ربات استفاده کنم؟
                        نکته : این سنیوری که گفتم یه سنسور دما با خروجی I2C هست که باید چندتاش رو همزمان به میکرو وصل کرد تا دمای چند طرف رو خوند. چون چند تا داریم پس میکرو باید مستر باشه و سنسورها Slave حالا سوال اینه مگه سنسور رو هم میشه پروگرم کرد که slave تعریف بشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
                        با سلام.
                        از آنجایی که بنده قبلا این سنسور را رها اندازی کرده ام مطالبی دارم که شاید به در شما بخورد.
                        در کدویزارد اگر از زبانه ی i2c استفاده کنید کار راحت تر است.نیاز به تنظیمات خاصی هم ندارد.و فقط باید پین های مورد نظر را تعیین کنید.و فرکانس را هم روی 100 کیلو هرتز یا کمتر بگذارید.(چون استاندارد این سنسور smbus است و این استاندارد تا 100 کیلو هرتز را پشتیبانی می کند)

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

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

                        دیدگاه

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