اطلاعیه

Collapse
No announcement yet.

پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

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

    پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    سلام خوبین
    من دوتا میکرو دارم. به یکیش یه کیپد متصله. و به اون یکی سون سگمنت سه رقمی.
    من رو کیپد عدد وارد مکنم و مخام بعد زدن دکمه ١٤ کیپد که دکمه تایید هست عدد وارد شده به میکرو دوم منتقل بشه و اونجا رو سون سگمنت نشون بده.
    من اعداد وارده از کیپد رو با فرمولهایی به عدد واقعی تبدیل مکنم یعنی اگه ١ و ٣ زده شد اونو تبدیل به ١٣ مکنم و داخل متغیر ذخیزه مکنم.
    الان با زدن دکمه تایید مخام این محتوای متغیرم هرچنده منتقل شه میکرو بعدی.
    روش spi رو بلدم ولی بلدم فقط محتوای پورت رو بفرستم.
    اونور تو میکرو دوم هم روش نمایش رو سگمنت رو بلدم.
    فقط نمدونن چطور این محتوای متغیر رو بفرستم.

    مثلا بلدم به پورتی هست تا دیپ سویچ ببندم و وقتی دیپ سویچ هارو زدم مثلا ١١١٠٠٠١١ عددشو منتقل کنم. ولی نمدونم محتوای متغیرو چطور میفرستن؟

    #2
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    خوب کاری نداره مثلا متغیی از نوع long هست متغییر long هست 32 بیته ک چهار بایت داره شما هشت بیت هشت بیت جدا میکنید و انو به واحد spi میدی بعدی در طرف گیرنده اونو دوباره به بازسازی کرده به 32 بیت تبدیل می کنی

    دیدگاه


      #3
      پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

      نوشته اصلی توسط MM320 نمایش پست ها
      خوب کاری نداره مثلا متغیی از نوع long هست متغییر long هست 32 بیته ک چهار بایت داره شما هشت بیت هشت بیت جدا میکنید و انو به واحد spi میدی بعدی در طرف گیرنده اونو دوباره به بازسازی کرده به 32 بیت تبدیل می کنی
      نه. اعدادم بیشتر از ٩٩٩ نمیشه. لانگ نیست. من الان بلدم یه میکرو دیپ سویچ بزنم به میکرو دیگه ال سی دی مثلا. بعد دیپ سویح ها که هشتاس رو عوض کنم مثلا پورتم بشه ٠٠٠٠١١١١ و عدد متناظر اینو میکرو بعدی بگیره. الان من نمدونم اعداد صفر تا ٩٩٩ که داخل یه متغیره و با تغییر پورتها نساختم رو چطور با بروتکل بفرستم.

      مثلا باید دستوری بنویسم عذدمو تبدیل به ٠ و ١ کنه؟ بعد بفرستم

      دیدگاه


        #4
        پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

        نوشته اصلی توسط aashkanpasha نمایش پست ها
        نه. اعدادم بیشتر از ٩٩٩ نمیشه. لانگ نیست. من الان بلدم یه میکرو دیپ سویچ بزنم به میکرو دیگه ال سی دی مثلا. بعد دیپ سویح ها که هشتاس رو عوض کنم مثلا پورتم بشه ٠٠٠٠١١١١ و عدد متناظر اینو میکرو بعدی بگیره. الان من نمدونم اعداد صفر تا ٩٩٩ که داخل یه متغیره و با تغییر پورتها نساختم رو چطور با بروتکل بفرستم.

        مثلا باید دستوری بنویسم عذدمو تبدیل به ٠ و ١ کنه؟ بعد بفرستم
        نیازی به تبدیل باینری نیست شما کافیه مقدار متغییر رو هشت بیت هشت بیت با دستور AND و شیفت جدار و درون متغییر بریزید و مقدار هشت بیتها رو به واحد SPI بدید

        دیدگاه


          #5
          پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

          نوشته اصلی توسط MM320 نمایش پست ها
          نیازی به تبدیل باینری نیست شما کافیه مقدار متغییر رو هشت بیت هشت بیت با دستور AND و شیفت جدار و درون متغییر بریزید و مقدار هشت بیتها رو به واحد SPI بدید
          اخه معلوم نمیکنه عدد چند کیپد میزنه.
          تک رقمی میزنن دو رقمی میزنن سه رقمی میزنن. معلوم نمکنه.
          من میگیم تابعی بنویسم که کلا عدد رو به باینری تبدیل کنه. بعد اونو بفرسته. ٩٩٩ باینریش چنده؟

          دیدگاه


            #6
            پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

            دوست غریز شما وقتی عدد وارد مقدارذ باینری درون متتغییر ریخته میشه مگر اینکه شما از آرایه استفاده کردید مقدار تک تک عداد وارده از کیپد جدا جدا درون آرایه ریختید ولی تا اونجای یادم برنامه کیپد رو براتون نوشتم مقدار داخل متغییر می ریزه مثلا شما 999 که وارد می کنید معادل باینری میشه 1111 1110 0111 شما هشت بیت پایین یاLSB جدا می کنید میشه این 11101111 بعد بایت بالا جدا میکنید که MSB میشه
            00001110

            دیدگاه


              #7
              پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

              نوشته اصلی توسط MM320 نمایش پست ها
              دوست غریز شما وقتی عدد وارد مقدارذ باینری درون متتغییر ریخته میشه مگر اینکه شما از آرایه استفاده کردید مقدار تک تک عداد وارده از کیپد جدا جدا درون آرایه ریختید ولی تا اونجای یادم برنامه کیپد رو براتون نوشتم مقدار داخل متغییر می ریزه مثلا شما 999 که وارد می کنید معادل باینری میشه 1111 1110 0111 شما هشت بیت پایین یاLSB جدا می کنید میشه این 11101111 بعد بایت بالا جدا میکنید که MSB میشه
              00001110
              ببینین من تک تکً اعداد رو با کیپد زدم. داخل ارایه ریختم. بعد از زدن کلید تایید دستوری نوشتم که اعداد اون ارایه رو یک عدد واحد تیدیل کردم. مثلا ٣و٦و٧ رو تبدیل به ٣٦٧ کرد و اینو فرستاد به ال سی دی و چون لازمه حتما بعد زدن تایید این عدد فرستاده شه نه خین وارد کردن عدد. لذا نمتونم اعضای ارایه رو بفرستم. باید همین متغیر number که از نوع اینته رو بفرستم بره. لذا باید اون عدد رو نمدونم ١ یا ٩٩٩ بتونم هشت بیتش کنم. درسته؟ یعنی چه دستورس برای number بنویسم که بشه هشت بیت صفرو یک.

              دیدگاه


                #8
                پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                لصفا برنامه اینجا بزارید تا بهتر بتونم کمک کنم

                دیدگاه


                  #9
                  پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                  نوشته اصلی توسط MM320 نمایش پست ها
                  لصفا برنامه اینجا بزارید تا بهتر بتونم کمک کنم
                  ببخشید من دیشب متوجه منظورتون نشده بودم. امروز فهمیدم جریان چیه. دیشب خسته بودم نمیگرفتم. ببخشید. در حال انجامشم اگه موردی بود خیر میدم. مننونم
                  فقط یه سوال متفرقه: من مخام یه مچبند سون سگمنت بسازم. مثل ساعت مچی ولی توش سون سگمنا که بتونم باهاش ارتباط nrf با قطعات دیگه بگیرم. همچین ملزوماتی هست تو بازار؟ تجهیزات ساعت مچی یا سگمنت سایز خیلی کوچک فرستده گیرنده اون سایزی. ؟؟؟

                  دیدگاه


                    #10
                    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

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

                    دیدگاه


                      #11
                      پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                      ممنونم.
                      من تونستم ارتباط psi مقدار عدد مورد نظرمو انتقال بدم. عددی که سمت میکروی اول وارد شده و 16 بیت داره رو با شیفت و اند کردن به دو قسمت تقسیم کردم و منتقل کردم.
                      اینور هم تو میکرو دومم که سون سگمنت بهش وصله عدد رو بگیرم. نمایش بده- باتشکر از راهنمایی شما.
                      اما الان عدد رو فقط یک ثانیه نشون میده و خاموش میشه تا عدد بعدی وارد بشه- مخام عدد تا ورود عدد بعدی بمونه-از صبحه اینور اونورش مکنم نمدونم چی میشه. هرچیه تو نوع نمایش عدد spi شدس.
                      کد سمت سلیو یا سون سگمنته این.

                      #include <avr/io.h>
                      #include <util/delay.h>
                      #include <stdlib.h>
                      #define F_CPU 1000000




                      unsigned char state=0;
                      unsigned int number=0;
                      unsigned int num_h,num_l;
                      int a,b,c;


                      unsigned char spi(unsigned char data){ //spi is function to recived and send
                      SPDR=data;
                      while((SPSR&(1<<SPIF))==0);
                      return SPDR;
                      }


                      void segment(number){ //segment is function to show int number on segment
                      DDRD=0xff; //d port is output
                      DDRC=0xff; // c port is output
                      a=number/100;
                      number=number%100;
                      b=number/10; //a,b,c is digits of entered number
                      number=number%10;
                      c=number;

                      switch(a){
                      case 0:PORTD=0xfe; PORTC=0X3F;break;
                      case 1:PORTD=0xfe;PORTC=0X06;break;
                      case 2:PORTD=0xfe;PORTC=0X5B;break;
                      case 3:PORTD=0xfe;PORTC=0X4F;break;
                      case 4:PORTD=0xfe;PORTC=0X66;break;
                      case 5:PORTD=0xfe;PORTC=0X6D;break;
                      case 6:PORTD=0xfe;PORTC=0X7D;break;
                      case 7:PORTD=0xfe;PORTC=0X07;break;
                      case 8:PORTD=0xfe;PORTC=0X7F;break;
                      case 9:PORTD=0xfe;PORTC=0X6F;break;
                      }
                      _delay_ms(10); PORTD=0xff; PORTC=0X00;

                      switch(b){
                      case 0:PORTD=0xfd;PORTC=0X3F;break;
                      case 1:PORTD=0xfd;PORTC=0X06;break;
                      case 2:PORTD=0xfd;PORTC=0X5B;break;
                      case 3:PORTD=0xfd;PORTC=0X4F;break;
                      case 4:PORTD=0xfd;PORTC=0X66;break;
                      case 5:PORTD=0xfd;PORTC=0X6D;break;
                      case 6:PORTD=0xfd;PORTC=0X7D;break;
                      case 7:PORTD=0xfd;PORTC=0X07;break;
                      case 8:PORTD=0xfd;PORTC=0X7F;break;
                      case 9:PORTD=0xfd;PORTC=0X6F;break;
                      }
                      _delay_ms(10); PORTD=0xff; PORTC=0X00;

                      switch(c){
                      case 0:PORTD=0xfb;PORTC=0X3F;break;
                      case 1:PORTD=0xfb;PORTC=0X06;break;
                      case 2:PORTD=0xfb;PORTC=0X5B;break;
                      case 3:PORTD=0xfb;PORTC=0X4F;break;
                      case 4:PORTD=0xfb;PORTC=0X66;break;
                      case 5:PORTD=0xfb;PORTC=0X6D;break;
                      case 6:PORTD=0xfb;PORTC=0X7D;break;
                      case 7:PORTD=0xfb;PORTC=0X07;break;
                      case 8:PORTD=0xfb;PORTC=0X7F;break;
                      case 9:PORTD=0xfb;PORTC=0X6F;break;
                      }
                      _delay_ms(10); PORTA=0xff; PORTC=0X00;

                      }


                      int main(void)
                      {
                      DDRB=0X40; //config spi port
                      PORTB=0X00;

                      while (1)
                      {
                      SPCR=0X43; //control register config
                      SPSR=0X00; //select register config
                      num_h=spi(0x00); //take upper bits
                      number=num_h;
                      number=(number<<8);
                      num_l=spi(0x00); //take lower bits
                      number=(number|num_l); //create number by bits
                      PORTB|=(1<<4); //ss port should be 1 after reciveing
                      segment(number); //show number on 7segment

                      }
                      }
                      نوشته اصلی توسط MM320 نمایش پست ها
                      اطلاعی در مورد مچ بند ها توی بازارندارم ولی اگه بخوانین طراحی کنید احتمالا باید بتونید قطعات smd کوچک مثل سون سگمنت تو بازار پیدا کنید من که شهرستان هستم از بازار تهران خبری ندارم.همنطور که می دونید باید سایز مچ بندتون در حالت استاندارد مچ بندهای توی بازار طراحی کنید.موفق باشید...
                      جدیدترین ویرایش توسط aashkanpasha; ۱۸:۳۴ ۱۳۹۸/۰۵/۲۰.

                      دیدگاه


                        #12
                        پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                        نوشته اصلی توسط aashkanpasha نمایش پست ها
                        ممنونم.
                        من تونستم ارتباط psi مقدار عدد مورد نظرمو انتقال بدم. عددی که سمت میکروی اول وارد شده و 16 بیت داره رو با شیفت و اند کردن به دو قسمت تقسیم کردم و منتقل کردم.
                        اینور هم تو میکرو دومم که سون سگمنت بهش وصله عدد رو بگیرم. نمایش بده- باتشکر از راهنمایی شما.
                        اما الان عدد رو فقط یک ثانیه نشون میده و خاموش میشه تا عدد بعدی وارد بشه- مخام عدد تا ورود عدد بعدی بمونه-از صبحه اینور اونورش مکنم نمدونم چی میشه. هرچیه تو نوع نمایش عدد spi شدس.
                        کد سمت سلیو یا سون سگمنته این.

                        #include <avr/io.h>
                        #include <util/delay.h>
                        #include <stdlib.h>
                        #define F_CPU 1000000




                        unsigned char state=0;
                        unsigned int number=0;
                        unsigned int num_h,num_l;
                        int a,b,c;


                        unsigned char spi(unsigned char data){ //spi is function to recived and send
                        SPDR=data;
                        while((SPSR&(1<<SPIF))==0);
                        return SPDR;
                        }


                        void segment(number){ //segment is function to show int number on segment
                        DDRD=0xff; //d port is output
                        DDRC=0xff; // c port is output
                        a=number/100;
                        number=number%100;
                        b=number/10; //a,b,c is digits of entered number
                        number=number%10;
                        c=number;

                        switch(a){
                        case 0:PORTD=0xfe; PORTC=0X3F;break;
                        case 1:PORTD=0xfe;PORTC=0X06;break;
                        case 2:PORTD=0xfe;PORTC=0X5B;break;
                        case 3:PORTD=0xfe;PORTC=0X4F;break;
                        case 4:PORTD=0xfe;PORTC=0X66;break;
                        case 5:PORTD=0xfe;PORTC=0X6D;break;
                        case 6:PORTD=0xfe;PORTC=0X7D;break;
                        case 7:PORTD=0xfe;PORTC=0X07;break;
                        case 8:PORTD=0xfe;PORTC=0X7F;break;
                        case 9:PORTD=0xfe;PORTC=0X6F;break;
                        }
                        _delay_ms(10); PORTD=0xff; PORTC=0X00;

                        switch(b){
                        case 0:PORTD=0xfd;PORTC=0X3F;break;
                        case 1:PORTD=0xfd;PORTC=0X06;break;
                        case 2:PORTD=0xfd;PORTC=0X5B;break;
                        case 3:PORTD=0xfd;PORTC=0X4F;break;
                        case 4:PORTD=0xfd;PORTC=0X66;break;
                        case 5:PORTD=0xfd;PORTC=0X6D;break;
                        case 6:PORTD=0xfd;PORTC=0X7D;break;
                        case 7:PORTD=0xfd;PORTC=0X07;break;
                        case 8:PORTD=0xfd;PORTC=0X7F;break;
                        case 9:PORTD=0xfd;PORTC=0X6F;break;
                        }
                        _delay_ms(10); PORTD=0xff; PORTC=0X00;

                        switch(c){
                        case 0:PORTD=0xfb;PORTC=0X3F;break;
                        case 1:PORTD=0xfb;PORTC=0X06;break;
                        case 2:PORTD=0xfb;PORTC=0X5B;break;
                        case 3:PORTD=0xfb;PORTC=0X4F;break;
                        case 4:PORTD=0xfb;PORTC=0X66;break;
                        case 5:PORTD=0xfb;PORTC=0X6D;break;
                        case 6:PORTD=0xfb;PORTC=0X7D;break;
                        case 7:PORTD=0xfb;PORTC=0X07;break;
                        case 8:PORTD=0xfb;PORTC=0X7F;break;
                        case 9:PORTD=0xfb;PORTC=0X6F;break;
                        }
                        _delay_ms(10); PORTA=0xff; PORTC=0X00;

                        }


                        int main(void)
                        {
                        DDRB=0X40; //config spi port
                        PORTB=0X00;

                        while (1)
                        {
                        SPCR=0X43; //control register config
                        SPSR=0X00; //select register config
                        num_h=spi(0x00); //take upper bits
                        number=num_h;
                        number=(number<<8);
                        num_l=spi(0x00); //take lower bits
                        number=(number|num_l); //create number by bits
                        PORTB|=(1<<4); //ss port should be 1 after reciveing
                        segment(number); //show number on 7segment

                        }
                        }
                        اسکن سون سگمنت رو به عهده تایمر بذارید تا وقفه ای در کارش ایجاد نشه.

                        دیدگاه


                          #13
                          پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                          یعنی چکار کنم. ؟؟؟چطوری؟
                          نوشته اصلی توسط hossein.m98 نمایش پست ها
                          اسکن سون سگمنت رو به عهده تایمر بذارید تا وقفه ای در کارش ایجاد نشه.

                          دیدگاه


                            #14
                            پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                            نوشته اصلی توسط aashkanpasha نمایش پست ها
                            یعنی چکار کنم. ؟؟؟چطوری؟
                            یعنی روشن و خاموش کردن سون سگمنت ها رو با وقفه تایمر انجام بدید. کافیه تایمر رو جوری تنظیم کنید که حدودا هر 20 میلی ثانیه وارد وقفه بشه و وضعیت سون سگمنت ها رو تغییر بده. این عدد 20 میلی ثانیه رو دقیقا یاد ندارم درسته یا نه ولی حدودا باید همین مقدار باشه.
                            با اینکار وقتی برنامه در یک حلقه هم گرفتار شده باشه، تایمر کار اسکن سون سگمنت رو انجام میده و کاربر متوجه تغییر در نوع نمایش سون سگمنت نمیشه

                            Sent from my LG-H870S using Tapatalk

                            دیدگاه


                              #15
                              پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

                              نه دوست عزیز.
                              مشکل این نیست. سون سگمنت وقتی عدد رو نشون میده (وقتی ارتباط SPIندارم) همه چی اوکیه- و قسنگ ثابت دیده میشه. مشکل تو سون سگمنتها نیست.
                              مشکل جای دیگس-
                              ببینین عدد از کیپد وارد میشه و بازدن کلید مربع به میکرو دوم ومنتقل میشه و تابع سگمنت اون عدد رو نشون میده- ولی چون تابع سگمنت تو حلقه نیست یه بار نشون میده تموم میشه
                              باید بذارم تو یه حلقه .
                              اون حلقه باید بگه که تا عدد جدید نیومده همین عدد رو نشون بده. یعنی طرف عدد رو زد مربع رو زد باید عدد رو سگمنت بمونه تا زمانی که عدد بعدی بیاد که معلوم نیست کی بیاد.
                              باید دستور تو ارتباط رو عوض کنم:
                              کاری کنم که همون عدد رو تو حلقه هی نمایش بده هی نمایش بده تا زمانی که عدد بعدی رو منتق کنه.
                              الان مشکل اینه که عدد منتق میشه و نمیدونم تو چه حلقه ای بزارم با چه شرطی. باید کاری کنم که میکرو دوم بگه به میکرو اول عدد اومد کارتو ادامه بعد بعد اون دوباره عدد فرستاد اونو بگیره.
                              تونستم برسونم؟
                              نوشته اصلی توسط hossein.m98 نمایش پست ها
                              یعنی روشن و خاموش کردن سون سگمنت ها رو با وقفه تایمر انجام بدید. کافیه تایمر رو جوری تنظیم کنید که حدودا هر 20 میلی ثانیه وارد وقفه بشه و وضعیت سون سگمنت ها رو تغییر بده. این عدد 20 میلی ثانیه رو دقیقا یاد ندارم درسته یا نه ولی حدودا باید همین مقدار باشه.
                              با اینکار وقتی برنامه در یک حلقه هم گرفتار شده باشه، تایمر کار اسکن سون سگمنت رو انجام میده و کاربر متوجه تغییر در نوع نمایش سون سگمنت نمیشه

                              Sent from my LG-H870S using Tapatalk

                              دیدگاه

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