اطلاعیه

Collapse
No announcement yet.

وقفه i2c در حالت slave

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

    وقفه i2c در حالت slave

    درود دستان ،

    در ارتباط بین دوتا میکروکنترلر از طریق i2c آیا وقفه ای وجود داره که مبنی بر این باشه که میکروی مستر میکروی فعلی (اسلاو) رو صدا زده ؟
    کامپایلر کدویژن .

    #2
    پاسخ : وقفه i2c در حالت slave

    توی رجیستر TWCR وقتی بیت TWIE فعال باشه و TWI و کارش رو تموم کنه بیت 7 همین رجیستر یعنی TWINT بالا میره که اگر وقفه عمومی هم فعال باشه وارد روال سرویس به وقفه میشه.
    حالا میتونه اینکار صدا زدن میکرو دیگه و دریافت بیت تایید باشه :smile:
    ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

    امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

    دیدگاه


      #3
      پاسخ : وقفه i2c در حالت slave

      نوشته اصلی توسط AliRezaDAVE
      توی رجیستر TWCR وقتی بیت TWIE فعال باشه و TWI و کارش رو تموم کنه بیت 7 همین رجیستر یعنی TWINT بالا میره که اگر وقفه عمومی هم فعال باشه وارد روال سرویس به وقفه میشه.
      حالا میتونه اینکار صدا زدن میکرو دیگه و دریافت بیت تایید باشه :smile:
      ممنون دوست گرامی
      ولی تقریبا هیچی از حرفهاتون متوجه نشدم :cry2:
      ببینید یکی از میکرو ها مستر و یکی دیگه اسلاو هست . حالا وقتی مستر آدرس اسلاو را برای خواندن صدا میزنه توی میکروی اسلاو آیا وقفه ای داره ؟
      اگه داره توی کدویژن چیه .

      دیدگاه


        #4
        پاسخ : وقفه i2c در حالت slave

        در رجیستر TWCR یک بیت وجود داره به اسم TWINT که هروقت واحد TWI کاری رو انجام بده، به شرطی که بیت فعال ساز وقفه یعنی TWIE از همین رجیستر و همچنین وقفه عمومی فعال باشه، با یک شدنش روال وقفه رو صدا میزنه.
        حالا اگر مستر یک ارسال یا فراخوانی داشته باشه و کار تموم بشه این بیت یک میشه و کد وضعیت در رجیستر TWSR قابل خوندنه.
        به همین ترتیب اگر یک اسلیو داشته باشیم که آدرسش روی باس قرار گرفته باشه و صدا زده شده باشه، بیت TWINT یک شده و به شرط فعال بودن بیت های مربوط به وقفه در همین رجیستر TWCR میتونه وارد روال رسیدگی به وقفه بشه.
        :smile:
        ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

        امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

        دیدگاه


          #5
          پاسخ : وقفه i2c در حالت slave

          نوشته اصلی توسط AliRezaDAVE
          در رجیستر TWCR یک بیت وجود داره به اسم TWINT که هروقت واحد TWI کاری رو انجام بده، به شرطی که بیت فعال ساز وقفه یعنی TWIE از همین رجیستر و همچنین وقفه عمومی فعال باشه، با یک شدنش روال وقفه رو صدا میزنه.
          حالا اگر مستر یک ارسال یا فراخوانی داشته باشه و کار تموم بشه این بیت یک میشه و کد وضعیت در رجیستر TWSR قابل خوندنه.
          به همین ترتیب اگر یک اسلیو داشته باشیم که آدرسش روی باس قرار گرفته باشه و صدا زده شده باشه، بیت TWINT یک شده و به شرط فعال بودن بیت های مربوط به وقفه در همین رجیستر TWCR میتونه وارد روال رسیدگی به وقفه بشه.
          :smile:
          متشکر
          میشه بگید توی کدویژن چطوری میشه یه فانکشن برای رسیدگی به این وقفه ایجاد کرد ؟ راستش جستججو کردم به هیچ نتیجه ای نرسیدم
          بارم ممنون که کمک میکنید

          دیدگاه


            #6
            پاسخ : وقفه i2c در حالت slave

            توی همون کدویزارد وقتی دارید تنظیمات TWI رو انجام میدید بیت فعال سازی وقفه رو فعال کنید. قسمت مربوط به 2WIRE.
            بعد براتون اول برنامه یک روال بررسی وقفه ایجاد میکنه که اونجا می تونید وقتی وقفه مربوط اتفاق افتاد کد لازم رو اجرا کنید.
            :smile:
            ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

            امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

            دیدگاه


              #7
              پاسخ : وقفه i2c در حالت slave

              نوشته اصلی توسط AliRezaDAVE
              توی همون کدویزارد وقتی دارید تنظیمات TWI رو انجام میدید بیت فعال سازی وقفه رو فعال کنید. قسمت مربوط به 2WIRE.
              بعد براتون اول برنامه یک روال بررسی وقفه ایجاد میکنه که اونجا می تونید وقتی وقفه مربوط اتفاق افتاد کد لازم رو اجرا کنید.
              :smile:
              مرسی دوشت گرامی
              ولی من تنظیمات رو انجام ولی روال بررسی وقفه برام ایجاد نکرد :cry2: اگه میشه کدی که میگید ایجاد میشه رو بزارید .
              این چیزیه که به من تحویل داد :

              منظورتون همین فانکشن twi_rx_handler هستش ؟ امتحان کردم فقط موقعی که Match Any Slave Address فعال باشه و ادرسش هم صفر باشه و فرستنده هم آدرسی که برای نوشتن انتخاب میکنه صفر باشه اتفاق میفته توی حالت های دیگه فانکشن اتفاق نمیفته :cry2:
              یعنی یک جورایی ادرس ها مچ نمیشن

              کد:
              /*****************************************************
              This program was produced by the
              CodeWizardAVR V2.05.3 Standard
              Automatic Program Generator
              © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
              http://www.hpinfotech.com
              
              Project : 
              Version : 
              Date  : 06/07/2014
              Author : TOOFAN
              Company : 
              Comments: 
              
              
              Chip type        : ATmega32
              Program type      : Application
              AVR Core Clock frequency: 8.000000 MHz
              Memory model      : Small
              External RAM size    : 0
              Data Stack size     : 512
              *****************************************************/
              
              #include <mega32.h>
              
              // Alphanumeric LCD functions
              #include <alcd.h>
              
              // TWI functions
              #include <twi.h>
              
              // TWI Slave receive buffer
              #define TWI_RX_BUFFER_SIZE 1
              unsigned char twi_rx_buffer[TWI_RX_BUFFER_SIZE];
              
              // TWI Slave transmit buffer
              #define TWI_TX_BUFFER_SIZE 1
              unsigned char twi_tx_buffer[TWI_TX_BUFFER_SIZE];
              
              // TWI Slave receive handler
              // This handler is called everytime a byte
              // is received by the TWI slave
              bool twi_rx_handler(bool rx_complete)
              {
              if (twi_result==TWI_RES_OK)
                {
                // A data byte was received without error
                // and it was stored at twi_rx_buffer[twi_rx_index]
                // Place your code here to process the received byte
                // Note: processing must be VERY FAST, otherwise
                // it is better to process the received data when
                // all communication with the master has finished
              
                }
              else
                {
                // Receive error
                // Place your code here to process the error
              
                return false; // Stop further reception
                }
              
              // The TWI master has finished transmitting data?
              if (rx_complete) return false; // Yes, no more bytes to receive
              
              // Signal to the TWI master that the TWI slave
              // is ready to accept more data, as long as
              // there is enough space in the receive buffer
              return (twi_rx_index<sizeof(twi_rx_buffer));
              }
              
              // TWI Slave transmission handler
              // This handler is called for the first time when the
              // transmission from the TWI slave to the master
              // is about to begin, returning the number of bytes
              // that need to be transmitted
              // The second time the handler is called when the
              // transmission has finished
              // In this case it must return 0
              unsigned char twi_tx_handler(bool tx_complete)
              {
              if (tx_complete==false)
                {
                // Transmission from slave to master is about to start
                // Return the number of bytes to transmit
                return sizeof(twi_tx_buffer);
                }
              
              // Transmission from slave to master has finished
              // Place code here to eventually process data from
              // the twi_rx_buffer, if it wasn't yet processed
              // in the twi_rx_handler
              
              // No more bytes to send in this transaction
              return 0;
              }
              
              // Declare your global variables here
              
              void main(void)
              {
              // Declare your local variables here
              
              // Input/Output Ports initialization
              // Port A initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTA=0x00;
              DDRA=0x00;
              
              // Port B initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTB=0x00;
              DDRB=0x00;
              
              // Port C initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTC=0x00;
              DDRC=0x00;
              
              // Port D initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTD=0x00;
              DDRD=0x00;
              
              // TWI initialization
              // Mode: TWI Slave
              // Match Any Slave Address: Off
              // I2C Bus Slave Address: 0x0F
              twi_slave_init(false,0x0F,twi_rx_buffer,sizeof(twi_rx_buffer),twi_tx_buffer,twi_rx_handler,twi_tx_handler);
              
              // Alphanumeric LCD initialization
              // Connections are specified in the
              // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
              // RS - PORTA Bit 0
              // RD - PORTA Bit 1
              // EN - PORTA Bit 2
              // D4 - PORTA Bit 4
              // D5 - PORTA Bit 5
              // D6 - PORTA Bit 6
              // D7 - PORTA Bit 7
              // Characters/line: 16
              lcd_init(16);
              
              // Global enable interrupts
              #asm("sei")
              
              while (1)
                 {
                 // Place your code here
              
                 }
              }
              این کد میکروی فرستنده :
              کد:
              /*****************************************************
              This program was produced by the
              CodeWizardAVR V2.05.3 Standard
              Automatic Program Generator
              © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
              http://www.hpinfotech.com
              
              Project : 
              Version : 
              Date  : 06/07/2014
              Author : TOOFAN
              Company : 
              Comments: 
              
              
              Chip type        : ATmega32
              Program type      : Application
              AVR Core Clock frequency: 8.000000 MHz
              Memory model      : Small
              External RAM size    : 0
              Data Stack size     : 512
              *****************************************************/
              
              #include <mega32.h>
              
              // Alphanumeric LCD functions
              #include <alcd.h>
              
              // TWI functions
              #include <twi.h>
              
              #include <delay.h>
              
              // Declare your global variables here
              unsigned char fi2c_read(char slave_address, char reg_address)
              {
                char data;
                twi_master_trans(slave_address>>1, &reg_address, 1, &data, 1);
                return data;
              }
              
              void fi2c_write(char slave_address, char reg_address, char data)
              {
                char tx_buf[2];
                tx_buf[0] = reg_address;
                tx_buf[1] = data;
                twi_master_trans(slave_address>>1, &tx_buf[0], 2, 0, 0);
              } 
              
              void main(void)
              {
              // Declare your local variables here
              
              // Input/Output Ports initialization
              // Port A initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTA=0x00;
              DDRA=0x00;
              
              // Port B initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTB=0x00;
              DDRB=0x00;
              
              // Port C initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTC=0x00;
              DDRC=0x00;
              
              // Port D initialization
              // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
              // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
              PORTD=0x00;
              DDRD=0x00;
              
              // TWI initialization
              // Mode: TWI Master
              // Bit Rate: 100 kHz
              twi_master_init(100);
              
              // Alphanumeric LCD initialization
              // Connections are specified in the
              // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
              // RS - PORTA Bit 0
              // RD - PORTA Bit 1
              // EN - PORTA Bit 2
              // D4 - PORTA Bit 4
              // D5 - PORTA Bit 5
              // D6 - PORTA Bit 6
              // D7 - PORTA Bit 7
              // Characters/line: 8
              lcd_init(8);
              
              // Global enable interrupts
              #asm("sei")
              
              while (1)
                 {
                 // Place your code here
                 fi2c_write(0x0F,0b11111111,0b01010101); 
                 delay_ms(1000);
                 }
              }

              دیدگاه


                #8
                پاسخ : وقفه i2c در حالت slave

                راستش تو کد ویزاد باید قبل از تابع main این کد رو ایجاد کنه:
                کد:
                interrupt [TWI] void twi_isr(void)
                {
                // Place your code here
                
                }
                راستش من تابحال از توابع آماده استفاده نکردم و برنامه اش رو خودم مینوشتم. ولی پیشنهاد میدم توی میکرو گیرنده کد بالا رو قبل از main اضافه کنید. توی تنظیمات ارسالی هم بیت twie رو یک کن. یعنی بذار:
                کد:
                twi_master_init(101);
                ببین چی میشه. توی کد رسیدگی به وقفه هم مثلا یک پایه میکرو رو یک کنه
                ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

                امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

                دیدگاه


                  #9
                  پاسخ : وقفه i2c در حالت slave

                  نوشته اصلی توسط AliRezaDAVE
                  راستش تو کد ویزاد باید قبل از تابع main این کد رو ایجاد کنه:
                  کد:
                  interrupt [TWI] void twi_isr(void)
                  {
                  // Place your code here
                  
                  }
                  راستش من تابحال از توابع آماده استفاده نکردم و برنامه اش رو خودم مینوشتم. ولی پیشنهاد میدم توی میکرو گیرنده کد بالا رو قبل از main اضافه کنید. توی تنظیمات ارسالی هم بیت twie رو یک کن. یعنی بذار:
                  کد:
                  twi_master_init(101);
                  ببین چی میشه. توی کد رسیدگی به وقفه هم مثلا یک پایه میکرو رو یک کنه
                  بازم ممنون
                  راستش از این وقفه میخوام استفاده کنم میگه که قبلا براش تابع توی twi.lib نوشته شده :cry2:
                  چیکار کنم ؟ اگه میشه بگید چطوری برنامه اش رو مثل خودتون دستی راه اندازی کنم .

                  دیدگاه


                    #10
                    پاسخ : وقفه i2c در حالت slave

                    به یه نتایجی رسیدم الان فقط موندم از اسلاو چطور باید به مستر اطلاعات رو ارسال کنم ؟

                    دیدگاه


                      #11
                      پاسخ : وقفه i2c در حالت slave

                      به نظرم بهتره توی نت یکم سرچ بزنید و در مورد i2c اطلاعات جمع آوری کنید و خودتون براش برنامه نویسی کنید.
                      چون تا زمانی که با تمام پروتکل آشنا نباشید نمیشه حق مطلب رو ادا کرد و این تاپیک میتونه همین طور ادامه داشته باشه. بعدش اگر بازهم سوالی بود در خدمتم
                      ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

                      امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

                      دیدگاه


                        #12
                        پاسخ : وقفه i2c در حالت slave

                        نوشته اصلی توسط AliRezaDAVE
                        به نظرم بهتره توی نت یکم سرچ بزنید و در مورد i2c اطلاعات جمع آوری کنید و خودتون براش برنامه نویسی کنید.
                        چون تا زمانی که با تمام پروتکل آشنا نباشید نمیشه حق مطلب رو ادا کرد و این تاپیک میتونه همین طور ادامه داشته باشه. بعدش اگر بازهم سوالی بود در خدمتم
                        کاملا حق باشماست و قبول دارم ، خودم هم همیشه کتابخونه هام رو همینجوری درست میکنم و از لحاظ بهینه بودن هم خیلی خوب جواب میده (دست خودمونه دیگه)

                        اما راستش من وقت زیادی ندارم سر این پروژه
                        الان به ایجاد رسیدم که با مسترم آدرس اسلاو رو در (مد خواندن _بیت آخر صفر) صدا میزنم و توی اسلاو هم به خوبی به وقفه مورد نظر پرش میکنم و یک بایتی که از مستر رسیده رو هم به خوبی دارمش و میتونم چاپ کنم . اما الان در پاسخ مستر باید روی باس i2c بنویسم اما فاکنشنی برای نوشتن از طرف اسلاو نیست :cry2:

                        دیدگاه


                          #13
                          پاسخ : وقفه i2c در حالت slave

                          کد زیر، رسیدگی به وقفه است که اگر درخواست دریافت اطلاعات از اسلاو بشه عدد44 هگز رو ارسال میکنه.
                          کد:
                          interrupt [TWI] void twi_isr(void)
                          { 	
                          	unsigned char status;
                          	status = TWSR & 0xF8;     	
                           	switch(status)
                            {                 
                          
                             case 0x98:      
                               TWCR=(1<<TWINT);break;   
                              	     
                             case 0xA8: 
                             	TWDR=0x44; 
                               TWCR|=(1<<TWINT); 
                             	break;		
                            }  	                    
                          	 TWCR|=(1<<TWINT); 
                          }
                          ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

                          امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

                          دیدگاه


                            #14
                            مشکل کتابخانه کدویژن با i2c در حالت slave

                            درود دوستان ،
                            بنده twi رو در کدویژن رو در حالت slave پیکر بندی کردم و با یک میکروی دیگه در حالت مستر ارتباط برقرار کردم و به خوبی آدرسش مچ میشه و مستر میتونه اطلاعات رو بفرسته و اسلاو دریافتش میکنه اما موقعی که میخوام از مستر اطلاعات اسلاو رو بخونم اطلاعات غلط ارسال میشه :sad:

                            برای خوندن در مستر از کد زیر استفاده میکنم :

                            کد:
                            while (1)
                               {
                               unsigned char a[3];
                               // Place your code here   
                               twi_master_trans(0b10010000, 0, 0, a, 3);  
                               lcd_puts(a); 
                               delay_ms(1000);
                               }
                            }
                            در slave متغیر twi_tx_buffer سایزش رو 3 قرار دادم و سه بایت هم داخلش ریختم .

                            مشکل ایجاست که وقتی مستر شروع میکنه به خوند اسلاو بایت اول رو به اینصورت میفرسته که یکدونه شیفت میخوره به راست و بیت با ارزشش هم (شماره 7) 1 میشه همیشه . مثلا اگه 0b00000010 رو در بافر اسلاو گذاشته باشیم اسلاو چیزی که روی خط میفرسته 0b10000001 هستش . و بایت های بعدی رو هم همه رو 0b11111111 میفرسته

                            از دوستان کسی تونسته با لایبراری کدویژن میکرو رو تو حالت اسلاو قرار بده و با یک مستر ازش بخونه ؟

                            دیدگاه

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