اطلاعیه

Collapse
No announcement yet.

استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

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

    استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

    سلام،پس ازتنظیمات code wizard در کدویژن،به صورت پیش فرض رجیسترهارو با عملگرهای شیفتی مقداردهی می کند،درصورتی که عملگرهای شیفتی مقدار را روی پایه ها تغییر می دهند مثلا برای مقداردهی به رجیسترهای وقفه به جای آنکه ازاعداد هگزادسیمال یا باینری استفاده کند به این صورت GICR=(1<<INT0); مقداردهی میکند،چطورمیتوان تشخیص دادکدام پایه از این رجیستر اکنون چه مقداری دارد،این مقداردهی هاچگونه انجام می شوند

    #2
    پاسخ : استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

    نوشته اصلی توسط tempel نمایش پست ها
    سلام،پس ازتنظیمات code wizard در کدویژن،به صورت پیش فرض رجیسترهارو با عملگرهای شیفتی مقداردهی می کند،درصورتی که عملگرهای شیفتی مقدار را روی پایه ها تغییر می دهند مثلا برای مقداردهی به رجیسترهای وقفه به جای آنکه ازاعداد هگزادسیمال یا باینری استفاده کند به این صورت GICR=(1<<INT0); مقداردهی میکند،چطورمیتوان تشخیص دادکدام پایه از این رجیستر اکنون چه مقداری دارد،این مقداردهی هاچگونه انجام می شوند
    سلام
    ببینید فرضا من میخوام پین شماره 3 از پورت C رو خروجی تعریف کنم. مشخصه که باید بیت شماره 3 از رجیستر DDRC رو یک کنیم. خوب راه حل ساده اش اینه بیاییم و بنویسیم:

    DDRC = 0b00001000;

    راه حل دومش اینه از عملگر شیفت بیتی استفاده کنیم:

    DDRC = (1<<3);

    خوب راه حل دوم خوبیش اینه که با دیدن اون 3 میفهمیم بیت شماره 3 یک میشه. در واقع اون 3 یعنی عدد 0b00000001 رو 3 تا به سمت چپ ببر که میشه 0b00001000. دقت کنی میبینی که یک رو سه تا به سمت چپ برده و جاهای خالی رو 0 گذاشته. حالا اگر مثلا ما بخواهیم عدد 0b00100011 رو مثل قبل 3 تا به چپ شیفت بدیم میشه 0b00011000. همونطور که میبینی 1 سمت چپی به خاطر شیف دادن سرریز میکنه و از بین میره و اون دو تا 1 کنار هم 3 خونه میان سمت چپ و جاشون رو سه تا 0 میگیره.
    در مورد سوال شما هم اون عبارت
    INT0 توی کتابخونه قطعه مورد نظر به ارزش مکانی بیت مربوطه دیفاین شده:

    همونطور که تو عکس بالا مشخصه منظور از INT0 بیت شماره 6 هستش. در واقع سازنده های کدویژن اومدن و عبارت INT0 رو به شکل زیر تو کتابخونه تعریف کردن:

    #define INT0 6

    در نتیجه این سه عبارت زیر هم معنا میشن:

    GICR = (1<<INT0);
    GICR = (1<<6);
    GICR = 0b01000000;

    به همین سادگی

    دیدگاه


      #3
      پاسخ : استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

      سپاس،لطفادرموردORشدن بیت هابرای یک رجیسترمثل
      admux=((1<<mux0)|(1<<mux2)|(1<<mux4)|(1<<adlar)|(1<<refs0))
      که چرا ازعملگر ORاستفاده می شود توضیح دهید
      آیاخودتان همه این بیت هاورجیسترهارو درکدهایتان به صورت دستی وارد می کنیدیا code wizard(یعنی همه بیت ها ورجیسترهاروبایدبدانیم)

      ویک سوأل دیگردرموردصرفامحیط کنسول ونه codevisionداشتم

      برنامه ای که وقتی کاربر یک کلید خاص از صفحه کلید را نگه می دارد تازمانی که کلید نگه داشته شده یک سری عملیات خاصی را انجام دهد مثلاتازمانی که کلید فشرده شده، مقدار true را نشان دهد درغیراینصورت false را، چطور می توانیم یک کلید خاص از صفحه کلید را دربرنامه تعریف کنیم واین که آیا نیاز به حلقه داریم

      دیدگاه


        #4
        پاسخ : استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

        نوشته اصلی توسط tempel نمایش پست ها
        سپاس،لطفادرموردORشدن بیت هابرای یک رجیسترمثل
        admux=((1<<mux0)|(1<<mux2)|(1<<mux4)|(1<<adlar)|(1<<refs0))
        که چرا ازعملگر ORاستفاده می شود توضیح دهید
        آیاخودتان همه این بیت هاورجیسترهارو درکدهایتان به صورت دستی وارد می کنیدیا code wizard(یعنی همه بیت ها ورجیسترهاروبایدبدانیم)

        ویک سوأل دیگردرموردصرفامحیط کنسول ونه codevisionداشتم

        برنامه ای که وقتی کاربر یک کلید خاص از صفحه کلید را نگه می دارد تازمانی که کلید نگه داشته شده یک سری عملیات خاصی را انجام دهد مثلاتازمانی که کلید فشرده شده، مقدار true را نشان دهد درغیراینصورت false را، چطور می توانیم یک کلید خاص از صفحه کلید را دربرنامه تعریف کنیم واین که آیا نیاز به حلقه داریم
        سلام
        تو پست قبلی یک مثال زدم که فرض بگیریم بخواهیم پین 3 از PORTC رو خروجی تعریف کنیم. حال فرض میگیریم قراره پین 5 هم خروجی باشه. برای این کار باید مثل قبل بیت 3 و 5 از رجیستر DDRC رو خروجی کنیم. کسایی که درک درستی از عملگرهای بیتی پیدا نکردن میان و به شکل زیر این کارو میکنن:

        DDRC = (1<<3);
        DDRC = (1<<5);

        در ظاهر شاید این کار درست باشه ولی در واقع فقط پین5 رو خروجی میکنه؛ چرا؟ چون تو خط اول ما بیت 3 رو یک کردیم، اما توی خط دوم اومدیم و بیت 5 رو یک و بقیه بیت ها رو صفر کردیم. درواقع اومده تو خط دوم عدد 0b00100000 رو به رجیستر DDRC نسبت داده و همونطور که میبینید فقط بیت 5 یک شده و بقیه صفر هستن. راه حل این مسئله به شکل زیره:

        DDRC = (1<<3);
        DDRC = (DDRC) | (1<<5);

        حالا تو خط اول مثل قبل عمل کردیم اما خط دوم رو طوری اصلاح کردیم که عدد حاصل از شیفت به بیت 5 ام، یعنی 0b00100000 با عدد ذخیره شده در DDRC که در مرحله قبل 0b00001000 قرار داده شده OR شده و باز در DDRC قرار بگیره. حاصل این عمل عدد 0b00101000 هستش که در DDRC قرار میگیره و دقیقا میشه همون چیزی که ما میخواستیم. اما اینطور کد نوشتن یک مقدار نامرتبه و میان خط دوم رو به شکل زیر اصلاح میکنن که نمای بهتری پیدا کنه. در واقع خط زیر با خط دوم قبلی هم معنا هستن:

        DDRC |= (1<<5);

        خوب باز هم میشه بهتر عمل کرد و میان دوتا خطی که گفتم رو در یک خط به شکل زیر مینویسن که هم از نظر زیبایی قشنگتره، هم از نظر اجرایی بهینه تر:

        DDRC = (1<<3) | (1<<5);

        چون با این شکل کد نوشتن، رجیستر DDRC یک بار مقدار دهی میشه، از نظر اجرایی بهینه تره!
        در مورد سوال بعدی شما هم باید بگم که خودم هم از روش شیفت بیتی استفاده میکنم چون کدنویسی و عیب یابی اش راحتتره. ضمنا چون با اتمل استدیو کار میکنم، در نتیجه اصلا از کدویزارد نمیتونم استفاده کنم
        در مورد سوال آخر هم یکم واضحتر توضیح بدید. اگر منظور کدنویسی برای PC هستش، متاسفانه من زیاد وارد نیستم و فقط کمی ++C کار کرده بودم که تقریبا اکثر موضوعاتش یادم رفته.

        دیدگاه


          #5
          پاسخ : استفاده از عملگرهای شیفتی در مقداردهی رجیسترها

          قسمت دوم سوأل اتفاقا درموردهمون c++است
          کد PHP:
          int main(){

          string word "w";
          string name ;

          cout<<"Enter a word:\n"<<endl;
          cin>>name;
          if(
          name == word){

              for(
          int i=name == word i++){

                  
          cout << "pressed.\n"<<endl;
                      if(
          name != word){
                          
          = -1;
                      }

              }
          } else {
          cout <<"Not pressed w\n"<<endl;
          }

          return 
          0
          یعنی مثلا اگرکلیدwفشرده شد حلقه کارش روانجام بده ولی درادامه هرکجاکلید دیگری را فشار دادیم ازحلقه خارج بشه
          البته مادراینجامایلیم ازعملگر درج درجریانcinاستفاده نکنیم وهرجای برنامه درکنسول کلیدی راکه فشار می دهیم همان موقع عمل کند
          مثل بازی های کامپیوتری که باwجلو میرودوباکلیدهای دیگرعملیات دیگری انجام میدهدبدون آنکه نیاز به cin یا getline() داشته باشیم
          جدیدترین ویرایش توسط tempel; ۱۱:۰۳ ۱۳۹۷/۰۵/۱۶.

          دیدگاه

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