اطلاعیه

Collapse
No announcement yet.

avr و پورت ها

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

    avr و پورت ها

    با سلام.
    ببخشید برای اینکه در avr به تعدادی از پایه ها مقدار بدهیم باید به چه شکل عمل نماییم. در واقع میخواهم کار زیر را انجام دهم.
    پورت D.0 الی D.3 برابر یک ارایه چهار بیتی شوند بدون اینکه سایر پورت های D مقدارشان تغییر کند.
    من خودم این جوری مینویسم : فرض کنیم یک ارایه به اسم x داریم که چهار بیتی است
    PORTD=x[i]

    اما این کار باعث میشود که سایر پورت های D صفر شوند.
    البته این را هم بگم که نمیخوام تک تک به پایه ها مقدار بدهم.
    الته نمیدانم این کار شدنی است یا نه ولی اگر کسی ترفندی بلده لطفا را هنمایی کند.
    ممنون.

    #2
    پاسخ : avr و پورت ها

    به نظرم شما باید بیاین با دستور if تک تک آرایه ها رو بخونید و به دونه دونه پایه های میکرو فرمان بدیین.
    آرایه هر کدومشون یه حافظه جدا دارن که باید با کد نویسی از اون بخونید و تغییرات رو اعمال کنید.
    حالا ببین دوستان نظری دارن در این مورد.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)

    دیدگاه


      #3
      پاسخ : avr و پورت ها

      نوشته اصلی توسط saati.sms نمایش پست ها
      با سلام.
      ببخشید برای اینکه در avr به تعدادی از پایه ها مقدار بدهیم باید به چه شکل عمل نماییم. در واقع میخواهم کار زیر را انجام دهم.
      پورت D.0 الی D.3 برابر یک ارایه چهار بیتی شوند بدون اینکه سایر پورت های D مقدارشان تغییر کند.
      من خودم این جوری مینویسم : فرض کنیم یک ارایه به اسم x داریم که چهار بیتی است
      PORTD=x[i]

      اما این کار باعث میشود که سایر پورت های D صفر شوند.
      البته این را هم بگم که نمیخوام تک تک به پایه ها مقدار بدهم.
      الته نمیدانم این کار شدنی است یا نه ولی اگر کسی ترفندی بلده لطفا را هنمایی کند.
      ممنون.
      سلام
      برای یک کردن بیت های متناظر با آرایه میشه از روش زیر استفاده کرد:

      PORTD |= x[i];

      حال اگر بخواییم بیت هایی که توی آرایه صفر هستن، متناظر با اون ها بیت های کم ارزش PORTD رو هم صفر کنن، میشه از روش زیر استفاده کرد:

      PORTD &= (x[i]) | (0xF0);

      با این دستور، 4 بیت پر ارزش PORTD تغییر نمیکنن ولی صفرهای آرایه، بیت های متناظرشون در PORTD رو صفر میکنن. با ترکیب این دستورات و یکم خلاقیت میشه به عملکرد مطلوب رسید
      البته یادم رفت بگم که بهتره آرایه از نوع unsigned char باشه و حتما باید چهار بیت پر ارزش خونه هاش صفر باشن تا با دستور اول که برای یک کردن 4 بیت کم ارزش PORTD هست، به مشکل نخوره! مجبور شدم برای گفتن اینا پست رو ویرایش کنم
      جدیدترین ویرایش توسط hossein.m98; ۱۰:۳۳ ۱۳۹۷/۰۵/۲۳.

      دیدگاه


        #4
        پاسخ : avr و پورت ها

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        برای یک کردن بیت های متناظر با آرایه میشه از روش زیر استفاده کرد:

        PORTD |= x[i];

        حال اگر بخواییم بیت هایی که توی آرایه صفر هستن، متناظر با اون ها بیت های کم ارزش PORTD رو هم صفر کنن، میشه از روش زیر استفاده کرد:

        PORTD &= (x[i]) | (0xF0);

        با این دستور، 4 بیت پر ارزش PORTD تغییر نمیکنن ولی صفرهای آرایه، بیت های متناظرشون در PORTD رو صفر میکنن. با ترکیب این دستورات و یکم خلاقیت میشه به عملکرد مطلوب رسید
        البته یادم رفت بگم که بهتره آرایه از نوع unsigned char باشه و حتما باید چهار بیت پر ارزش خونه هاش صفر باشن تا با دستور اول که برای یک کردن 4 بیت کم ارزش PORTD هست، به مشکل نخوره! مجبور شدم برای گفتن اینا پست رو ویرایش کنم
        ممنون از پاسختون.
        ولی شما اینجوری فکر کنید که میخواهید 4 پایه از پورت D را برای این کار استفاده کنید و 4 تای دیگه رو برای یک کار دیگر.اما چون 4 پایه اول را برابر یک ارایه قرار میدهیم و چون حرفی در مورد 4 پایه دوم نزدیم در حالت پیش فرض صفر (0) قرار میگرند که بنده نمیخواهم این اتفاق بیافته.
        سوال رو اینجوری مطرح کنم:
        چگونه مثلا 4 تا از پایه های یک پورتی را به شکل ارایه در اوریم؟
        باز هم از پاسخگ.یی شما سپاس گذارم.

        دیدگاه


          #5
          پاسخ : avr و پورت ها

          نوشته اصلی توسط saati.sms نمایش پست ها
          ممنون از پاسختون.
          ولی شما اینجوری فکر کنید که میخواهید 4 پایه از پورت D را برای این کار استفاده کنید و 4 تای دیگه رو برای یک کار دیگر.اما چون 4 پایه اول را برابر یک ارایه قرار میدهیم و چون حرفی در مورد 4 پایه دوم نزدیم در حالت پیش فرض صفر (0) قرار میگرند که بنده نمیخواهم این اتفاق بیافته.
          سوال رو اینجوری مطرح کنم:
          چگونه مثلا 4 تا از پایه های یک پورتی را به شکل ارایه در اوریم؟
          باز هم از پاسخگ.یی شما سپاس گذارم.
          عجیبه که از پست قبلی جواب نگرفتید!
          خوب فرض کنیم من میخوام مقدار یه متغیر مثل x رو بندازم روی چهارتا بیت کم ارزش PORTD. خوب باید یکاری کنم که صفرهای x، بیت متناظر خودشون رو صفر کنن و یک ها هم به همین شکل؛ تغییری هم نباید در 4 تا بیت پر ارزش PORTD رخ بده. دقت کنید که من فرض میگیرم 4 بیت پر ارزش x صفر هستن و x از نوع unsigned char هستش. به شکل زیر این کار قابل انجامه:

          PORTD |= (x & 0x0F);
          PORTD &= (x | 0xF0);

          تو خط اول مقدار 0x0F رو قرار دادم که اگر اشتباها بیت های پر ارزش x هم مقدار داشتن، تغییری توی مقدار PORTD ایجاد نکنن و تو خط دوم مقدار 0xF0 رو به کار بردم که باز هم مشکلی برای بیت های پر ارزش PORTD پیش نیاد. امیدوارم این بار دیگه مشکلتون حل بشه

          دیدگاه

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