اطلاعیه

Collapse
No announcement yet.

دستور bitread در mplab ,xc8

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

    دستور bitread در mplab ,xc8

    سلام
    کار تابع bitRead در برنامه نویسی آردوینو برگرداندن مقدار بیت مورد نظر است که 0 یا 1 است وبه شکل bitRead(x , n); بکار میرود که x عدد مورد نظر است و n شماره بیتی است که میخواهیم برگرداند

    این دستور در کمپایلر xc8 برای mplab وجود ندارد ومیخواهم برایش زیر برنامه ای بنویسم ولی خطا میگیرم
    1 راه استفاده از تابع ltoa یا itoa هست که عدد مورد نظر را در آرایه کاراکتری قرار دهد وشماره بیت را بخوانیم
    راه دیگر آن عدد مورد نظر x را باتقسیمهای متوالی تا رسیدن به بیت مورد نظر انجام دهیم وباقیمانده را حساب کنیم
    تا کنون نتیجه نگرفتم وخروجی که میدهد اشتباه است.
    البته استفاده از تابع ltoa و itoa هم مشکل دیگری دارد که زمان اجرای برنامه تا چندین دقیقه طول میکشد در حالی که همین برنامه در آردوینو 1 ثانیه ای اجرا ونتیجه نمایش داده میشود
    برنامه یا تابعی که نیاز است مثلاً result = bitread(x , n); که result بیت مورد نظر که 0 یا 1 است و n شماره آن بیت است که چندمی باشد و x هم عددی است که میخواهیم بیت آنرا بدست آوریم والبته این x یا دسیمال است یا هگز وباید برنامه آنرا تشخیص دهد

    #2
    پاسخ : دستور bitread در mplab ,xc8

    باسلام.
    bitRead(unsigned char x,unsigned char n){




    return ((x & (1 << n)) >> n);
    }
    /*------------------------------------------*/
    #define bitRead(x,n) ((x & (1 << n)) >> n)

    تعریف به صورت ماکرو به نظر خودم بهتره چون جای اضافه نمیگیره و استک و اینا هم مصرف نمیکنه.
    جدیدترین ویرایش توسط A.I.E; ۰۱:۴۰ ۱۴۰۰/۰۶/۲۸.

    دیدگاه


      #3
      پاسخ : دستور bitread در mplab ,xc8

      نوشته اصلی توسط A.I.E نمایش پست ها
      باسلام.
      ..و استک و اینا هم مصرف نمیکنه.
      تشکر دوست عزیز
      ولی متاسفانه کار نداد
      البته قبل از ایجادتاپیک جستجوهایی زدم ونتیجه مطلوبی نگرفتم
      مثلا مشابه کد شما رو در سایتی دیدم با این تفاوت:
      return ((x & (1 << n)) ?1:0 );

      تونستم با کمی تغییر تا حدودی پاسخ بگیرم ولی فقط تا بیت 16 درست برمیگردونه ومثلاً اگر آرایه 64 بیت باشه بقیه بیتها همه 0 برگردونده میشن

      درصورت امکان اگر کسی تست کرد ونتیجه درست گرفت بنویسه
      با تشکر

      دیدگاه


        #4
        پاسخ : دستور bitread در mplab ,xc8

        نوشته اصلی توسط isfahan نمایش پست ها
        تشکر دوست عزیز
        ولی متاسفانه کار نداد
        البته قبل از ایجادتاپیک جستجوهایی زدم ونتیجه مطلوبی نگرفتم
        مثلا مشابه کد شما رو در سایتی دیدم با این تفاوت:
        return ((x & (1 << n)) ?1:0 );

        تونستم با کمی تغییر تا حدودی پاسخ بگیرم ولی فقط تا بیت 16 درست برمیگردونه ومثلاً اگر آرایه 64 بیت باشه بقیه بیتها همه 0 برگردونده میشن

        درصورت امکان اگر کسی تست کرد ونتیجه درست گرفت بنویسه
        با تشکر
        باسلام.
        این ماکرو رو من الان تست کردم و به درستی کار میکنه حتی از نتیجه ماکرو داخل if استفاده کردم که بدرستی کار کرد.

        #include <stdio.h>




        #define bitRead(x,n) ((x & (1 << n)) >> n)


        int main(){
        unsigned int x = 0b0101110001100110;
        if (bitRead(x,5))
        printf("1");
        else
        printf("0");
        return 0;
        }


        شما هم نمونه کدی که باهاش تست کردید رو قرار بدید در ضمن مطمئن بشید که کامپایلرتون میتونه با داده های 64 بیتی کار کنه.
        جدیدترین ویرایش توسط A.I.E; ۲۳:۰۸ ۱۴۰۰/۰۶/۲۹.

        دیدگاه


          #5
          پاسخ : دستور bitread در mplab ,xc8

          تشکر دوست عزیز
          کار داد
          قسمت کم ارزش به پر ارزش هم رعایت شده بود
          بصورت یک برنامه جدا گذاشتم در xc8 درست بود

          قضیه اینه که یک decrypt هست که مال کتابخانه آردوینو بوده و از دستور bitread تو اون استفاده شده
          تکه کد شما درست است ولی در برنامه کار نمیده وعدد درست رو بر نمیگردونه متاسفانه

          کد اصلی که در واقع یک library هست
          شکل فرخوانی هم اینطور هست:res(0x12345678,0x11111111,0x22222222)

          یا
          res(hex,hex,hex);
          که کلمات hex و اعدادی که نوشتم دلخواه است ولی به هگز هستند وبرگشت هم یک عدد هگز هست
          همین برنامه تو visual studio بدون تغییر عدد درست رو برمیگردونه ولی تو xc8 mplab خیر
          جدیدترین ویرایش توسط isfahan; ۲۰:۱۱ ۱۴۰۰/۰۷/۰۱.

          دیدگاه


            #6
            پاسخ : دستور bitread در mplab ,xc8

            کلا درست شد
            تبدیل کتابخانه سخته وبسیاری جاها خطاهایی میده که اصلا انتظارش نمیره وخیلی اذیت کننده هست
            به هرجهت کتابخانه هم تبدیل شد

            دیدگاه

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