اطلاعیه

Collapse
No announcement yet.

نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

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

    نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

    دوستان چطور مقادیر 1111 در رجیستر WDTCR با خط زیر نوشته میشه؟؟

    کد:
    WDTCR |= ( 1 << WDCE) | (1 << WDE) | (1 << WDP2) | ( 1 << WDP1) | (1 << WDP0);
    منظورم اینه چطور میشه با شیفت در رجیستر نوشت ؟؟ مگه تمامی بیت های رجیستر 0 نیستن؟؟ حالا چه یکی چه چندتا شیفت بدی چه فرقی به حالش میکنه وقتی که همه صفر هستند؟؟؟
    یا مثلا چطور میتونم از رجیستر MCUCSR مقدار بیت WDRF رو بخونیم و با شرط if بیایم یکاری رو انجام بدیم؟؟

    دوستان تازه وارد بحث مقداردهی و خوندن رجیسترها شدم ُ یکم واضح لطفا توضیح بدید.
    تازه میتونیم با رجیستر DDRA اینطور رفتار کنیم: DDRA.1 = 1 ولی با بقیه رجیسترها چرا نمیشه اینطور بیتی برخورد کرد؟!!!

    ممنونم.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)

    #2
    پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

    سلام دوست عزیز خوبی؟
    ببین در این جا اومده با استفاده از دستورات شیفت در اصل بیت مورد نظر رو 1 کرده. مثلا ببین من می خوام در رجیستر DDRA بیت 3 رو یک بکنم و پین خروجی بشه. برای این کار چند راه وجود داره:
    اول اینکه بنویسم DDRA=(1<<DDRA3); یا اینکه به جای DDRA3 مقدار اون رو بنویسم که میشه عدد 3. برای درک این قضیه بهتره سری بزنی به هدر مربوط به بیت های میکروکنترلر که در همه کامپایلرها هست.و راه سوم اینکه DDRA=0x08;
    چرا راه اول از همه بهتره؟ چون خوانایی کد رو می بره بالا.

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

    دیدگاه


      #3
      پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر هایAVR؟؟

      [QUOTE=سوران آراسته;661375]سلام دوست عزیز خوبی؟ ببین در این جا اومده با استفاده از دستورات شیفت در اصل بیت مورد نظر رو 1 کرده. مثلا ببین من می خوام در رجیستر DDRA بیت 3 رو یک بکنم و پین خروجی بشه. برای این کار چند راه وجود داره: اول اینکه بنویسم DDRA=(1

      دلیل: ادغام دو پست برای جلوگیری از اسپم

      نوشته اصلی توسط سوران آراسته نمایش پست ها
      سلام دوست عزیز خوبی؟
      ببین در این جا اومده با استفاده از دستورات شیفت در اصل بیت مورد نظر رو 1 کرده. مثلا ببین من می خوام در رجیستر DDRA بیت 3 رو یک بکنم و پین خروجی بشه. برای این کار چند راه وجود داره:
      اول اینکه بنویسم DDRA=(1<<DDRA3); یا اینکه به جای DDRA3 مقدار اون رو بنویسم که میشه عدد 3. برای درک این قضیه بهتره سری بزنی به هدر مربوط به بیت های میکروکنترلر که در همه کامپایلرها هست.و راه سوم اینکه DDRA=0x08;
      چرا راه اول از همه بهتره؟ چون خوانایی کد رو می بره بالا.

      بازم موردی هست تا بیشتر توضیح بدم؟

      سلام جناب آراسته ی عزیز
      من راه حل سوم رو انجام میدم و برای فهمش مشکلی ندارم . مثلا میدونم 0x08 به باینری میشه 00001000 و دقیقا 1 رو روی بیت 3 مینویسه.
      ولی این خط رو نمیفهمم - مثلا شیفت دادن خوب جابجایی بیت های بایت هست دیگه ُ خوب وقتی که یک نوشته نیست شما بیاید هرچی شیفت بدید همون صفرها اینور ور و اونور میره دیگه ُ حالا یک کجاست که با شیفت دادن میآد رو بیت سوم میشینه؟؟
      مثلا تو این دستور DDRA=(1<<DDRA3)
      من اینطور میفهمم که :
      رجیستر DDRA رو مساوی قرار بده با یک واحد شیفت یافته ی از بیت سوم .
      حالا اگه بیت 2 یک باشه خوب میشینه رو بیت 3 و ما به هدفمون میرسیم - ولی اگه بیت 2 صفر باشه خوب صفر میشینه رو بیت سوم و ما به مقصود نمیرسیم.
      تازه اگه بیت 3 خودش نیاد بیت 4 رو خراب نکنه.
      البته میدونم داستان تو این خط کد فرق داره . ولی خوب برداشت من اینه و نمیتونم این مقدار دهی رو بفهمم.

      راستش آقای آراسته من الان کامپایلر کدویژن دارم ُ نمیدونم هدر مربوط به بیت های میکروکنترلر دقیقا کجای کامپایلر هست یا اسم این هدر به لاتین چیه!!
      ممنونم از وقتی که میزارید.
      جدیدترین ویرایش توسط hosseinam; ۱۸:۳۳ ۱۳۹۶/۰۶/۲۹.
      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
      (پيش به سوي هدف)

      دیدگاه


        #4
        پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

        ما مقادیر باینری رو توی کامپایلر با پیشوند 0b می نویسیم. اگه بخوایم هگز بنویسیم با پیشوند 0x می نویسیم. اگه بخواییم دسیمال بنویسیم هیچ پسوندی نمیدیم. حالا عداد دسیمال 0 و 1 در حالت باینری به این صورت میشه متعاقبا:
        0b..001
        0b..000
        حالا شیفت دادن رو که بلدی؟ با این دو عملگر >> و <<
        خب حالا به نظرت این یعنی چی:
        (0>>1)
        سمت راست که تعداد شیفت ها رو میگه. سمت چپ هم باید مقدار باشه. اینجا عدد دسیمال 1 همون 0b..001 به صورت باینری هستش. یعنی یه متغییر یا قسمتی از حافظه(سایزش هر چی می خواد باشه. مهم نیست. مهم اینه که بیت اولش یک هستش) که مقدار خونه اولش 1 هستش. پس با این پرانتز یه قسمتی از حافظه اشغال میشه که بیت شماره اولش 1 هستش و 0تا شیفت داده میشه. اگه به جای 0 یه مقدار دیگه بود به همون مقدار شیفت پیدا میکنه. حالا وقتی می نویسی:


        کد:
        [FONT=tahoma]WDTCR |= ( 1 << WDCE) | (1 << WDE) | (1 << WDP2) | ( 1 << WDP1) | (1 << WDP0);[/FONT][FONT=tahoma][/FONT]

        خب اینجا هم فرقی نمیکنه فقط قبلا عبارت هایی مثل WDCE قبلا تو هدر فایل با ماکرو تعریف شده هستن. بهشون تعداد داده شده. مثلا ممکنه همین عبارت مقدار 3 باشه. خودت به جاش 3 بذار ئ نگاهش کن. عین همین چیزی میشه که بالا توضیح دادم. بعد از اینکه همه این پرانتز ها اینطوری که گفتم کارشون انجام شد، همشون با اپراتور | با هم or میشن نهایتا دوباره با اینور پرانتز or میشن. اینجوری به بقیه بیت ها دست نمیزنه. البته در نظر داشته باش که کلیه عملیات سمت راست مساوی در زمان کامپایل انجام میشه پس هزینه ای نداره ولی خوانایی کد رو ساده میکنه.
        خیلی ها این چیزایی که من در بالا گفتم رو نمی دونن(شایدم بهتر باشه بگم بخاطر عدم دقت نمی دونن) ولی خب اهمیتی هم زیاد نداره. فقط ازش استفاده میکنیم.


        دیدگاه


          #5
          پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

          سلام
          ببخشید یهو پریدم وسط
          منم مبتدی هستم و طو همین قضیه مشکل دارم
          راستش کامل متوجه نشدم
          مثلا بخوایم بنویسیم DDRA=0b00101100 با روش شیفت چطور نوشته میشه؟

          دیدگاه


            #6
            پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

            دوستان در این مورد هم توضیح بدید ممنون میشمDDRA = (1 << DDA1) | (1 << DDA3) | (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);که DDAچی هست الان؟

            دیدگاه


              #7
              پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

              نوشته اصلی توسط روح الامین نمایش پست ها
              خیلی ها این چیزایی که من در بالا گفتم رو نمی دونن(شایدم بهتر باشه بگم بخاطر عدم دقت نمی دونن) ولی خب اهمیتی هم زیاد نداره. فقط ازش استفاده میکنیم.
              ممنونم روح الامین عزیز.
              بله زیاد به کار نمیآد . ولی برای فهم کد نویسی نیاز هست همشو بدونی ُ کد نویسی برات خیلی راحت میشه و میشه گفت همین که همچی رو میدونی خیلی کد نویسی بیشتر حال میده.



              نوشته اصلی توسط armay نمایش پست ها
              مثلا بخوایم بنویسیم DDRA=0b00101100 با روش شیفت چطور نوشته میشه؟
              شما باید رو تک تک بیت بنویسی بعد باهم or کنی و با انتساب به رجیستر - روی رجیستر بنویسی.
              کد:
              DDRA = (1<<DDRA2) | (1<<DDRA3) | (1<<DDRA5)
              سمت راست مساوی باهم or بیتی میشن و در نهایت یه بایت تشکیل میدن و اونو انتساب میدن به رجیستر DDRA .

              ممنونم از دوستان بابت فهم.ندن این موضوع.
              به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
              (پيش به سوي هدف)

              دیدگاه


                #8
                پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

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

                دیدگاه


                  #9
                  پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

                  سلام.
                  ببخشید تاپیک قدیمی رو میارم بالا.می خواستم بدونم که مثلا وقتی از شیفت و اون ماکرو ها برای مقدار دهی به رجیستر ها استفاده میکنیم، این عمل شیفت داخل پردازنده انجام میشه؟یا کامپایلر این کارو انجام میده چون در حالت اول یک بار اضافه ای به سی پی یو تحمیل میشه صرفا جهت خوانا تر شدن کد(حتی میتونیم کامنت هم بکنیم).

                  دیدگاه


                    #10
                    پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

                    نوشته اصلی توسط A.I.E نمایش پست ها
                    سلام.
                    ببخشید تاپیک قدیمی رو میارم بالا.می خواستم بدونم که مثلا وقتی از شیفت و اون ماکرو ها برای مقدار دهی به رجیستر ها استفاده میکنیم، این عمل شیفت داخل پردازنده انجام میشه؟یا کامپایلر این کارو انجام میده چون در حالت اول یک بار اضافه ای به سی پی یو تحمیل میشه صرفا جهت خوانا تر شدن کد(حتی میتونیم کامنت هم بکنیم).
                    هر چیزی که به صورت ماکرو تعریف می شه یا define میشه به صورت پیش پردازنده هست
                    یعنی کامپایلر اون رو ترجمه می کنه و بعد استفاده میشه
                    مگر اینکه مثلا یه تابع رو define کرده باشیم یا یک عملیات ریاضی رو
                    بستگی داره دقیقا چی نوشته باشیم
                    اللهم صل علی محمد و ال محمد و عجل فرجهم
                    پیامبر اکرم(ص):زکات علم نشر آن است.
                    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                    دیدگاه


                      #11
                      پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

                      نوشته اصلی توسط seyed saeed نمایش پست ها
                      هر چیزی که به صورت ماکرو تعریف می شه یا define میشه به صورت پیش پردازنده هست
                      یعنی کامپایلر اون رو ترجمه می کنه و بعد استفاده میشه
                      مگر اینکه مثلا یه تابع رو define کرده باشیم یا یک عملیات ریاضی رو
                      بستگی داره دقیقا چی نوشته باشیم
                      سلام.
                      خیلی ممنون بابت پاسختون.
                              TIMSK = (1<<TOV0) | (1<<OCF0);

                      الان من یک بار به صورت بیت های اون رجیستر رو یک کردم و به جای یک انتصاب ساده یک or و دو تا شیفت به راست نوشتم.یعنی این دستورات رو سی پی یو میکرو کنترلر انجام میده؟فرقش به انتصاب صرفه جویی در حافظه هست یا اشتباه میگم؟

                      دیدگاه


                        #12
                        پاسخ : نحوه ی مقدار دهی به رجیسترهای و خواندن از رجیستر ها؟؟

                        نوشته اصلی توسط A.I.E نمایش پست ها
                        سلام.
                        خیلی ممنون بابت پاسختون.
                                TIMSK = (1<<TOV0) | (1<<OCF0);

                        الان من یک بار به صورت بیت های اون رجیستر رو یک کردم و به جای یک انتصاب ساده یک or و دو تا شیفت به راست نوشتم.یعنی این دستورات رو سی پی یو میکرو کنترلر انجام میده؟فرقش به انتصاب صرفه جویی در حافظه هست یا اشتباه میگم؟
                        این چیزی که الان شما مثال زدید خیلی متفاوته
                        اگر کامپایلرتون درست کار کنه باید این رو به عنوان یک عدد در نظر بگیره و منتصبش کنه به TIMSK
                        ولی زمانی که شما می خواهید اعداد مختلف رو بریزید تو رجیستر اون وقت کار سی پی یو میشه
                        ولی معمولا این طوری که کامپایلر تشخیص میده می گه مثلا این کد یک بار بیش تر نوشته نشده پس من کامپایلر اون رو یک عدد در نظر می گیریم و بعد منتصبش می کنم داخل رجیستر
                        حالا حالتی رو در نظر بگیرید که اون اعدادی که قراره شیف داده بشن متغیر باشن و هر بار یه چیز باشه اون وقت کار سی پی میشه
                        شما سوالتون در مورد ماکرو ها بود نمی دونستم منظورتون این قسمت هست
                        اللهم صل علی محمد و ال محمد و عجل فرجهم
                        پیامبر اکرم(ص):زکات علم نشر آن است.
                        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                        دیدگاه

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