اطلاعیه

Collapse
No announcement yet.

راهنمایی درباره I2C

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

    راهنمایی درباره I2C

    درود بر شما
    من می خوام دوتا میکرو رو به روش I2C بهم وصل کنم، کتاب های ره افروز و کاهه رو نگاه کردم، help نرم افزار بسکام رو هم دیدم، کلی هم توی اینترنت گشتم اما چیزی دستگیرم نشد
    یه جا از یه ic کمکی استفاده کرده باقی جاها اون ic استفاده نشده
    یه جا از مقاومت 10k برای pullup و از 330 برای وصل کردن خط به میکرو استفاده کرده یه جای دیگه از 330 ها استفاده نشده
    بیشتر جاها گفتن اگه می خواید از i2c استفاده کنید باید یه کتابخانه وارد برنامه کنید

    در کل هیچی نفهمیدم، البته دستور send و رسیو رو همه جا نوشته اما اگر امکان داره یه شماتیک که 2 تا میکرو رو با این روش به هم وصل کردن برام بزارید
    بعد به میکروی slave یک led و به میکروی master یک سوییچ وصل باشه
    یه برنامه هم بدید که با زدن سوییچ مستر led در slave روشن بشه

    راستش نمی فهمم چطور master به slave بگه که مثلا portb.0 صفر یا یک بشه و همچنین آیا آدرس slave دست خودمونه مثلا اگه 5 تا slave باشه خودمون باید آدرس دهیشون کنیم یا به سخت افزار نیاز داره و آدرس ها از پیش تعیین شدند

    #2
    پاسخ : راهنمایی درباره I2C

    http://www.persiangig.com/pages/download/?dl=http://alireza-k.persiangig.com/TWI.rar
    فرزندم در راه است

    دیدگاه


      #3
      پاسخ : راهنمایی درباره I2C

      با چه نرم افزاری کدشو نوشتی؟
      A-Hosseini

      دیدگاه


        #4
        پاسخ : راهنمایی درباره I2C

        کد ویژن البته با تابع ننوشتم با رجیستر ها کار کردم
        فرزندم در راه است

        دیدگاه


          #5
          پاسخ : راهنمایی درباره I2C

          تابع های خود کد ویژن مشکل دارن ( من یه بار کار کردم جواب نگرفتم ( البته شایدم مشکل از من باشه ) )
          A-Hosseini

          دیدگاه


            #6
            پاسخ : راهنمایی درباره I2C

            نه مشکلی ندارن ولی من اینطوری اگه جایی هم مشکل پیش بیاد سریع متوجه میشم ولی وقتی تابع استفاده میکنی چون نمیدونی دقیقا چه اتفاقی افتاده ممکنه یه ریزه کاریهایی را بهش توجه نکنی در هر صورت من اینجوری راحت ترم مثلا من 2 روز پیش یه eeprom خریدم و 2 روز وقت گرفت تا درست بتونم ازش جواب بگیرم ولی تو این دو روز خیلی چیزا در مورد I2C یاد گرفتم بازم اگه سوالی بود در خددمتم :agree:
            فرزندم در راه است

            دیدگاه


              #7
              پاسخ : راهنمایی درباره I2C

              نوشته اصلی توسط علیرضا کیانی
              http://www.persiangig.com/pages/download/?dl=http://alireza-k.persiangig.com/TWI.rar
              درود بر شما
              دوست عزیز من هر چقدر که در توانم بود از برنامتون سر درآوردم، اما بازم نفهمیدم آدرس slave رو کجا دادید
              مثلا اگه الان من بخوام یک میکروی دیگه به slave هام اضافه کنم چطوری باید بهش آدرس بدم
              راستی این توابعی که شما در slave و master اضافه کردید رو خودتون نوشتید، آخه من مشابهشون رو ندیدم

              دیدگاه


                #8
                پاسخ : راهنمایی درباره I2C

                سلام دوست من
                درست متوجه شدی من اون تایع ها را خودم نوشتم که همون زیر main میبینی که چطور نوشته شدن ببین شما باید در میکرو SLAVE آدرس را در TWAR قرار بدی و وقتی میخواهی با MASTER صداش بزنی باید تو اولین بایت همون آدرس را قرار بدی که این آدرس یه محدودیتی داشت که فکر کنم 127 تا را بیشتر نمیتونی بهم وصل کنی تو دیتا شیت نوشته دقیقا یه نیگاه بنداز اگه نگرفتی یه خبر بده تا دقیقا بگم
                یا علی
                فرزندم در راه است

                دیدگاه


                  #9
                  پاسخ : راهنمایی درباره I2C

                  نوشته اصلی توسط علیرضا کیانی
                  سلام دوست من
                  درست متوجه شدی من اون تایع ها را خودم نوشتم که همون زیر main میبینی که چطور نوشته شدن ببین شما باید در میکرو SLAVE آدرس را در TWAR قرار بدی و وقتی میخواهی با MASTER صداش بزنی باید تو اولین بایت همون آدرس را قرار بدی که این آدرس یه محدودیتی داشت که فکر کنم 127 تا را بیشتر نمیتونی بهم وصل کنی تو دیتا شیت نوشته دقیقا یه نیگاه بنداز اگه نگرفتی یه خبر بده تا دقیقا بگم
                  یا علی
                  درود بر شما
                  یعنی من توی برنامه slave نخست بنویسم:
                  TWAR=0b00000000;
                  برای slave دوم بنویسم:
                  TWAR=0b00000010;
                  همینطور تا 127 slave رو مشخص کنم، بعد زمانی که master با هر کدومشون کار داشت، نخست آدرسشون رو می دمم بعد data رو می فرستم
                  مثلا اگر با slave شماره 1 کار داشتم توی مستر این دستور رو می نویسم:
                  TWDR=0b00000000;
                  دوباره یه مشکل پیش آمد توی datasheet نوشته بود که برای اینکه مستر اعلام کنه با کدوم slave کار داره باید آدرس رو با رجیستر TWAR مشخص کنه، اما توی برنامه مستر شما اصلا این کد رو ندیدم، بعد نوشته بود که رجیستر TWDR برای اینه که یا دیتا یی که قراره در بایت بعدی فرستاده بشه یا دیتایی که در بایت پیش رسیده رو نگه داره (البته اگر درست متوجه شده باشم، راستش یه خورده با خوندن دیتاشیت مشکل دارم، بعضی چیزا رو اشتباهی ترجمه میکنم، بعد کل موضوع رو اشتباهی می فهمم :angry

                  راستی توی دیتاشیت نوشته بود که محدودیت شمار قطعات وصل شده به هم با استفاده از TWI یکی تعدادشونه که تا 127 تا جا داره یکی هم ظرفیت باسه که باید کمتر از 400pf باشه

                  بازم ممنونم که راهنمایی می کنید،

                  دیدگاه


                    #10
                    پاسخ : راهنمایی درباره I2C

                    درود بر شما
                    من کد های شما رو به این ترتیب تغییر دادم
                    کد Master:
                    #include <mega32.h>
                    #include <delay.h>
                    void twi_trans (char,char);
                    void main (void)
                    {
                    char data,add=0b00001000;
                    DDRA=0x00;PORTA=255;
                    TWBR=10;
                    TWSR=0b00000010;
                    if (PINB.0) {add=0b00001110;}
                    else {add=0b00000110;};

                    while(1)
                    {
                    if (PINB.0) {add=0b00001110;}
                    else {add=0b00000110;};
                    data=PINA;
                    twi_trans(data,add);
                    delay_ms(500);
                    }
                    }
                    void twi_trans (char data,char add)
                    {
                    TWCR=0xA4;
                    while((TWCR&0x80)==0);

                    if((TWSR&0xf8)==0x08)
                    {
                    TWDR=add;
                    TWCR=0b10000100;
                    while((TWCR&0x80)==0);
                    if((TWSR&0xf8)==0x18)
                    {
                    TWDR=data;
                    TWCR=0b10000100;
                    while((TWCR&0x80)==0);
                    }
                    if((TWSR&0xf8)==0x28)
                    {
                    TWCR=0b10010100;
                    }
                    }
                    }
                    کد slave نخست رو دست نزدم

                    کد slave دوم:
                    #include <mega32.h>
                    char rec_data (void);
                    void main (void)
                    {
                    TWBR=10;
                    TWSR|=0b00000010;
                    TWAR=0b00000110;
                    DDRA=0xff;
                    while(1)
                    {
                    PORTA=rec_data();
                    }
                    }
                    char rec_data (void)
                    {
                    char data;
                    TWCR=0b11000100;
                    while((TWCR&0x80)==0);
                    if((TWSR&0xf8)==0x60)
                    {
                    TWCR=0b11000100;
                    while((TWCR&0x80)==0);
                    if((TWSR&0xf8)==0x80)data=TWDR;
                    TWCR=0b11000100;
                    }
                    while((TWSR&0xf8)!=0xA0);
                    return(data);
                    }

                    اینطوری جواب داد تونستم از دوتا IC به عنوان slave استفاده کنم

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

                    دیدگاه


                      #11
                      پاسخ : راهنمایی درباره I2C

                      سلام
                      ببینید شما فقط تو slave باید آدرس مشخص کنید چون Master که آدرس نمیخواد باید با هر کدام از slave ها که کار داره آدرس اونو بده تو دیتا شیت دقیقا به این موضوع اشاره شده ببینید:

                      در مورد تابع هم باید بگم دقیقا درسته اگه شما خودتون متوجه بشید که چه اتفاقی داره میافته خیلی بهتره در ضمن یه راهنمایی در ارتباط 2 سیمه 4 حالت برای هر میکرو وجود داره :
                      1) Master Transmitter
                      Master Receiver (2
                      Slave Transmitter (3
                      Slave Receiver (4
                      که هر کدوم از این حالات تو دیتا شیت بطور کامل توضیح داده شده که به ترتیب چه کارهایی باید انجام بشه تو هر کدوم از این Mode ها اگه بازم هر جاییش نا مفهوم بود در خدمتم
                      فرزندم در راه است

                      دیدگاه


                        #12
                        پاسخ : راهنمایی درباره I2C

                        درود بر شما
                        کد های نوشته شده در قسمت master رو تقریبا فهمیدم
                        فقط کار رجیستر TWSR رو متوجه نشدم، مثلا این دستور
                        if((TWSR&0xf8)==0x08 )

                        چکار می کنه چون توی دیتاشیت هم گفته کار بیت های 3 تا 7 رجیستر TWSR رو بعدا توضیح میده اما چند صفحه که رفتم جلو چیزی پیدا نکردم

                        راستی من برنامه نویسیم خیلی قوی نیست یک سری از دستورات که به فرم زیر هستند رو نمی فهمم
                        TWCR=(1<<TWINT) | (1<<TWSA); 1

                        یا دستور
                        if(TWSR&0xF8)!=START);1

                        در دستور دوم نیم فهمم علامت & که گذاشتید چه کار می کنه
                        (راستی 1 های آخر برنامه رو برای این گذاشتم که فرمت نوشتن درست باشه )

                        دیدگاه


                          #13
                          پاسخ : راهنمایی درباره I2C

                          سلام دوست من
                          شرمنده دیر شد :redface:
                          فقط کار رجیستر TWSR رو متوجه نشدم، مثلا این دستور
                          if((TWSR&0xf8)==0x08 )
                          ببین دوست من این رجیستر اسمش روشه Twi Status Register که میشه رجیستر نمایش دهنده حالت TWI که فقط هم خواندنی است حالا این رجیستر چیکار میکنه,در هر یک از 4 مد که گفتم یا دیتا یا آدرس ارسال میشود که برای اینکه بفهمیم درست ازسال شده یک Acknowlage از طرف هر کدام از دستگاه ها ارسال میشه که این نشون کاری که میخواستیم انجام شده و در همین موقع یه عدد بخصوص تو این رجیستر ریخته میشه توسط واحد سخت اقزاری TWI که ما با چک کردن اون میفهمیم عملیات مورد نظر درست انجام شده حالا اینکه این عدد چنده برمیگرده به دیتا شیت که دقیقا طی 4 جدول همه حالات را مشخص کرده که من یکیش را پایین گذاشتم



                          در مورد اون 0xf8& چون فقط 5 بیت مربوط به این اعداد وضعیت میشه بقیه را صفر میکنیم ببینید



                          چکار می کنه چون توی دیتاشیت هم گفته کار بیت های 3 تا 7 رجیستر TWSR رو بعدا توضیح میده اما چند صفحه که رفتم جلو چیزی پیدا نکردم
                          بیت های 3 تا 7 مربوط به همین حالات میشه که گفتم
                          TWCR=(1<<TWINT) | (1<<TWSA);
                          اینم یعنی اینکه بیت TWINT و TWSA را توش 1 بریز این مدل برنامه نویسی زیاد به کار نمیآد این خط معادل است با : TWCR=0b1010000
                          البته نه دقیقا معدل یه تفاوت هایی دارن که اینجا مهم نیست
                          بازم مشکلی بود در خدمتم
                          فرزندم در راه است

                          دیدگاه


                            #14
                            پاسخ : راهنمایی درباره I2C

                            درود بر شما
                            دوست عزیز دستتون درد نکنه من خیلی چیز درمورد TWI فهمیدم اما داشتم فکر می کردم که به جای LED به یکی از slave ها یک lcd کاراکتری وصل کنم اما اطلاعاتی که باید روی lcd چاپ بشه رو نمی دونم باید چطوری باید ارسال کنم، آخه من وقتی lcd به میکرو وصل می کنم (در حالت عادی) فقط از تابع ها و تنظمات مربوط به lcd در خود میکرو استفاده می کنم به همین خاطر نمی دونم مثلا اگر بخوام روی Lcd که به slave وصل شده یه چیزی بنویسم باید چی رو به عنوان دیتا جابجا کنیم
                            (البته فکر می کنم باید دیگه از اسمبلی استفاده کنم، که هیچی بلد نیستم)

                            دیدگاه


                              #15
                              پاسخ : راهنمایی درباره I2C

                              دوستان
                              سلام

                              آقا مرسی...خیلی خوشم اومد...بحث واقعا عالیه. :nice:
                              راستش من چند روز سر یه پروژه گیرم...کارم تموم شه بعدش به شما ملحق میشم. I2c وضعش خیلی خرابه.
                              از هر کی هم میپرسی میگه قدیمیه...کاربردی نداره

                              موفق باشید
                              به امید دیدار
                              خوب بودن تنها ویژگی ای است که برای دستیابی به آن نیاز به هیچ استعدادی نیست.... دکتر قمشه ای

                              دیدگاه

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