اضافه کردن دستور های جدید CPU هشت بیتی بخش پنجم

blog
۱۴۰۳-۱۰-۱۰
8 دقیقه

در قسمت قبل دستورهای جدیدی را برای شبیه‌ساز تعریف کردیم و در این قسمت تمام دستورهای باقی‌مانده مربوط به این میکروکنترلر را تعریف می‌کنیم.

دستور SUBWF f, d

این دستور مقدار رجیستر W را از رجیستر F کم می‌کند (F – W) و درصورتی‌که مقدار d برابر با 1 یا F باشد نتیجه در رجیستر F ذخیره می‌شود در غیر این صورت، اگر مقدار d برابر با 0 یا W باشد نتیجه در رجیستر W ذخیره می‎شود.

درصورتی‌که نتیجه کوچک‌تر از 0 (منفی) شد بیت C یا Carry در رجیستر STATUS برابر با 0 می‌شود، در غیر این صورت Carry برابر با 1 می‌باشد و نتیجه برابر با 0 می‌شود.

درصورتی‌که نتیجه دستور برابر با 0 بود بیت Z مربوط به رجیستر STATUS برابر با 1 می‌شود.

دستور SUBWF f, d

دستور SWAPF f, d

این دستور مکان چهار بیت اول را با چهار بیت دوم جابه‌جا می‌کند.
برای مثال اگر مقدار رجیستر F به‌صورت باینری برابر با 0b11110000 باشد بعد از انجام عملیات مقدار آن به‌صورت 0b00001111  درمی‌آید.

اگر مقدار d برابر با 1 یا F بود مقدار نتیجه در رجیستر F ذخیره می‌شود، در غیر این صورت اگر مقدار d برابر با 0 یا W بود مقدار آن در رجیستر W ذخیره می‌شود.

دستور SWAPF f, d

دستور MOVF f, d

این دستور مقدار رجیستر داده شده را به مقصد مشخص شده می‌برد!

اگر مقدار d برابر با 1 یا F بود مقدار در خودش ذخیره می شود در غیر این صورت اگر مقدار d برابر با 0 یا W بود مقدار، در رجیستر W  ذخیره می شود.

ذخیره مقدار در خود زمانی مفید می‌باشد که نیاز داریم بین Z مربوط به رجیستر STATUS را بررسی کنیم بدون دستکاری بقیه مقدارها!

دستور MOVF f, d

دستور XORWF f, d

این دستور مقدار رجیستر F را با مقدار رجیستر W به‌صورت Exclusive OR (^) حساب می‌کند!

اگر مقدار d برابر با 0 یا W بود نتیجه در رجیستر W ذخیره می‌شود، در غیر این صورت اگر مقدار d برابر با 1 یا F بود نتیجه در رجیستر F ذخیره می‌شود.

این دستور روی بیت Z مربوط به رجیستر STATUS تأثیر می‌گذارد، اگر نتیجه عملیات برابر با 0 شد بیت Z برابر با 1 می شود در غیر این صورت مقدار این بیت برابر با 0 می شود.

دستور XORWF f, d

دستور ANDLW k

این دستور همانند دستور ANDWF می‌باشد و عملیات AND را انجام می‌دهد، با این تفاوت که برعکس دستور ANDWF این دستور یک مقدار literal یا عددی را دریافت می‌کند و عملیات AND را با مقدار دریافتی و مقدار رجیستر W انجام می‌دهد و در نهایت نتیجه را در رجیستر W ذخیره می‌کند!

این دستور نیز روی بیت Z در رجیستر STATUS تأثیر می‌گذارد و درصورتی‌که نتیجه عملیات برابر با 0 شد این بیت برابر با 1 می‌شود در غیر این صورت مقدار بیت Z برابر با 0 می‌شود.

اضافه کردن دستور های جدید CPU هشت بیتی بخش پنجم

دستور CALL k

این دستور رفتاری شبیه به دستور GOTO دارد و مقدار PC را به مکان داده شده (k) تغییر می‌دهد، اما قبل از این کار آدرس دستور بعدی خود را در یک STACK ذخیره می‌کند که به کد مربوط به این بخش بعداً می‌پردازیم!

دستور CALL k

دستور RETLW k

این دستور همانند دستور MOVLW مقدار عددی k را در رجیستر W ذخیره می‌کند، با این تفاوت که بعد از انجام عملیات آخرین آدرس اضافه شده به STACK را از آن می‌گیرد و مقدار آن را در PC ذخیره می‌کند و باعث تغییر شمارنده برنامه می‌شود؛ همانند GOTO و CALL.

ترکیب دستور های RETLW و CALL بسیار مفید می‌باشند و به ما اجازه صدازدن بخشی از کد را می‌دهند (همانند صدازدن توابع)!

دستور RETLW k

دستور IORLW k

این دستور همانند دستور IORWF عملیات OR را انجام می‌دهد با این تفاوت که این دستور یک مقدار عددی (literal) دریافت می‌کند و عملیات OR را با مقدار عددی دریافتی و مقدار رجیستر W انجام می‌دهد و نتیجه را در رجیستر W ذخیره می‌کند.

این دستور نیز روی بیت Z مربوط به رجیستر STATUS تأثیر می‌گذارد و درصورتی‌که نتیجه عملیات برابر با 0 شد این بیت برابر با 1 می‌شود و در غیر این صورت مقدار این بیت برابر با 0 می‌شود.

دستور IORLW k

دستور XORLW k

این دستور همانند دستور XORWF می‌باشد؛ اما بجای دریافت آدرس یک مقدار عددی (literal) دریافت می‌کند و عملیات XOR (^) را با مقدار دریافتی و مقدار رجیستر W انجام می‌دهد.

این دستور برعکس دستور XORWF مقدار d را دریافت نمی‌کند و مستقیم نتیجه را در رجیستر W ذخیره می‌کند.

همانند دستورهای قبلی که با رجیستر W سروکار داشتند این دستور نیز روی بیت Z مربوط به رجیستر STATUS تأثیر می‌گذارد و درصورتی‌که نتیجه عملیات برابر با 0 بود مقدار بیت Z برابر با 1 و در غیر این صورت مقدار این بیت برابر با 0 می شود.

دستور XORLW k

دستور CLRWDT

این دستور مقدار timer مربوط به CPU را برابر با 0 قرار می دهد.

دستور CLRWDT

دستور OPTION

این دستور مقدار رجیستر OPTION را بارگذاری می‌کند و مقدار رجیستر W را در آن قرار می‌دهد.

دستور OPTION

دستور TRIS f

این دستور فقط دو مقدار 0x06 یا 0x07  را به‌عنوان آدرس دریافت می‌کند و باتوجه‌به مقدار رجیستر W بیت‌هایی که برابر با 0 هستند را به عنوان ورودی و بیت هایی که برابر با 1 هستند را به عنوان خروجی در نظر میگیرد.

و چون که در این میکروکنترلر (PIC10F200) مقدار 0x06 برابر با رجیستر GPIO می‌باشد این دستور مقدار 0x06  را دریافت می‌کند.

دستور TRIS f

آپدیت کردن کدهای Emulator

حالا که با نحوه کارکرد دستورهای جدید آشنا شدیم، زمان به‌روزرسانی کدهای مربوط به emulator می‌باشد.

اضافه کردن بخش Decode

کدهای زیر را برای تشخیص دستورها به تابعdecode_inst  اضافه می‌کنیم:

اضافه کردن بخش Decode

اضافه کردن بخش Execute

بعد از تشخیص دستورها نیاز داریم که آنها را با اجرا کنیم، حالا به بخش‌های جدید مربوط به تابع execute می‌پردازیم:

اضافه کردن دستور های جدید CPU هشت بیتی بخش پنجم

خط‌های بین 51 تا 27 برای آپدیت‌کردن بیت DC مربوط به رجیستر STATUS می‌باشد که مقدار آن برابر با 1 است اگر که حاصل عملیات از 0b1111  بیشتر باشد (نیاز به Borrow  داشته باشد) در غیر این صورت برابر با 0 می‌باشد.

توابع مربوط به STACK

میکروکنترلر PIC10F200 دارای اندازه STACK برابر با 2 می‌باشد، این به این معنی است که ما فقط می‌توانیم 2 تابع تو در تو داشته باشیم؛ زیرا که دستور CALL با اندازه 2 برای STACK سر و کار دارد!

این قانون برای دستور RETLW نیز صدق می‌کند؛ زیرا که این دستور نیز با اندازه 2 برای STACK سر و کار دارد!

کدهای مربوط به اضافه‌کردن و گرفتن آدرس به stack به‌صورت زیر می‌باشد:

اضافه کردن دستور های جدید CPU هشت بیتی بخش پنجم

تابع pop_stack آخرین آدرس وارد شده (با استفاده از push_stack) را برمی‌گرداند اگر بعد از اضافه‌شدن 2 آدرسی با استفاده از تابع push_stack به مقداری بیشتر از 2 تابع pop_stack  را صدا بزنیم آخرین مقدار وارد شده برمی‌گردد و برابر با 0 نمی‌شود!

برای مثال اگر آدرس‌های 2 و 3 را با استفاده از push_stack به stack وارد کنیم و به تعداد 3 بار تابع pop_stack را صدا بزنیم آدرس‌های دریافتی به صورت 3، 2 و 2 می‌باشد (تبدیل به 0 نمی‌شود).

با استفاده از این stack می‌توان کدی شبیه به صدازدن توابع را در این نوع assembly داشت.

نمونه مثال استفاده از CALL و RETLW

حالا با استفاده از این دو دستور و ایجاد یک حلقه که در پست قبل اشاره شد. برنامه‌ای می‌نویسیم که مقدار A تا K  را نمایش دهد:

اضافه کردن دستور های جدید CPU هشت بیتی بخش پنجم

  • در خط‌های 1 تا 8 اسم‌هایی را برای آدرس‌های مشخصی تعریف کرده‌ایم
  • در خط 9 و 10 مقدار 0 را در آدرس i نگهداری می‌کنم
  • در خط 11 لیبل main را تعریف می‌کنیم
  • در خط 12 مقدار 0x41 ( برابر با حرف A) را در i ذخیره می‌کنیم
  • در خط 15 لیبل TOP را برای ذخیره آدرس اول حلقه استفاده می‌کنیم
  • در خط 16 مقدار i را در رجیستر W ذخیره می‌کنیم
  • در خط 17 مقدار ذخیره شده در رجیستر W را به CRAM منتقل می‌کنیم
  • در خط 18 مقدار 0X4b (برابر با K) را در رجیستر W ذخیره می‌کنم
  • در خط 19 مقدار W را از CRAM کم می‌کنیم (CRAM – W) و نتیجه را در رجیستر W  نگه می‌داریم
  • در خط 20 بیت C (مربوط به Carry) برای رجیستر STATUS را چک می‌کنیم اگر برابر با 0 بود دستور بعدی اجرا نخواهد شد
  • خط های 19 و 20 برای عملیات ( ‘i < ‘K) می‌باشد (مربوط به شرط حلقه FOR)
  • در خط 21 با استفاده از دستور GOTO اجازه خروج از حلقه را می‌دهیم (با توجه به دستور قبلی اجرا خواهد شد)
  • در خط 22 مقدار 0x0B  را برای l مشخص کرده‌ایم
  • در خط 23 مقدار i را به رجیستر W منتقل می‌کنیم
  • در خط 24 مقدار رجیستر W را به l منتقل می‌کنیم
  • در خط 25 putchar را با استفاده از دستور CALL صدا می‌زنیم، این کار باعث تغییر PC به آدرس مشخص شده می‌شود و آدرس دستور بعدی (INCF) را در stack ذخیره می‌کند
  • در خط 27 با استفاده از GOTO شمارنده برنامه را به اول حلقه منتقل می‌کنیم.
  • در خط‌های 29 و 30 یک لیبل برای اجرای دستور SLEEP مشخص می‌کنیم
  • در خط 32 لیبل putchar را مشخص می‌کنیم (لیبل در آخر مشخص شده تا زمانی که نیاز داشتیم با استفاده از CALL از آن استفاده کنیم)
  • در خط 33 مقدار l را به رجیستر W منتقل می‌کنیم
  • در خط 24 مقدار رجیستر W را به رجیستر GPIO منتقل می‌کنیم
  • در خط 35 با استفاده از BSF آخرین بیت رجیستر GPIO را برابر با 1 قرار می‌دهیم
  • در خط 36 مقدار رجیستر GPIO را برابر با 0x00  قرار می‌دهیم
  • در خط 37 با استفاده از RETLW مقدار 0x00  را در رجیستر W ذخیره می‌کنیم و شمارنده برنامه (PC) را به آدرس گرفته شده از stack (بعد از دستور CALL) منتقل می‌کنیم (برای این کار باید دستور CALL اجرا شده باشد و آدرس دستور بعد از خود را در stack ذخیره کرده باشد)
اطلاعات
0
1
لینک و اشتراک
profile

empitrix

متخصص الکترونیک

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله