اطلاعیه

Collapse
No announcement yet.

تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

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

    تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

    با سلام
    دوستان کسی میدونه تو محیط کودویژن چطوری یک متغیر 16 بیتی رو به دوتا متغیر 8 بیتی(یک بایت) تبدیل کنه به طوری که بتوان هر بایت رو از طریق SPI ارسال نمود و در طرف دیگه این دو بایت رو به همون متغیر ارسالی برگردونه !!
    اگه راهنمایی کنید ممنون میشم

    #2
    پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

    نوشته اصلی توسط >>::M#A#F#H::<<
    با سلام
    دوستان کسی میدونه تو محیط کودویژن چطوری یک متغیر 16 بیتی رو به دوتا متغیر 8 بیتی(یک بایت) تبدیل کنه به طوری که بتوان هر بایت رو از طریق SPI ارسال نمود و در طرف دیگه این دو بایت رو به همون متغیر ارسالی برگردونه !!
    اگه راهنمایی کنید ممنون میشم
    سلام
    به بیان خیلی ساده، بفرمایید:

    کد:
    void spi_16bit_MSB( unsigned int cmd)
    {
    unsigned char HI_spi_8bit;
    unsigned char LOW_spi_8bit; // in ra mitavan sade va hazf kard, baraye fahme behtar neveshtam
    unsigned int cmd_temp;
    
    cmd_temp=cmd; //farz: cmd=0xABCD
    HI_spi_8bit= cmd>>8; // HI_spi_8bit= 0xABCD>>8=0xAB;
    
    LOW_spi_8bit= cmd_temp; // LOW_spi_8bit=8bit e aval(kam arzesh)e cmd=0xCD;
    }
    تغییرات لازم رو می تونید اعمال کنید (احتمالا برای راه اندازی rfm12 نمی خوایید :mrgreen
    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

    دیدگاه


      #3
      پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

      بابا برقی دوست عزیز فایلی راجع به راه اندازی rfm12 به زبان c دارید
      اگه برام بزارید ممنونم میشم

      دیدگاه


        #4
        پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

        نوشته اصلی توسط ☺بابابرقی☺
        سلام
        به بیان خیلی ساده، بفرمایید:

        کد:
        void spi_16bit_MSB( unsigned int cmd)
        {
        unsigned char HI_spi_8bit;
        unsigned char LOW_spi_8bit; // in ra mitavan sade va hazf kard, baraye fahme behtar neveshtam
        unsigned int cmd_temp;
        
        cmd_temp=cmd; //farz: cmd=0xABCD
        HI_spi_8bit= cmd>>8; // HI_spi_8bit= 0xABCD>>8=0xAB;
        
        LOW_spi_8bit= cmd_temp; // LOW_spi_8bit=8bit e aval(kam arzesh)e cmd=0xCD;
        }
        تغییرات لازم رو می تونید اعمال کنید (احتمالا برای راه اندازی rfm12 نمی خوایید :mrgreen
        دوست عزیز من میخوام که با ()spi این 16 بیت رو ارسال کنم
        در گیرنده چطوری باید این دو بایت رو تشخیص بدم!!!!!

        دیدگاه


          #5
          پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

          نوشته اصلی توسط >>::M#A#F#H::<<
          بابا برقی دوست عزیز فایلی راجع به راه اندازی rfm12 به زبان c دارید
          اگه برام بزارید ممنونم میشم
          بله دارم، اما یه کم اضافه جات داره، ایشالا فرصت بشه یکم سر و سامونش بدم، پ می کنم داخل انجمن، اگر شد با توضیحات

          نوشته اصلی توسط >>::M#A#F#H::<<
          دوست عزیز من میخوام که با ()spi این 16 بیت رو ارسال کنم
          در گیرنده چطوری باید این دو بایت رو تشخیص بدم!!!!!
          این ماژول-rfm12 اطلاعات رو 8بیتی منتقل می کنه(16بیت که شما به ماژول می فرستید، 8بیتش دستوره و 8بیتش داده است که مفیده)
          اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

          دیدگاه


            #6
            پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای

            ببین دوست گرامی منظورمو متوجه نشدی
            من فعلا از rfm12 نمیخوام استفاده کنم میخوام از طریق پورت سریال spi یک دیتای 16 بیتی رو ارسال کنم که شما راهنمایی کردید برای جداسازی آن به دو بایت جدا گونه
            حالا من در فرستنده در حلقه while نوشتم :
            c++;
            if(c==1){
            get_data=spi(Low);// Low= bithaye 0ta7 Data 16 biti

            }
            if(c==2){
            get_data=spi(High);// High= bithaye 8ta15 Data 16 biti
            c=0;
            }
            من میخوام با این کد طی دو بار ارسال،اطلاعات 16 بیتی رو از طریق SPI به Slave بفرستم
            و دستوری هم که در گیرنده نوشتم برای تشخیص این دو بایت ارسالی( به منظور تبدیل به همان دیتای 16 بیتی ) به این صورته :
            c++;
            if(c==1){
            Low=spi(send_data);
            delay_ms(100);

            }
            if(c==2){
            High=spi(send_data);
            c=0;
            }
            lcd_clear();
            ftoa(Low,2,M);
            lcd_puts(M);
            همانطور که میبینید من فقط Low رو در Lcd نشون میدم ولی lcd هر دو بایت ارسالی رو نشون میده
            به نظرتون اشکال کجاست؟؟؟؟
            در کل منظورم اینه که چه طوری اطلاعات جدا شده رو به یک بایت تبدیل کنم(البته در حالی که از SPI() استفاده کنم)

            دیدگاه


              #7
              پاسخ : پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای

              نوشته اصلی توسط >>::M#A#F#H::<<
              ببین دوست گرامی منظورمو متوجه نشدی
              من فعلا از rfm12 نمیخوام استفاده کنم میخوام از طریق پورت سریال spi یک دیتای 16 بیتی رو ارسال کنم که شما راهنمایی کردید برای جداسازی آن به دو بایت جدا گونه
              حالا من در فرستنده در حلقه while نوشتم :
              c++;
              if(c==1){
              get_data=spi(Low);// Low= bithaye 0ta7 Data 16 biti

              }
              if(c==2){
              get_data=spi(High);// High= bithaye 8ta15 Data 16 biti
              c=0;
              }
              من میخوام با این کد طی دو بار ارسال،اطلاعات 16 بیتی رو از طریق SPI به Slave بفرستم
              و دستوری هم که در گیرنده نوشتم برای تشخیص این دو بایت ارسالی( به منظور تبدیل به همان دیتای 16 بیتی ) به این صورته :
              c++;
              if(c==1){
              Low=spi(send_data);
              delay_ms(100);

              }
              if(c==2){
              High=spi(send_data);
              c=0;
              }
              lcd_clear();
              ftoa(Low,2,M);
              lcd_puts(M);
              همانطور که میبینید من فقط Low رو در Lcd نشون میدم ولی lcd هر دو بایت ارسالی رو نشون میده
              به نظرتون اشکال کجاست؟؟؟؟
              در کل منظورم اینه که چه طوری اطلاعات جدا شده رو به یک بایت تبدیل کنم(البته در حالی که از SPI() استفاده کنم)
              فکر می کنم منظورتون 16بیت-2بایت بوده؟
              کدهایی که نوشتید کمی مبهم هست.
              به هر حال، ببینید در گیرنده شما با این کدها میتونید دوبایت رو به هم بچسبونید(یک متغیر 16بیتی داشته باشید):



              int recv;
              recv= spi(0x00); // Receive first 8bit (LOW 8bit)
              delay_us(100); // maybe need to change...
              recv+= spi(0x00)<<8; // Receive Second 8bit & or with first 8bit==> 16bit

              اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

              دیدگاه


                #8
                پاسخ : پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای

                نوشته اصلی توسط ☺بابابرقی☺
                فکر می کنم منظورتون 16بیت-2بایت بوده؟
                کدهایی که نوشتید کمی مبهم هست.
                به هر حال، ببینید در گیرنده شما با این کدها میتونید دوبایت رو به هم بچسبونید(یک متغیر 16بیتی داشته باشید):



                int recv;
                recv= spi(0x00); // Receive first 8bit (LOW 8bit)
                delay_us(100); // maybe need to change...
                recv+= spi(0x00)<<8; // Receive Second 8bit & or with first 8bit==> 16bit


                بابا برقی ممنون مشکل فعلا حل شد
                راستی من اگه بخوام یه رمان بنویسم باید از کجا شروع کنم....!!! :rolleyes: :rolleyes:

                دیدگاه


                  #9
                  پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

                  دوستان به نظرتون برای تبدیل یه متغیر float به int (به منظور جداسازی بایتها که در بالا بحث شد---چون float رو نمیشه شیفت داد---- ) چه دستورهایی هست؟
                  من اینطوری تبدیل کردم
                  float c=0x03FF;
                  unsigned int X;
                  ftoa(c,4,M);
                  X=atoi(M);
                  High=X>>8;
                  Low=X;
                  که عدد c=0x03FF (معادل 1024 مبنای10) را دوبرابر میکند
                  به نظرتون مشکل چیه؟؟؟؟؟

                  دیدگاه


                    #10
                    پاسخ : پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای

                    نوشته اصلی توسط >>::M#A#F#H::<<

                    بابا برقی ممنون مشکل فعلا حل شد
                    راستی من اگه بخوام یه رمان بنویسم باید از کجا شروع کنم....!!! :rolleyes: :rolleyes:
                    خواهش می کنم
                    اول باید خوب الفبا رو یاد بگیرید، بعدش دستور زبان رو، بعدش احتمالا کلی باید تمرین کنید، بعدش داستانک بنویسید، و بعدش کم کم برید سمت رمان نویسی :nerd:

                    نوشته اصلی توسط >>::M#A#F#H::<<
                    دوستان به نظرتون برای تبدیل یه متغیر float به int (به منظور جداسازی بایتها که در بالا بحث شد---چون float رو نمیشه شیفت داد---- ) چه دستورهایی هست؟
                    من اینطوری تبدیل کردم
                    float c=0x03FF;
                    unsigned int X;
                    ftoa(c,4,M);
                    X=atoi(M);
                    High=X>>8;
                    Low=X;
                    که عدد c=0x03FF (معادل 1024 مبنای10) را دوبرابر میکند
                    به نظرتون مشکل چیه؟؟؟؟؟
                    1- استفاده از متغیر float اینجا لزومی نداره! چون هم اعدادمون صحیح هستند و هم ما به 16بیت بیشتر احتیاج نداریم(فلوت 32بیتی هستش!)، پس همون int کفایت می کنه
                    در ضمن منظورتون چیه c رو دو برابر می کنه؟ یعنی بعد از اتمام عملیات خود متغیر c میشه 2048(مبنای دهِش)؟؟
                    2- فکر می کنم میتونید همون اول بنویسید:
                    X=c;

                    در کل مگه همون کدهای قبلی برای تفکیک و چسبوندن 16بیت جواب نداد؟!
                    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                    دیدگاه


                      #11
                      پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

                      با تشکر از راهنماییتون :smile:
                      ببین دوست عزیز
                      تا قبل ارسال اطلاعات متغیر باید از نوع float باشه و برای ارسال باید تبدیل به int بشه
                      منظورم از c همان عدد ارسالی از Master به slave که 16 بیت داره.
                      برای تبدیل هم شما درست میگید با X=c مشکلی نداره.
                      دستورات شما هم که فرمودید برای جدا کردن جواب داده ولی برای جسباندن که تو slave صورت میگیره ایراد داره
                      ایرادش هم مثلا برای 1024 در اسلیو 2048 چاپ میشه و برای اعداد مختلف جواب های متفاوت میگرم
                      البته فکر کنم ایراد از دستور شما نیست ایراد از بقیه دستوارته
                      در کل من میگم مشکل از نحوه گرفتن اطلاعات در slave حالا ببینید که اینطوریه یا نه، من که نمیدونم ایرادش کجاست
                      اینم فایل گیرنده و فرستنده ام :




                      ضمنا این پیغام هم برام جالب بود که تو شبیه سازیش با پروتئوس دیدم

                      دیدگاه


                        #12
                        پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

                        ویرایش شده ...........

                        دیدگاه


                          #13
                          پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

                          دوستان من بیخیال اون برنامه شدم و یکی دیگه نوشتم
                          الان مشکل اینه که برای هر عدد که ارسال میشه سه عدد در گیرنده نمایش میده---باز میگم اشکال از اینه که گرفتن اطلاعات سر موقع نیست برای همینه پروتئوس میگه دیتا از دست رفته-----
                          مثلا برای عدد 0x03FF=1023 سه عدد ( 1023و771و65535 ) رو نشون میده
                          اینم فایل پروژه جدید ایجاد شده


                          دیدگاه


                            #14
                            پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای ارسال با SPI

                            نوشته اصلی توسط >>::M#A#F#H::<<
                            دوستان من بیخیال اون برنامه شدم و یکی دیگه نوشتم
                            الان مشکل اینه که برای هر عدد که ارسال میشه سه عدد در گیرنده نمایش میده---باز میگم اشکال از اینه که گرفتن اطلاعات سر موقع نیست برای همینه پروتئوس میگه دیتا از دست رفته-----
                            .
                            .
                            .
                            1- لطفا فایل CV پروژه و شبیه سازی رو قرار بدید (zip کنید لطفا) برای بررسی بیشتر
                            2- به پروتئوس خیلی اطمینان نکنید، مدار رو عملی ببندید و تست کنید
                            3-
                            اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                            دیدگاه


                              #15
                              پاسخ : تبدیل یک متغیر 16 بیتی به دو تا 8 بیتی برای

                              اینم فایل c و پروتئوس
                              فایل S برای گیرنده و SR برای گیرنده
                              http://uploadkon.ir/?file=825b9a78d67bec15afeb984ca25957cc.rar

                              دیدگاه

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