دوشنبه , ۳ تیر ۱۳۹۸
آخرین مطالب
LINK TABLES
خانه | میکروکنترلر | دوره آموزشی AVR | رجیستر پرچم در AVR

رجیستر پرچم در AVR

رجیستر پرچم در AVR

AVR نیز همانند دیگر میکروپروسسورها برای تشخیص شرایط محاسباتی دارای یک ثبات پرچم میباشد. ثبات پرچم در AVR ثبات وضعیت(SREG) نام دارد که یک ثبات ۸ بیتی است.این ثبات در محدوده ثباتهای I/O قرار دارد.به بیت های این ثبات بیت های شرطی نیز می گویند بدین معنا که  برخی از شرایطی را که بعد از اجرای یک دستور به وجود می آیند نشان می دهند.هر کدام از این بیت ها می توانند برای اجرای یک پرش بکار برده شوند.یعنی با خواندن این ثبات و بررسی وضعیت بیت های آن می توانیم پردازش شرطی ایجاد کنیم.

در ادامه توضیح کوتاهی در مورد بیت های موجود در ثبات پرچم وضعیت آورده شده.

C (پرچم نقلی):

 هنگامی که عدد نقلی از بیت D7 خارج می شود این بیت برابر یک می شود.این رویداد پس از یک جمع یا تفریق ۸ بیتی اتفاق می افتد.

Z (پرچم صفر): 

این پرچم نتیجه عملیات ریاضی و منطقی را منعکس می کند.اگر جواب صفر باشد این پرچم یک می شود واگر جواب ضفر نباشد مقدار پرچم صفر می شود.

N (پرچم منفی): 

اگر بیت D7 در نتیجه عملیات صفر باشد این بیت صفر است و اگر D7 یک باشد این بیت نیز یک است.بیت D7 در نمایش دودویی اعداد، بیت علامت است و اگر صفر باشد عدد مثبت و در صورت یک بودن عدد منفی است.

V (پرچم سرریز): 

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

S (پرچم نیمه نقلی): 

در صورت وجود رقم نقلی از D3 به D4 این بیت یک می شود،در غیر این صورت صفر می شود.در برخی میکرو کنترلر ها مانند ۸۰۵۱ این بیت(AC  ( Auxiliary Cary flag نامیده شده است.

I (بیت فعال ساز وقفه عمومی): 

با یک کردن این بیت تمام  منابع وقفه در میکرو فعال می شوند.در صورت صفر کردن بیت I همه وقفه ها غیر فعال شده و میکرو به هیچ وقفه ای پاسخ نمی دهد. کاربرد بیت T در پست های بعدی به همراه مثال برای نقش پرچمهای وضعیت شرح داده خواهد شد. آشنایی با نقش این بیت ها و نحوه ایجاد شرط توسط آنها در برنامه نویسی با زبان اسمبلی لازم است،در صورتی که در زبان C تقریبا احتیاجی به چک کردن ثبات وضعیت توسط برنامه نویس نیست و این کار توسط کامپایلر انجام می شود.

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۹ دیدگاه

  1. سلام
    خط اول بیت N رو بیشتر توضیح بده لطفا.

    • چیز خیلی عجیبی رو نمیگه. یک بایت رو در نظر بگیر. بیت ها را از کم ارزش ترین تا پر ارزش ترین به ترتیب از D0 تا D7 شماره گذاری کن. در نماش دودویی یا باینری اعداد علامت دار پرارزش ترین بیت یا D7 نشان دهنده علامت عدد هست و در اندازه عدد نقشی نداره. وقتی این بیت ۱ باشه عدد منفیه یعنی بیت N مقدار یک میگیره. وقتی هم که عدد مثب باشه D7 صفر هست و بیت N مقدارش صفره. کلا این بیت پرچم منفی هست و یک بودنش نشون دهنده ی منفی شدن عدد حاصل از عملیات انجام شده هست.

  2. سلام
    عدد نقلی چیه؟

    • درود
      برای اینکه خیلی ساده بگم شما اینطور تصور کنید. میخواید دو عدد ۸ بیتی را باهم جمع کنید(برای سادگی بدون علامت در نظر بگیرید). هر عدد ۸ بیتی بیشترین عددی که میتونه داخل خودش جا بده ۲۵۵ میشه .حالا اگه حاصل جمع این دو عدد ۸ بیتی کمتر از ۲۵۵ بود که هیچی. اما اگه از ۲۵۵ بیشتر شد (مثلا ۲۶۰) اونوقت دیگه داخل یک بایت جا نمیشه و باید داخل دو تا بایت نمایش بدیمش. در این حالت از بیت هشتم حاصل جمع یه دونه یک خارج میشه و در بیت اول از بایت دوم قرار می گیره که بهش عدد نقی گفته میشه. برای اینکه خودتون تمرین کرده باشید دو عدد زیر را باهم جمع کنید و بیت نقلی را ببینید:
      FF + 05 ؟

      • وقتی ما این عمل جمع رو انجام میدم .یه بیت اضافه رو از رجیستر c میگیریم .حالا سوال من اینه که وقتی ما چند نمونه از این جمع ها رو داریم و باید از نتایج اون ها در جایی دیگه استفاده کنیم. چه طوری این نتایج رو باید ذخیره کنیم؟

        • خب باید اول به این نکته اشاره کنم که شما قرار نیست تمام این جمع ها رو همزمان انجام بدید. و در هر زمان یکی از اون ها انجام میشه. وقتی شما میخواید نتیجه جمع را بعدا استفاده کنید باید حاصل را ذخیره کنید. ۳۲ رجیستر همگانی که در avr در نظر گرفته شده به همین منظور میتونه استفاده بشه.شما حاصل جمع های خودتون را که قطعا از ۸ بیت بیشتر شده را در دو رجیستر ۸ بیتی ذخیره می کنید. وقتی عملیات جمع تموم شد. دوباره رجیسترها را بازخوانی می کنید و از حاصل جمع ها استفاده می کنید.
          اما اگه منظورتون اینه که یک سری جمع پی در پی دارید که انجام بدید خب قضیه فرق می کنه. دستورات عادی جمع در اسمبلی avr نمی تونند بیت نقلی را در حاصل جمع دخالت بدند. اما دستوری به نام ADC وجود داره که علاوه بر اینکه دو رجیستر را باهم جمع می کنه بیت نقلی را هم به این حاصل جمع اضافه می کنه. اگه نیاز به توضیح بیشتری دارید بگید تا براتون مثال بزنم

          • مثلا فرض میکنیم ۲ عدد ۱۰ بیتی رو باید جمع کنیم و نتیجه اون رو ذخیره کنیم برای خط های بعدی برنامه.

            ۱- این ۲ عدد ۱۰ بیتی رو چه طوری باید در رجیستر ها قرار بدیم؟

            ۲-وقتی avr یک عدد رو در دو رجیستر ذخیره میکنه یک حافظه به اندازه word تشکیل میشه؟

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

          • عدد ۱۰ بیتی داخل یه رجیستر جا نمیشه پس اونه به دو قسمت ۸ بیت کم ارزش و ۲بیت پر ارزش می شکنیم. اول قسمت های ۸ بیتی را باهم جمع می کنیم. که ممکنه رقم نقلی تولید کنن. تا اینجا جمع معمولی انجام دادیم. حالا میریم سراغ رجیستر با ارزش بیشتر که ۲ بیت داخل خودش داره. اینجا با دستور ADC جمع انجام میدیم. این دو رجیستر جمع میشن باهم و اگه رقم نقلی حاصل از جمع بایت های با ارزش کمتر تولید شده باشه هم با این ها جمع میشه.
            اما در مورد سوال دومت. نه اینطور نیست در avr بیشتر از ۸ بیت برای حافظه نداریم (البته بعضی رجیستر های ۱۶ بیتی داریم ولی موضوع حرف الان من نیست). در زبان سی خودش مثلا میتونه چنین کاری کنه ولی فقط نرم افزاریه.
            همونطور که دوست خوبم جلال هم توضیح داد در اسمبلی دست برنامه نویس کاملا باز برای انتخاب رجیستر ها.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *