اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی TWI

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

    مشکل در برنامه نویسی TWI

    با سلام خدمت دوستان

    کسی در مورد تفاوت I2C و TWI اطلاعاتی داره :question:
    من کتاب آقای ره افروز و یه کتاب دیگه رو مطالعه :nerd: کردم ولی بازم متوجه فرق این دوتا با هم نشدم :sad: ؟
    تو هر دو کتابی که من دارم TWI و I2C رو باهم شرح دادن .
    اصلا فرقی دارن ؟ :mrgreen:


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

    #2
    پاسخ : سوال در مورد تفاوت i2c و TWI

    تا جایی که من می دونم فرقی ندارند و جفتشون یکی هستند
    حالا یه چا نوشته بود TWI پروتکلشه و I2C نوع ارتباط رو که سریال دو سیمه است نشون میده
    که البته حتی اگر این هم باشه بازهم به نظر من از لحاظ عملی برای ما فرقی نمی کنه و خیلی ارزش بجث کردن نداره

    دیدگاه


      #3
      پاسخ : مشکل در برنامه نویسی TWI

      سلام
      برنامه های زیر رو واسه ارتباط دو تا میکرو از طریق TWI نوشتم . ولی جواب نداد .
      اگه دوستان مشکلی تو برنامه دیدن لطفا بگن .
      در ضمن این برنامه هارو از روی توضیحات دیتا شیت نوشتم ولی بازم ........ :cry:
      کد اول واسه آی سی فرستنده هستش و کد دوم واسه آی سی گیرنده


      کد:
      #include <mega64.h> 
      #include<delay.h>         
      
      
      
      //Defines Rool     
      #define start    0x24    // create start mode
      #define start_ok  0x08    //TWSR equale start If bus is free
      #define gen_call_w 0x00    //General call for send DATA to ALL Slaves  
      #define mt_sla_ack 0x18
      #define mt_data_ack 0x28
      #define BEEP_ON PORTA.6=1
      #define BEEP_OFF PORTA.6=0
      // functions names
       //ERROR ();
       ERROR1 ();
       ERROR2 ();
       BUSY ();
      // 2 Wire bus interrupt service routine
      interrupt [TWI] void twi_isr(void)
      {
      // Place your code here
      
      }
      
      // Declare your global variables here
      char DATA='f';
      
      
      
      
      void main(void)
      {
      // Declare your local variables here
      
      // 2 Wire Bus initialization
      // Generate Acknowledge Pulse: On
      // 2 Wire Bus Slave Address: 00h
      // General Call Recognition: On
      // Bit Rate: 368.640 kHz
      TWSR=0x00;
      TWBR=0x0C;
      TWAR=0x01;
      TWCR=0x45;
      
      // Global enable interrupts
      #asm("sei")
      //Check the Bus for free
      TWCR=0x24;     
      while(!(TWCR & 0x80));
      while((TWSR & 0xf8) != start_ok)
      BUSY ();       
      //send the slave address+w on the bus and recive ack 
      
      TWDR=0x02;  //For example slave address = 01 + 0 for Write = 0x02
      TWCR=0x84;  //send slave add
      while(!(TWCR & 0x80));
      if((TWSR & 0xf8) != mt_sla_ack)
      ERROR1();
      TWDR=DATA ;
      TWCR=0x84 ;
      while(!(TWCR & 0x80));
      if((TWSR & 0xf8) != mt_data_ack)
      ERROR2();
      TWCR=0x94;
      
          while(1)
          {
           BEEP_ON;
           };
       
      }      
      
      ERROR ()
      {
        BEEP_ON;
        delay_ms(70);
        BEEP_OFF;
        delay_ms(100);
      } 
      
      ERROR1 ()
      {int a=1;
      
      while(a<2)
      {
        BEEP_ON;
        delay_ms(1000);
        BEEP_OFF;
        delay_ms(100);
        a++ ;
      };
      }
      
      
      ERROR2 ()
      {int b=1;
        while(b<3)
        {
        BEEP_ON;
        delay_ms(100);
        BEEP_OFF;
        delay_ms(100);
        b++;
      }  ;
        }
      
      BUSY ()
      {
        BEEP_ON;
        delay_ms(400);
        BEEP_OFF;
        delay_ms(300);
      }



      کد:
      /*****************************************************
      This program was produced by the
      CodeWizardAVR V1.25.1 Evaluation
      Automatic Program Generator
      © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com
      
      Project : 
      Version : 
      Date  : 2008/01/05
      Author : Freeware, for evaluation and non-commercial use only
      Company : 
      Comments: 
      
      
      Chip type      : ATmega16
      Program type    : Application
      Clock frequency   : 7.372800 MHz
      Memory model    : Small
      External SRAM size : 0
      Data Stack size   : 256
      *****************************************************/
      
      #include <mega16.h> 
      #include <delay.h>
      
      
      /////////////////////////////////////
      //////////////DEFINES////////////////
      #define sr_sla_ack  0x80
      #define sr_data_ack 0x50
      #define sr_data_nack 0x58
      // 2 Wire bus interrupt service routine
      // Declare your global function here
      void ERROR ();  
      char recived_data = 0;
      
      interrupt [TWI] void twi_isr(void)
      {
      // Place your code here
      
      
      
      
      ///////////////////////////////////////
      
      TWCR=0x45;   // set TWI in SR mode
      while(!(TWCR & 0x80));
      while((TWSR & 0xf8) != sr_sla_ack)
      ERROR ();
      TWCR=0XC4;
      while(!(TWCR & 0x80));
      while((TWSR & 0xf8) != sr_data_ack)
      ERROR ();
      recived_data = TWDR;
      
       
      while (1)
         {
         // Place your code here
         if (recived_data == 'f')
         PORTA.1=1;
         };
      }
      
      // Declare your global variables here
      
      
      
      
      void main(void)
      {
      // Declare your local variables here
       // 2 Wire Bus initialization
      // Generate Acknowledge Pulse: On
      // 2 Wire Bus Slave Address: 01h
      // General Call Recognition: On
      // Bit Rate: 368.640 kHz
      TWSR=0x00;
      TWBR=0x02;
      TWAR=0x03;
      TWCR=0x45;
      
      // Global enable interrupts
      #asm("sei")
      while (1)
         {
         // Place your code here
         
         PORTA.3=1;
         delay_ms(500);
         PORTA.3=0;
         delay_ms(500);
         };
      }
      
      void ERROR ()
      {
          while (1)
          {
          PORTA.0=1;
         delay_ms(500);
         PORTA.0=0;
         delay_ms(500);
          };
      
      }
      دوش دیوانه شدم عشق مرا دید و بگفت آمدم نعره مزن جامه مدر هیچ مگو
      گفتم ای عشق من از چیز دگر می​ترسم گفت آن چیز دگر نیست دگر هیچ مگو
      من به گوش تو سخن​های نهان خواهم گفت سر بجنبان که بلی جز که به سر هیچ مگو
      قمری جان صفتی در ره دل پیدا شد در ره دل چه لطیف است سفر هیچ مگو
      مولانا

      دیدگاه


        #4
        پاسخ : مشکل در برنامه نویسی TWI

        از توابع I2C راحت میتونی استفاده کنی.
        تو مثال های Codevision هست
        خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

        دیدگاه


          #5
          پاسخ : مشکل در برنامه نویسی TWI

          سلام

          از توابع I2C به دلایلی نمیخوام ( نمیتونم) استفاده کنم .

          لطفا اگه میشه در مورد همین TWI توضیح بدین .

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

          دیدگاه


            #6
            پاسخ : مشکل در برنامه نویسی TWI

            سلام
            از Application Notes خودAtmel استفاده کن،اگر جواب نگرفتی بگو تا کمکت کنیم
            AVR310: Using the USI module as a I2C master
            AVR311: Using the TWI module as I2C slave
            لینک:
            http://www.atmel.com/dyn/products/app_notes.asp?family_id=607
            هم PDF و هم فایل فشرده برنامه رو بگیر
            اگر با کدویژن میخوای باید تبدیلش کنی
            در دیر مغان آمد یارم قدحی در دست
            مست از می می خواران از نرگس مستش مست

            دیدگاه


              #7
              پاسخ : مشکل در برنامه نویسی TWI

              سلام
              مشکلم با TWI حل شد
              از دوستانی که راهنمایی کردن ممنون .

              یه سوال : :mrgreen:

              تو TWI آی سی Slave بعد از دریافت و تشخیص آدرس خودش به تابع اینتراپت میره یا اینکه ربطی به تشخیص آدرس نداره ؟
              دوش دیوانه شدم عشق مرا دید و بگفت آمدم نعره مزن جامه مدر هیچ مگو
              گفتم ای عشق من از چیز دگر می​ترسم گفت آن چیز دگر نیست دگر هیچ مگو
              من به گوش تو سخن​های نهان خواهم گفت سر بجنبان که بلی جز که به سر هیچ مگو
              قمری جان صفتی در ره دل پیدا شد در ره دل چه لطیف است سفر هیچ مگو
              مولانا

              دیدگاه


                #8
                پاسخ : مشکل در برنامه نویسی TWI

                سلام
                شما با تغییر وضعیت روی باس به وقفه میرید و بعد با خوندن رجیستر TWSR می فهمید که چه اتفاقی افتاده
                در دیر مغان آمد یارم قدحی در دست
                مست از می می خواران از نرگس مستش مست

                دیدگاه


                  #9
                  پاسخ : مشکل در برنامه نویسی TWI



                  تفاوت I2c با twi اینه که I2c به صورت نرم افزاری ایجاد می شه و روی تمام پورت ها قابل استفاده است اما TWI سخت افزاری انجام می شه

                  دیدگاه


                    #10
                    پاسخ : مشکل در برنامه نویسی TWI

                    سلام

                    یکی دیگه از تفاوتهاشم اینه که تو I2C میکرو کنترلر Master هستش و بقیه قطعات متصل به پورت Slave

                    ولی تو TWI میکرو کنترلر هم میتونه Master باشه هم Slave

                    حالا که تاپیک دوباره اومده بالا دو تا سوال هم بپرسم . :mrgreen: (یعنی اصلا واسم مهم نیست چون تاپیک اومده بالا میپرسم :mrgreen: )

                    1. با I2C میشه بین دو تا میکرو ارتباط برقرار کرد ؟ بصورتی که میکرو ها بتونن هم Master باشن هم Slave ?
                    2. از TWI میشه برای فواصل نسبتا طولانی استفاده کرد ؟ حداثر فاصله ای که میشه ازش استفاده کرد چقدره ؟ (محیط صنعتی و به شدت نویزی است)


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

                    دیدگاه


                      #11
                      پاسخ : مشکل در برنامه نویسی TWI

                      نوشته اصلی توسط Faramarz M-S
                      1. با I2C میشه بین دو تا میکرو ارتباط برقرار کرد ؟ بصورتی که میکرو ها بتونن هم Master باشن هم Slave ?
                      2. از TWI میشه برای فواصل نسبتا طولانی استفاده کرد ؟ حداثر فاصله ای که میشه ازش استفاده کرد چقدره ؟ (محیط صنعتی و به شدت نویزی است)
                      سلام
                      بین چندتا میکرو (تا128 تا) میشه این کار رو کرد( Multi Master)
                      برای فواصل طولانی میشه،سطح ولتاژ رو ببرید بالا بهتر میشه،اما برای محیط صنعتی شاید بشه،اما از RS485 استفاده کنید بهتره
                      ما توی یه بیمارستان از TWI استفاده کردیم،با همون 5 ولت تا حدود 500 متر (فکر میکنم) جواب داد
                      در دیر مغان آمد یارم قدحی در دست
                      مست از می می خواران از نرگس مستش مست

                      دیدگاه


                        #12
                        پاسخ : مشکل در برنامه نویسی TWI

                        اقای یارمحمدی اگر براتون مقدوره یک نمونه برنامه از اتصال چند میکرو از طریق این ارتباط (ترجیحا در صورت موجود بودن نوشته شده در codevision ) توی سایت بگذارید.من توی تنظیمات wizard برای master یا slave کردن میکرو مشکل پیدا کردم . البته فکر می کنم این مثال خودش یه E- Learning خوب باشه. با تشکر :nerd:

                        دیدگاه


                          #13
                          پاسخ : مشکل در برنامه نویسی TWI

                          سلام
                          من توی تنظیمات wizard برای master یا slave کردن میکرو مشکل پیدا کردم . البته فکر می کنم این مثال خودش یه E- Learning خوب باشه. با تشکر
                          تو تنظیمات Wizard گزینه ای برای Master یا Slave کردن میکرو وجود نداره .
                          تو TWI هر میکرویی که زودتر حالتSTART ایجاد کنه (در صورت اشغال نبودن BUS) میشه Master و بقیه میکروها میشن Slave .
                          البته حالت Multi Master هم داره که من اطلاعات زیادی دربارش ندارم . فقط میدونم Master ها نوبتی کنترل باس رو در اختیار میگیرن .
                          برای ایجاد حال Start هم باید تو رجیستر TWCR بیت مربوط به Strat رو یک کنی و بعد رجیستر TWSRرو بخونی که ببینی باس خالی بوده و حالت Start ایجاد شده یا نه به همین سادگی !

                          4 تا برنامه واسه چهار مد TWI نوشتم(Master transmiter , Master reciver , Slave taransmiter , Slave reciver) که فقط یه بایت رو بین دوتا میکرو منتقل میکنه .
                          فقط موقع پروگرم کردن باید رجیستر TWBR که واسه تعیین سرعت انتقال هستش رو با توجه مقدار کریستال میکرو خودت تنظیم کنی .

                          اینم لینک http://www.4shared.com/file/36682215/9a70c15b/TWI_Example.html


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

                          دیدگاه


                            #14
                            پاسخ : مشکل در برنامه نویسی TWI

                            :nerd:از پاسخ تون ممنونم روی این برنامه ها کار می کنم اگه مشکلی داشتم مزاحمتون می شم.

                            دیدگاه


                              #15
                              پاسخ : مشکل در برنامه نویسی TWI

                              اگه بخواهیم از توابع خود کدویژن (I2c) استفاده کنیم برنامه چطور نوشته می شه. هم برای مستر و هم برای slave .

                              دیدگاه

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