اطلاعیه

Collapse
No announcement yet.

سه سوال در mikroc PIC

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

    سه سوال در mikroc PIC

    سلام خدمت مهندسان عزیز
    سه تا سوال داشتم لطفن راهنمایی کنید.
    من تازه با mikroc PIC دارم کار می کنم

    1- چه طور میشه قسمت صحیح یه عدد اعشاری رو گرفت.فرض کنید عددمون Number/16=12.34 باشه و من فقط عدد صحیح یعنی 12 رو بخوام؟( چه طوری میشه فقط قسمت اعشاری رو به دست آورد؟)

    2- چه طوری دو عدد رو با هم Or و یا And کنم؟فرض کنید می خوام دو عدد 20 و 45 رو با هم Or و یا And کنم؟

    3-باقی مونده حاصل از تقسیم رو چه طوری به دست بیارم؟(با دستور modf میشه؟چه طوری؟

    ممنون :redface:

    #2
    پاسخ : سه سوال در mikroc PIC

    3-باقی مونده حاصل از تقسیم رو چه طوری به دست بیارم؟(با دستور modf میشه؟چه طوری؟
    با %
    مثلا 4%101 برابره با 1

    2- چه طوری دو عدد رو با هم Or و یا And کنم؟فرض کنید می خوام دو عدد 20 و 45 رو با هم Or و یا And کنم؟
    برای اون که OR که شما میخواین (یعنی Bitwise OR ) از | و برای AND از & استفاده میشه.

    1- چه طور میشه قسمت صحیح یه عدد اعشاری رو گرفت.فرض کنید عددمون Number/16=12.34 باشه و من فقط عدد صحیح یعنی 12 رو بخوام؟( چه طوری میشه فقط قسمت اعشاری رو به دست آورد؟)
    برای تبدیل نوع متغیر کافیه قبل متغیر نوع مورد نظر رو داخل پرانتز بنویسید:

    کد:
    unsigned int A;
    double B;
    A=(unsigned int) B;
    خویشتن را اصلاح کنید تا خداوند کارها را اصلاح کند. امیر المومنین علی (ع)

    دیدگاه


      #3
      پاسخ : سه سوال در mikroc PIC

      ممنون از پاسختون
      دستور modf برای چیه؟
      آیا برای این کارای که من خواستم هست؟

      دیدگاه


        #4
        پاسخ : سه سوال در mikroc PIC

        نوشته اصلی توسط Majid.ebru
        1- چه طور میشه قسمت صحیح یه عدد اعشاری رو گرفت.فرض کنید عددمون Number/16=12.34 باشه و من فقط عدد صحیح یعنی 12 رو بخوام؟( چه طوری میشه فقط قسمت اعشاری رو به دست آورد؟)
        متغیر رو از نوع char تعریف کنین و مستقیم نتیجه ی تقسیم رو بریزین توش.ارقام اعشاری بعد از ممیز حذف میشن و محاسبه ی دیگه ای نمیخواد.

        برای قسمت اعشاری(بعد از ممیز)؛ متغیر رو از نوع float تعریف کنین و حاصل تقسیم رو توی اون متغیر هم بریزین و اختلاف دو تا محاسبه رو توی همون متغیر float بریزین.نتیجه رو ضرب در دقت مطلوب خودتون بعد از اعشار، بکنین.(10-100-1000) دوباره نتیجه رو توی یه متغیر از نوع char بریزین تا بقیه مقادیر حذف بشن.(خودتون بهتر میدونین در صورتی که دقتتون دو رقم اعشار باشه شدنی هست و اگه دقت 3 رقم باشه تا 255 میتونین اینکار رو بکنین و بیشتر از اون باید متغیر از نوع int انتخاب بشه)

        امیدوارم واضح گفته باشم.

        دیدگاه


          #5
          پاسخ : سه سوال در mikroc PIC

          سلام
          شرمنده توی مرحله اول گیر افتادم و نتونستم بقیه مراحل رو چک کنم لطفا راهنمایی کنید.
          قراره یه سری دیتا به شکل :*xxx*xxx*xxx*xxx*xxx* که x مقادیری بین 0 تا 9 و a تا f هست و به شکل زیر ارسال میشه
          کد:
              else if (loop == 2)        // send data 1 64
              {//if 1 send_data
                  count1 = 0;
                  for (i = 0 ; i < 9 ; i++)
                  {//for 1 send_data
                      num2 = 0;
                      if ((i % 4) == 0)
                      {//if 2 send_data
                              writebuff[i] = '*' ;
                      }//if 2 send_data
                      else
                      {//else 1 send_data
                          for (j = 0 ; j <3 ; j++)
                          {//for 2 send_data
                              num3 = ary[count1++] * pow(10 , j) ;
                              num2 = ( num2 | num3 );
          //--------------------------------------------------------------------------
                              switch ( num2 )        // Sensor Value
                              {//switch 1 send_data
                                  case 0 :
                                          writebuff[i] = '0' ; break;
                                  case 1 :
                                          writebuff[i] = '1' ; break;
                                  case 10 :
                                          writebuff[i] = '2' ; break;
                                  case 11 :
                                          writebuff[i] = '3' ; break;
                                  case 100 :
                                          writebuff[i] = '4' ; break;
                                  case 101 :
                                          writebuff[i] = '5' ; break;
                                  case 110 :
                                          writebuff[i] = '6' ; break;
                                  case 111 :
                                          writebuff[i] = '7' ; break;
                                  case 1000 :
                                          writebuff[i] = '8' ; break;
                                  case 1001 :
                                          writebuff[i] = '9' ; break;
                                  case 1010 :
                                          writebuff[i] = 'a' ; break;
                                  case 1011 :
                                          writebuff[i] = 'b' ; break;
                                  case 1100 :
                                          writebuff[i] = 'c' ; break;
                                  case 1101 :
                                          writebuff[i] = 'd' ; break;
                                  case 1110 :
                                          writebuff[i] = 'e' ; break;
                                  case 1111 :
                                          writebuff[i] = 'f' ; break;
                              }//------- switch 1 send_data
                          }//----------- for 2 send_data
                      }//--------------- else 1 send_data
                  }//------------------- for 1 send_data
              }
          اما پاسخ به صورت زیر هست :
          کد:
          +111*101*027*0ï*0—8*080*248*010*›ó\*226*a02*520*002*0f0*ad1*300
          البته الان تا قسمتی درست کار کرد فکر کنم ترسید اما دفعه قبل کاراکترهای دیگه ای پس می فرستاد؟

          دیدگاه


            #6
            پاسخ : سه سوال در mikroc PIC

            سلام.ببخشید دیروز وقت نشد جواب بدم.

            case رو اشتباه مقدار دهی کردین.میکروی بدبخت هم اساسی رفته سرکار!تو case داره دنبال 10 و100 و 101 میگرده به جای 2و4و5!! (که منظور شما 2و4و5و... باید باشه؟)
            فعلا همین رو اصلاح کنین تا ببینیم چی میشه!

            راستی، خطوط اضافی برنامه رو حذف کنین تا راحت بشه تحلیلش کرد.

            دیدگاه


              #7
              پاسخ : سه سوال در mikroc PIC

              سلام
              ممنون از پاسختون
              خیلی از مشکلات حل شد الا این
              [quote author=شاهرخ مستقیمی ]
              case رو اشتباه مقدار دهی کردین.[/quote]
              چرا اینجوری؟ من که عدد رو در توانهای از 10 ضرب می کنم و Switch نباید دنبال 2و4و5و... اینها باشه؟ :cry:
              الان میکرو پاسخ میده : ( حروف بزرگ به جهت جدا کردن اعداد ارسالی هست )
              کد:
              Report Id: 0
              
              U000U0M0U300U400U500U600U700U800U900Ua00U410Ue10U820U230Uc30U640
              
              Report Id: 0
              
              U050Ua50U460Ue60Ucd0Ua41U8b1U622U492U203U073Ued3Ud83U7e3U000U000
              اینجا مشکل دارم U000U0M0U

              توی case از دستور Default هم استفاده کردم و حرف M رو می فرستم اما هنوز مشکل دارم
              تا خونه ای شماره 19 از آرایه ary فقط اعداد 0 و 1 ریختم و می خوام هر 4 تا از خونه های آرایه رو تبدیل به هگز کنم ( چون فقط دیجیتال هستن مثل ورودی و خروجی )و توی کامپیوتر دریافت کنم.
              از خونه ای 20 تا 47 هر سه خونه نمایانگر یه عدد هست ، که اونها رو الان دارم درست دریافت می کنم.
              من منظورم باینری کردن هر 4 تا خونه از ارایه هست اما نمی دونم چرا عدد رو وقتی Or می کنم باز همون عدد دسیمال رو می ده؟؟
              توی کیسه همه اعداد رو به دسیمال ( 3و4و5و....) تبدیل کردم اما باز نشد؟
              لطفا راهنمایی کنید ؟ :angry:

              دیدگاه


                #8
                پاسخ : سه سوال در mikroc PIC

                امکانش هست واضح از اول بفرمایین قصد انجام چه کاری رو دارین؟ من که اصلا سر در نیاوردم هدفتون از انجام این کارها چی هست! اگه میخواین دیتایی رو به کامپیوتر بفرستین؛خوب دیتا رو به همون شکلی که هست بفرستین دیگه! دیگه چه نیازه که تبدیلش بکنین و...
                بیشتر توضیح بفرمایین تا یه خرده قانع بشم! :nerd:

                دیدگاه


                  #9
                  پاسخ : سه سوال در mikroc PIC

                  سلام
                  قرار 20 تا دیتا دیجیتال ( ورودی یا خروجی ) به همراه 27 تا عدد ( 0xfff = 4095 decimal) را به کامپیوتر بفرستم.
                  حالا این 47 دیتا رو توی یه ارایه می ریزم و 2 بار می فرستم.
                  مقدار Report Length به طور پیش فرض 64 تا هست ، برای همین طی دو دفعه دیتا رو ارسال می کنم.
                  تفاوت اعداد این آرایه به این صورت هست که تا خونه 20ام مقادیر به صورت 0 و 1 هست و بقیه اعداد معمولی.

                  دیدگاه


                    #10
                    پاسخ : سه سوال در mikroc PIC

                    خب...الان روشن شد قضیه.
                    شما الان اون20تا دیتای دیجیتالی رو میخواین تبدیلش کنی به 3 بایت(2بایت و نیم که نصف بایت آخری خالیه)
                    اما میکرو داره مثل بزغاله :mrgreen: از دستتون فرار میکنه!
                    این قطعه کد رو نگاه کنین،تو این برنامه 8تا سنسور به پورت B وصل هستن و 2 تا هم به پورتD و من میخوام اونها رو بخونم و کل این 10 تا سنسور رو تو یه متغیر داشته باشم.لذا یه زیربرنامه اینجوری نوشتم:

                    کد:
                    int Read_sensor()
                    {
                    int sens,h_sens;
                    sens=Portb;
                    h_sens=portd;
                    h_sens=h_sens&0xC0;
                    h_sens=h_sens << 2;
                    sens=h_sens|sens;
                    return sens;
                    }
                    هرجا لازم داشتم سنسورها رو بخونم؛تو برنامه ی اصلی یه متغیر از نوع int تعریف کرده بودم (مثلا به اسم data_sensor) و مینوشتم:
                    کد:
                    data_sensor=Read_sensor();
                    امیدوارم به دردتون بخوره.اگه همچنان برطرف نشده،بگین تا یه جور دیگه باهاش برخورد بکنیم!!

                    دیدگاه


                      #11
                      پاسخ : سه سوال در mikroc PIC

                      ممنون
                      الان چیزی متوجه نشدم؟! :cry: :rolleyes: :sad: oo:
                      اگه اجازه بدید برگردیم سر سوال خودم چون الان وقته نوشتن و فهمیدن یه تابع دیگه رو ندارم؟!؟( هولم - اما چشم می خونمش )
                      سوال : چرا دستور Switch درست کار نمی کنه؟

                      دیدگاه


                        #12
                        پاسخ : سه سوال در mikroc PIC

                        برادرجان...هول نشو! همین رو با دقت بخون.مشکل شما اینجاست: دیتاهایی که به شکل 0 و 1 دریافت میکنی؛ میخوای تبدیلش کنی به فرم هگز.درسته؟ اگه آره؛ شما اینکار رو باید انجام بدی:
                        بار اول که دیتای یه سنسور رو میخونی؛باید یه دونه شیفت بدی به چپ و متغیر رو یه جای دیگه ذخیره کنی.دیتای جدید که اومد؛ اون رو با متغیر قبلی که ذخیره کردی،OR میکنی؛اما نه OR منطقی! OR بیتی؛ یعنی این خط از برنامه:
                        کد:
                        sens=h_sens|sens;
                        من متوجه شدم که شما کجای کار اشکال دارین؛عجله نکنین و با دقت برنامه ای که خیلی خیلی هم ساده هست و تو پست قبلی گذاشتم رو بخونین.

                        دیدگاه


                          #13
                          پاسخ : سه سوال در mikroc PIC

                          بذارین برنامه ی قبلی رو براتون تحلیل کنم و بعدش برم بخوابم! :rolleyes:

                          کد:
                          int Read_sensor()
                          {
                          int sens,h_sens;
                          sens=Portb;
                          h_sens=portd;
                          h_sens=h_sens&0xC0;
                          h_sens=h_sens << 2;
                          sens=h_sens|sens;
                          return sens;
                          }
                          ما بین دوتا کروشه 7 سطر برنامه هست که به ترتیب:
                          1-تعریف دوتا متغیر از توع int
                          2-اطلاعات پورت B توی متغیر sens ریخته میشه.
                          3-اطلاعات پورت D توی متغیر h_sens ریخته میشه که پینهای D.7 و D.6 سنسورهامون هستن و باید اونها رو یه جوری از سایر اطلاعات بدست اومده جدا کنیم.(یعنی خط بعدی)
                          4-برای اطمینان از اینکه این متغیر هیچگونه اطلاعات اضافی همراه خودش نداشته باشه (شاید اون یکی پایه ها هم ورودی باشن؛اما فقط پایه های D.7 و D.6برای ما مهم هستن) میایم و این اطلاعات و عدد C0 رو با هم AND میکنیم.(1100,0000) حله؟
                          5-متغیرh_sens رو دوتا شیفت میدم به چپ تا برای متغیر sens جا باز کنم.الان توی h_sens این اطلاعات وجود خواهد داشت(با فرض اینکه هر دوتا سنسور روی پورتD مقدار1 رو برگردونن) 11,0000,0000
                          6-متغیر h_sensو sens با هم OR میشن و نتیجه توی متغیر sens ریخته میشه.
                          7-محتوای متغیر sens برگردونده میشه به محل فراخوانی شده در برنامه ی اصلی.

                          دیگه ساده تر از این امکان نداشت توضیح بدم!
                          شب بخیر...

                          دیدگاه


                            #14
                            پاسخ : سه سوال در mikroc PIC

                            سلام
                            ممنون از دوستان
                            اون کدی که نوشتم درست کار می کنه
                            اشتباه از من بود ، چون توی برنامه مقدار متغیر ها رو عوض می کردم و بعد انتظار داشتم همون مقدار اولیه رو ببینم
                            شرمنده :biggrin: :wow: :icon_razz: :rolleyes:

                            دیدگاه

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