اطلاعیه

Collapse
No announcement yet.

AVR

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

    AVR

    با سلام

    در مورد 32رجیستر میکرو AVRآیا اطلاعات در مورد آن در برنامه نویسی نقش داره
    اصلا در برنامه چه نقشی داره؟
    اگه کمک کنید متشکر میشم

    #2
    پاسخ : AVR

    سلام ................

    منظورتون اینه که دونستن رجیسترها برای برنامه نویسی مهمه یا نه؟ بله؟ اینه سوالتون؟

    اگه این باشه که باید عرض کنم خدمتتون دونستن رجیسترها و کاراییشون خیلی مهمه و به برنامه نویسی هم مربوط میشه .. مثال میزنم .. فرض کنید میخواید با تایمر کار کنید و تنظیمات اون رو در در محیط کامپایلر (اگه C باشه .. میشه CodeWizard ..) انجام دادید .. حال میخواید وارد برنامه نویسی بشید و تعیین کنید که مثلا هر چند وقت یک بار یه اتفاق خاص بیوفته .. مثلا میخواید هر 10 ثانیه یک بار یه مقایسه انجام بدید بین شمارشتون و یه عدد خاص به این منظور که اگه به اون مرز رسید؛ یه اتفاق مشخص بیوفته .. مثلا یه رله سوئئیچ بشه .. اینجا دیگه نمیتونید به تنظیمات کامپایلر بسنده کنید و باید از وضعیت رجیسترها گاه باشید .. بدونید که مثلا رجیستر TCNT برای تایمره و از اون باب ارزیابی کنید تغییراتتون رو .. این یه مثال ساده بود .. خیلی جاهای دیگه پیش میاد که باید از رجیسترها مطلع باشید تا بتونید تغییرات لازم رو مبذول کنید .. برای همینه که یادگیری رجیسترها خیلی مهم و ضروریه .. امیدوارم متوجه منظورم شده باشید .. موفق باشید ..
    دوستان! مدتی کمتر به سایت میام ..

    دیدگاه


      #3
      پاسخ : AVR

      درود به شما
      ضمن تشکر از توضیحات حسام الدین عزیز
      فکر مینم منظور شما از 32 رجیستر رجیسترهای عمومی R0 تا R31 بوده، با این فرض توضیح میدم:
      همونطور که میدونید وظیفه رجیستر در میکرو نگهداری اطلاعات هست، رجیسترهای حاقظه Ram در AVR از نوع هشت بینی هستند و شما میتونید اطلاعتتون رو در قالب 8 بیت درون این رجیستر ها به عنوان حافظه موقت قرار بدید و از اونها استفاده کنید، اما این 32 رجیستر تفاوتی با بقیه رجیسترهای Ram شما و رجیسترهای با کاربرد خاص دارند و تفاوت این هست که این 32 رجیستر مستقیما با ALU میکرو در ارتباط هستند و شما برای انجام محاسبات نیاز به این دارید که اطلاعات رو در اونها قرار بدید تا بتونید به واحد ALU ارسال کنید و از طریق همین رجیسترها هم باید اطلاعات رو از ALU دریافت کنید، به عنوان مثال اگر شما میخواید عدد 10 رو با 20 جمع کنید باید حتما این اعداد رو از طریق این رجیسترها به ALU ارسال کنید، در بعضی از میکروها فقط یک رجیستر هست که مستقیما با ALU در ارتباط هست که معمولا به Accumulator یا Working Register معروف هست و این بستگی به نوع معماری تراشه داره. در AVR این 32 رجیستر نقش Accumulator رو دارند.
      در بعضی از دستورات شما میتونید مستقیما از همه 32 رجیستر استفاده کنید و کنترلشون کنید اما در بعضی از دستورات شما فقط به نصفه بالایی یعنی از R16 تا R31 دسترسی دارید مثلا در دستوراتی مانند SBR , CBR که برای صفر و یک کردن بیتی رجیستر ها به کار میرن محدودیت وجود داره و شما نمیتونید این دستورات رو برای رجیسترهای R0 تا R15 هم مانند 16 رجیستر R16 تا R31 مستقیما به کار ببرید.
      بعضی از این رجیسترها علاوه بر کاربرد اصلی کاربردهای دیگری هم دارند، مثلا رجیسترهای R31 , R30 رو میشه با هم به عنوان یک رجیستر 16 بیتی با نام Z در نظر گرفت و در آدرس دهی از اون استفاده کرد ( البته کاربردهای دیگه هم داره )، رجیستر های R29 , R28 هم میتونند با هم ترکیب بشند و همچنین رجیسترهای R27 , R26 هم به همین صورت، رجیسترهای دیگری هم در بعضی موارد کابردهای خاص دیگری انجام میدن.
      میشه گفت که اگر ما فرض کنیم ALU شاه باشه، این شاه فقط به 32 نفر اعتماد داره و اطلاعات رو از این 32 نفر مستفیما دریافت میکنه، که توی AVR این 32 نفر همون 32 رجیستر R0 تا R31 هستند و ALU نمیتونه مستقیما اطلاعات رو از یک خانه از حافظه Ram برداره و پردازش کنه، شما اگر بخواید یک عدد رو هم وارد ALU کنید باید حتما اون عدد رو درون این رجیسترها قرار بدید و از این طریق عدد رو برای پردازش به واحد محاسبه و منطق که همان ALU هست ارسال کنید.
      در زبان های سطح بالا مثل بیسیک یا زبانی مثل C بیشتر این کارها رو کامپایلر برای شما انجام میده و شما لازم نیست زیاد وارد جزئیات کار این رجیسترها بشید، زمانی که شما یک متغییر را در زبانی مثل C تعریف میکنید یک خانه از حافظه موقت به اون اختصاص داده میشه ( کامپایلر براش در نظر میگیره ) و اگر شما دستوری مانند PORTB = 25 رو بنویسید کامپایلر خودش کدی رو تولید میکنه که اول 25 در یکی از این رجیسترها که اشاره کردم ریخته بشه و بعد از اونجا روی پورت B ریخته بشه، در زبان اسمبلی که یک زبان سطح پایین هست شما باید حتما خودتون اول این عدد رو در ثباتی مثل R16 بریزید و بعد اون رو روی پورت بریزید، مثلا به این صورت:
      LDI R16,25
      OUT PORTB,R16
      همونطور که میبینید در خط اول مقدار 25 در رجیستر R16 که نقش واسط رو داره ریخته میشه و بعد از اون از رجیستر R16 خوانده میشه و توی رجیستر PORTB قرار میگیره. زمانی که شما یک خط دستور برای اینکار در C بنویسید کامپایلر حداقل کاری که براش انجام میده این هست که زمان اسمبل کردن برنامه این دو خط رو براش ایجاد میکنه، حالا اگر دستوراتی مثل دستور جمع یا ضرب و تقسیم هم باشه روال کار همین هست و شما از هر زبانی که استفاده کنید به خاطر معماری تراشه این اطلاعات باید حتما توسط رجیسترهای R0 تا R31 به ALU وارد بشند و شما چه متوجه بشید، چه نشید و چه بخواید چه نخواید AVR برای اینکه بتونه عملیات محاسباتی شما رو روی داده ها انجام بده باید از این 32 رجیستر کمک بگیره تا بتونه اطلاعاتتون رو برای پردازش وارد بخش محاسبه و منطق کنه ( ALU )
      در واقع در مثالی که حسام الدین عزیز برای شما زد هم مقادیری که شما در رجیسترهای با کاربرد خاص مانند رجیسترهای تایمر و وقفه و ... قرار میدید از طریق همین 32 رجیستر مقدار دهی میشند، یعنی AVR برای اینکه بتونه مقدار مورد نظر شما رو توی مثلا TCNT قرار بده باید اول اون مقدار رو در یکی از این رجیسترها قرار بده بعد منتقل کنه به TCNT، اما در زبانهای سطح بالا این کار رو کامپایلر برای شما انجام میده و شما کافیه مستقیما این مقدار رو برای TCNT تعریف کنید. این موارد همه بر میگرده به معماری تراشه و معمولا برای برنامه نویسان اسمبلی مهم هست، کمتر پیش میاد که برنامه نویسان زبان سطح بالا خودشون رو با این موارد درگیر کنند و برای صرفه جویی در وقت این کار به کامپایلر سپرده میشه.
      در میکروهایی مانند PIC ها شما همین کار رو از طریق رجیستری با نام W انجام میدید ( به خاطر نوع معماری و ساختمان داخلی متفاوت )، و هر عملیاتی که بخواید انجام بدید باید اطلاعات از طریق این رجیستر وارد ALU بشه و مثلا اگر بخواید مثال بالا رو انجام بدید به این صورت انجام میشه:
      MOVLW .25
      MOVWF PORTB
      در خط اول مقدار 25 دسیمال در ثبات w قرار میگیره و در خط بعدی این مقدار از w به PORTB منتقل میشه.
      از این لحاظ معماری AVR در این قسمت نسبت به PIC این برتری رو داره که شما به جای یک رجیستر در بیشتر موارد 32 رجیستر در اختیار دارید که میتونند مستقیما با ALU در ارتباط باشند، البته معماری PIC هم اصولیتر از این حرفهاست که از این بابت کمبودی احساس بشه !
      خلاصه: این 32 رجیستر، رجیسترهای مهمی هستند که ALU فقط از اونها اطلاعاتش رو میگیره و پردازش میکنه و میشه گفت در هر برنامه ای که نوشته بشه عدم استفاده از اونها به نوعی محال هست، البته در زبانهای سطح بالا تقریبا این موارد اصلا مطرح نیست و شما فقط متغیر رو تعریف میکنید و کامپایلر خودش زحمت این کارهارو میکشه اما اگر بخواید کمی حرفه ای تر به قضیه نگاه کنید در همون زبان ها نیز براش شما مهم میشود که متغیری که تعریف میکنید در کجا قرار میگیرد و چگونه کدی که مینویسید کامپایل میشود، یکی از فاکتورها ضعف و قدرت کامپایلر ها این هست که به متغیر ها مکان مناسبی اختصاص بدهند تا بتونند دستور العمل ها رو به بهترین شکل انجام دهند و کد اضافی تولید نکنند. به نظر من شما اگر با زبان های سطح بالا کار میکنی حتما به این نکات هم دقت کن چون اگر حالا چندان هم دارای اهمیت نباشه بعدها اهمیت زیادی پیدا میکنه.
      امیدوارم گیجتون نکرده باشم
      از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
      هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
      اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
      اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
      شاد و موفق باشید

      دیدگاه


        #4
        تشکرازپاسخ

        سلام

        با تشکر از آقای حسام الدین همانطور که دوستمون توضیح داده بودن منظورم رجیستر های R1-R32بود(که البته

        مقصر هم خودم بودم که در سوالم مشخص نبود) در هر حال خیلی ممنون از توضیحات دوستان.

        دیدگاه


          #5
          پاسخ : تشکرازپاسخ

          نوشته اصلی توسط dr21
          منظورم رجیستر های R1-R32بود(که البته
          آقای دکتر لیلی زن بود، R0 تا R31 :smile: :agree:
          از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
          هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
          اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
          اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
          شاد و موفق باشید

          دیدگاه

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