اطلاعیه

Collapse
No announcement yet.

تعریف متغییردرATTINYها

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

    تعریف متغییردرATTINYها

    با سلام وتشکر
    دو سوال داشتم:
    1-اعدادی که به سه پشته ATTINYها نسبت داده میشه بر چه اساسیه مثل: $swstack = 10 یا $hwstack = 16 یا
    $swstack = 5 یا $framesize = 16
    2-در میکروهای مگا چطور میتونیم (با چه دستوری) آدرس پشته را در RAM مشخص کنیم (مثلا در مگا16 که آدرس از0X60تا 0X45F است )(bascom)
    قبلا از راهنمائی شما متشکرم

    #2
    پاسخ : تعریف متغییردرATTINYها

    من از این روش استفاده می کنم

    $asm
    ldi r16,$04
    Out Sph , R16
    ldi r16,$5f
    Out Spl , R16
    $end Asm

    دیدگاه


      #3
      پاسخ : تعریف متغییردرATTINYها

      درود
      با تشکر از آقا مجید عزیز
      dr21 جان در این میکروها یک جفت رجیستر وجود داره ( دوتا 8 بیتی که روی هم میشه 16 بیت ) که به اون SP یا Stack Pointer گفته میشه که از اونجا که یک جفت رجیستر هست به دو قسمت تقسیم میشه و بایت پایین با نام SPL و بایت بالا با نام SPH شناخته میشه، این رجیستر ها در مگا 16 در آدرس 3d و 3e هگزا دسیمال قرار دارند و شما به وسیله اینها محل پشته رو تعریف میکنید، از اونجا که رشد پشته رو به پایین هست ( از آدرس بالا به آدرس پایین حافظه ) معمولا سعی میکنند که این مقدار بالاترین مقدار حافظه RAM باشه که در مگا 16 همونطور که شما نوشتی 45F هگزا دسیمال هست. حالا شما برای اینکه این مکان رو برای پشته تعریف کنید باید بایت بالا رو در SPH و بایت پایین رو در SPL قرار بدید تا در مجموع اشاره گر پشته به این آدرس اشاره کنه. شما میتونید به جای این مقدار مقادیر دیگه هم در پشته قرار بدید اما معمولا بهترین کار این هست که پشته رو در بالاترین آدرس RAM تغرف کنید تا از تداخل و بی نظمی جلوگیری کنید. حالا شما با هر زبانی که کار کنید ممکن هست نوع تعریف پشته فرق کنه و گاهی اصلا نیازی به تعریف نباشه ( چون کامپایلر خودش اینکار رو انجام میده ) اما در کل همیشه باید در اول برنامه پشته رو خودتون به این صورت تنظیم کنید ( در صورتی که بخواید از وقفه یا انشعاب استفاده کنید ) از اونجا که من با اسمبلی کار میکنم نحوه انجام این کار رو با اسمبلی مینویسم براتون.
      LDI R16,HIGH(RAMEND)
      OUT SPH,R16
      LDI R16,LOW(RAMEND)
      OUT SLP,R16
      تو برنامه بالا عبارت RAMEND به جای 45F قرار گرفته و عملا هیچ فرقی نمیکنه که شما این رو بنویسید با این روش شما خیالتون راحت هست که آخرین آدرس RAM رو که فایل سرآیند برای اسمبلر مشخص میکنه رو قرار دادید که در اینجا 45F هست. عبارت HIGH هم به این معنی هست که بایت بالایی از مقدار درون پرانتز مورد نظر هست، پس به طور کلی با اجرای خط اول، بایت بالایی 45F در رجیستر R16 قرار میگیره، در خط بعدی این مقدار از رجیستر R16 درون SPH ریخته میشه که همون بایت بالای اشاره گر پشته هست. و به همین ترتیب در خط سوم بایت پایین 45F در R16 و در خط بعدی این مقدار در SPL قرار میگیره و در نهایت بعد از اجرای این چهار دستور 45F به طور کامل درون اشاره گر پشته قرار میگیره و پشته شما در بالاترین آدرس Ram تعریف میشه. حالا اگر شما بخواید پشته رو در جای دیگه تعریف کنید کافیه به جای اون RAMEND مقدار عددی اون آدرس رو قرار بدید تا شروع پشته از اونجا باشه.
      زمانی که میکرو شروع به کار میکنه مقدار اشاره گر پشته صفر هست و شما حتما باید اشاره گر پشته رو مقدار دهی کنید تا بتونید از دستورات فراخوانی روتین ها و وقفه ها استفاده کنید ( آدرس برگشت رو در پشته ذخیره کنید )

      از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
      هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
      اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
      اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
      شاد و موفق باشید

      دیدگاه

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