اطلاعیه

Collapse
No announcement yet.

دوستان همه توجه کنند! سوال در مورد Usart

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

    دوستان همه توجه کنند! سوال در مورد Usart


    سلام به همه دوستان
    در مورد usart دو تابع برای نوشتن و خواندن دیدم که در تابع ارسال با توجه به اینکه زمانی اطلاعات در UDR نوشته می شه که اطلاعات قبلی ارسال شده باشد و بیت UDRE واقع در رجیستر UCSRA یک شده باشد این خط از برنامه نوشته شده که من نمی دونم چه طور کار می کنه؟

    while( !(UCSRA & (1<<UDRE)) );
    البته ببخشید هر کار می کنم این پرانتز ها جابجا می شن!
    این خط رو توی تابع ارسال می نویسن و می گن تا زمانی که بیت UDRE صفر است تابع در این حلقه می ماند مشکل من با شرط حلقه است که نمی دونم چه طور اینطوری تعبیر می شه! چرا این رو به صورت زیر نمی نویسن:

    while(!UDRE);
    در تابع دریافت هم این خط رو داریم:

    while( !(UCSRA & (1<<RXC)) );
    که این طور تعبیر می شه که تا زمانی که بیت RXC صفر است به این معنی که داده جدیدی دریافت نشده و بافر دریافت خالی است برنامه روی همین خط است
    چرا اینطور نمی نویسن:

    while(!RXC);

    یه تابع هم بعضی جاها می بینم که با گرفتن Baud rate تنظیمات اولیه رو انجام می ده (مثلا مقداردهی UBRR وUCSRB وUCSTC ).مگه وقتی codewizard رو تنظیم می کنیم تنظیمات این متغیرها انجام نمی شه؟
    با تشکر فراوان

    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    #2
    پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

    نوشته اصلی توسط jaafary1
    سلام به همه دوستان
    در مورد usart دو تابع برای نوشتن و خواندن دیدم که در تابع ارسال با توجه به اینکه زمانی اطلاعات در UDR نوشته می شه که اطلاعات قبلی ارسال شده باشد و بیت UDRE واقع در رجیستر UCSRA یک شده باشد این خط از برنامه نوشته شده که من نمی دونم چه طور کار می کنه؟

    while( !(UCSRA & (1<<UDRE)) );
    البته ببخشید هر کار می کنم این پرانتز ها جابجا می شن!
    این خط رو توی تابع ارسال می نویسن و می گن تا زمانی که بیت UDRE صفر است تابع در این حلقه می ماند مشکل من با شرط حلقه است که نمی دونم چه طور اینطوری تعبیر می شه! چرا این رو به صورت زیر نمی نویسن:

    while(!UDRE);
    در تابع دریافت هم این خط رو داریم:

    while( !(UCSRA & (1<<RXC)) );
    که این طور تعبیر می شه که تا زمانی که بیت RXC صفر است به این معنی که داده جدیدی دریافت نشده و بافر دریافت خالی است برنامه روی همین خط است
    چرا اینطور نمی نویسن:

    while(!RXC);

    یه تابع هم بعضی جاها می بینم که با گرفتن Baud rate تنظیمات اولیه رو انجام می ده (مثلا مقداردهی UBRR وUCSRB وUCSTC ).مگه وقتی codewizard رو تنظیم می کنیم تنظیمات این متغیرها انجام نمی شه؟
    با تشکر فراوان
    با سلام
    nnn<<1 یا همونی که شما نوشتی ، یعنی عدد 1 که nnn بار به سمت چپ شیفت داده شده،
    این روش مناسبی برای نشان دادن بیت nnn از یک رجیستر یا پورت 8بیتی یا 16بیتی یا 32بیتی است.

    اگر بیت مورد نظر شما به صورت بیتی قابل آدرس دهی باشد ، روش پیشنهادی شما برای نوشتن کد مناسب است.
    اما در غیر اینصورت همین نحوه کد نویسی اولی ، مناسب است.
    با سپاس
    گشتی در لاله زار
    http://www.eca.ir/forum2/index.php?topic=76138.0

    http://www.eca.ir/forum2/index.php?topic=76141

    دیدگاه


      #3
      پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

      سلام دادا.
      خودت که جواب رو دادی!!!

      حلقه while تازمانی ادامه داره که حاصل توی پرانتز بشه یک (1). اگه عیر از این بشه شرط حلقه نقض میشه و از حلقه بیرون میاد. حالا تا زمانی که حاصل عبارت (UCSRA & (1<<UDRE صفر باشه این حلقه ادامه داره. اما پشت این عبارت یه علامت ! (Not) وجود داره که جواب معکوس میکنه. ok?
      تشکر لازم نیست!

      دیدگاه


        #4
        پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

        حلقه while تازمانی ادامه داره که حاصل توی پرانتز بشه یک (1).
        نخیر عزیزم. درستش اینه که بگی:
        حلقه while تازمانی ادامه داره که حاصل توی پرانتز نشه صفر.

        دیدگاه


          #5
          پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

          سلام به همه شما ممنون از توجه شما انگار فقط آقا solsal با دقت سوالو خونده و متوجه منظورم شده :applause: :wow:از سایر آقایان هم تشکر می کنم. :biggrin:
          اما آقا solsal شرمنده من درست متوجه منظور شما نشدم!! :cry:
          اینو که می گید این بیت RXC و یا UREآ‌ چون احتمالا غیر قابل آدرس دهی بودن برای تشخیص وضعیت اون ها از همین قضیه شیفت و بعد هم اند استفاده شده دو سوال رو تو ذهن من ایجاد می کنه:
          اول اینکه اگر این دو بیت غیر قابل آدرس دهی هستند چرا تونسته مستقیما از اون ها استفاده کنه؟

          و بعد از شیفت نتیجه اند کردن با یه رجیستر هشت بیتی و not کردنش هشت بیته! این هشت بیت چه طور جایگزین 0 و 1 می شه و روند اجرای برنامه رو تعیین می کنه؟
          همیشه بزرگوار تر از آن باشید که برنجید
          و نجیب تر از آن باشید که برنجانید!

          دیدگاه


            #6
            پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

            نوشته اصلی توسط jaafary1
            سلام به همه شما ممنون از توجه شما انگار فقط آقا solsal با دقت سوالو خونده و متوجه منظورم شده :applause: :wow:از سایر آقایان هم تشکر می کنم. :biggrin:
            اما آقا solsal شرمنده من درست متوجه منظور شما نشدم!! :cry:
            اینو که می گید این بیت RXC و یا UREآ‌ چون احتمالا غیر قابل آدرس دهی بودن برای تشخیص وضعیت اون ها از همین قضیه شیفت و بعد هم اند استفاده شده دو سوال رو تو ذهن من ایجاد می کنه:
            اول اینکه اگر این دو بیت غیر قابل آدرس دهی هستند چرا تونسته مستقیما از اون ها استفاده کنه؟

            و بعد از شیفت نتیجه اند کردن با یه رجیستر هشت بیتی و not کردنش هشت بیته! این هشت بیت چه طور جایگزین 0 و 1 می شه و روند اجرای برنامه رو تعیین می کنه؟
            با سلام
            در فایلهای header حتما RXC , URE را به صورت اعداد 0 تا 7 تعریف کرده،
            لذا می تواند به صورت 1<<nnn ( این ادیتور ..... nnn سمت راست است و علامت >> است و 1 سمت چپ است....) نوشته شود.

            while( !(UCSRA & (1<<UDRE)) ); یعنی:
            عدد 8 بیتی 00000001 را به تعداد UDRE دفعه شیفت به چپ بدهید ( مثلا 5 دفعه ) تا بشود 00100000
            سپس آنرا با رجیستر UCSRA اند کنید تا مقدار بیت پنجم در نتیجه نهایی باقی بماند،
            حالا این نتیجه یا 00000000 است (که محل بیت UDRE صفر خواهد بود )
            یا 00100000 است ، که محل بیت UDRE برابر با 1 خواهد بود.
            خوب اختلاف این دو وضعیت به عنوان مقایسه استفاده شده : یعنی یا نتیجه صفر یا نتیجه غیر صفر ......
            با سپاس
            گشتی در لاله زار
            http://www.eca.ir/forum2/index.php?topic=76138.0

            http://www.eca.ir/forum2/index.php?topic=76141

            دیدگاه


              #7
              پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

              سلام مجدد :biggrin:
              نوشته اصلی توسط Solsal
              در فایلهای header حتما RXC , URE را به صورت اعداد 0 تا 7 تعریف کرده،
              آقا solsal من UDRE رو اشتباها UREآ‌تایپ کردم.
              هم UDRE و هم RXC هر دو یک بیت هستند و مقدار آن ها می تواند 0 یا یک باشد یعنی شیفت عدد یک به مقدار UDREآ‌ویا RXC فقط یه اندازه یک یا صفر بیت می تواند باشد که اند کردن عدد 1 یا دو (از نتیجه شیفت)با رجیستر UCSRA مقادیر بیت 0و یک این رجیستر را می تواند چک کند.این در حالی است که بیت UDRE بیت پنجم از این رجیستر و RXC بیت هفتم از این رجیستر است.
              مشکل من سر بیت بودن UDREآ‌وRXC است اگر بایت بودند فرمایشات شما کاملا صحیح و پذیرفتنی بود. :cry:
              (ببخشید منظورم اینه که این فرمایش شما که UDRE وRXCآ‌در هدر فایل بایت هستند و با مقادیر 0 تا 7 رو نمی تونم بپذیرم چون مطمئنا وقتی این دو به عنوان دو بیت از رجیستر UCSRAآ‌تعریف شده اند نمی شود که هم زمان در برنامه متغیری 8 بیتی با همین نام تعریف شده باشد :redface
              همیشه بزرگوار تر از آن باشید که برنجید
              و نجیب تر از آن باشید که برنجانید!

              دیدگاه


                #8
                پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

                نوشته اصلی توسط jaafary1
                سلام مجدد :biggrin:آقا solsal من UDRE رو اشتباها UREآ‌تایپ کردم.
                هم UDRE و هم RXC هر دو یک بیت هستند و مقدار آن ها می تواند 0 یا یک باشد یعنی شیفت عدد یک به مقدار UDREآ‌ویا RXC فقط یه اندازه یک یا صفر بیت می تواند باشد که اند کردن عدد 1 یا دو (از نتیجه شیفت)با رجیستر UCSRA مقادیر بیت 0و یک این رجیستر را می تواند چک کند.این در حالی است که بیت UDRE بیت پنجم از این رجیستر و RXC بیت هفتم از این رجیستر است.
                مشکل من سر بیت بودن UDREآ‌وRXC است اگر بایت بودند فرمایشات شما کاملا صحیح و پذیرفتنی بود. :cry:
                (ببخشید منظورم اینه که این فرمایش شما که UDRE وRXCآ‌در هدر فایل بایت هستند و با مقادیر 0 تا 7 رو نمی تونم بپذیرم چون مطمئنا وقتی این دو به عنوان دو بیت از رجیستر UCSRAآ‌تعریف شده اند نمی شود که هم زمان در برنامه متغیری 8 بیتی با همین نام تعریف شده باشد :redface
                با سلام
                ممکنه لطفا چند خط از Header مربوط به میکروی خودتان که این دو تا UDREآ‌وRXC را define نموده ، در اینجا بیاورید؟
                همچنین این رجیستر UCSRAآ‌ را ،
                با سپاس
                گشتی در لاله زار
                http://www.eca.ir/forum2/index.php?topic=76138.0

                http://www.eca.ir/forum2/index.php?topic=76141

                دیدگاه


                  #9
                  پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

                  آقا solsal توی هدر برنامه چیزی define نشده و از هدر فابل خاصی هم استفاده نشده!هدر فایل stdio.hآ‌ برای دستوراتی مثل printf,putchar,getchar,sprintf,scanf,.. اضافه شده .
                  اما من بلد نیستم چه طور عکس بذارم اینجا میشه بهم بگید چه طور این کارو بکنم؟ :redface:
                  همیشه بزرگوار تر از آن باشید که برنجید
                  و نجیب تر از آن باشید که برنجانید!

                  دیدگاه


                    #10
                    پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

                    نوشته اصلی توسط jaafary1
                    سلام مجدد :biggrin:آقا solsal من UDRE رو اشتباها UREآ‌تایپ کردم.
                    هم UDRE و هم RXC هر دو یک بیت هستند و مقدار آن ها می تواند 0 یا یک باشد یعنی شیفت عدد یک به مقدار UDREآ‌ویا RXC فقط یه اندازه یک یا صفر بیت می تواند باشد که اند کردن عدد 1 یا دو (از نتیجه شیفت)با رجیستر UCSRA مقادیر بیت 0و یک این رجیستر را می تواند چک کند.این در حالی است که بیت UDRE بیت پنجم از این رجیستر و RXC بیت هفتم از این رجیستر است.
                    مشکل من سر بیت بودن UDREآ‌وRXC است اگر بایت بودند فرمایشات شما کاملا صحیح و پذیرفتنی بود. :cry:
                    (ببخشید منظورم اینه که این فرمایش شما که UDRE وRXCآ‌در هدر فایل بایت هستند و با مقادیر 0 تا 7 رو نمی تونم بپذیرم چون مطمئنا وقتی این دو به عنوان دو بیت از رجیستر UCSRAآ‌تعریف شده اند نمی شود که هم زمان در برنامه متغیری 8 بیتی با همین نام تعریف شده باشد :redface
                    با سلام
                    اون دو تا اسم ، دو تا اسم هستند که بیان کننده دو بیت از یک رجیستر هستند،
                    در کمپایلر ، اون دو تا ، به صورت دو تا عدد تعریف شده اند،( یک جایی در هدرها یا کد برنامه ، این تعریف وجود دارد.)
                    در حالتی که ما از این اسامی استفاده می کنیم ، کمپایلر ، به جای آن دو ، اعداد 5 و 7 را قرار می دهد.

                    ذهن خود را درگیر این که این دو اسم ، بیت سخت افزاری هستند نکنید. در سطح کمپایلر ، این دو تا ، اسامی هستند که به جای دو تا عدد قرار گرفته اند.
                    با سپاس
                    گشتی در لاله زار
                    http://www.eca.ir/forum2/index.php?topic=76138.0

                    http://www.eca.ir/forum2/index.php?topic=76141

                    دیدگاه


                      #11
                      پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

                      سلام
                      آقا با این حساب چاره ای جز پذیرفتن ندارم! :redface:
                      این برنامه ها رو من از جای دیگه دیده بودم اگه قرار بود خودم چنین تابعی بنویسم وقتی از این موضوع که شما می گید بی خبر بودم چی می شد؟؟ :surprised:
                      اما از این ها بگذریم فکر نکنم روا باشه بیشتر از این به این دو بیت گیر بدم :biggrin:
                      پس از شما به خاطر لحظه لحظه های وقت گرانبارتون که در اختیارم گذاشتید تشکر می کنم.
                      با آرزوی موفقیت و سر بلندی!
                      همیشه بزرگوار تر از آن باشید که برنجید
                      و نجیب تر از آن باشید که برنجانید!

                      دیدگاه


                        #12
                        پاسخ : دوستان همه توجه کنند! سوال در مورد Usart

                        سلام به خانومها آقایون :biggrin:
                        عزیزان آقای solsal به سوال بنده درست جواب دادند و من الان متوجه شدم که بیت های UDRE,RXC در هدر فایل برنامه مقادیر عددی 5و 7 رو دارند وقضیه شیفت عدد یک به اندازه 5 یا 7 بیت کاملا صحیح است!
                        بنابراین از ایشون دوباره تشکر می کنم! :applause:
                        :biggrin:
                        همیشه بزرگوار تر از آن باشید که برنجید
                        و نجیب تر از آن باشید که برنجانید!

                        دیدگاه

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