.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

" نویز رسانه ای است برای آموزش آسان مفاهیم میکروکنترلر و الکترونیک "

دریافت مستندات
آخرین نظرات
  • ۱۵ آبان ۹۵، ۱۸:۵۸ - الهام
    ممنون

در این بخش به ادامه بررسی رجیسترهای میکروکنترلر AVR خواهیم پرداخت.

مبحث این دفعه،بررسی رجیستر SREG میباشد.

 

با ما در ادامه مطلب همراه باشید !

 

 

در بخش قبلی در مورد رجیسترهای مهم I/O صحبت کردیم.

در ادامه به بررسی رجیستر "وضعیت" یا همون "Status Register" خواهیم پرداخت.

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

 

اول از همه یه نگاه به سر و ریختش بندازید :

 

طبق معمول 8 تا بیت داره (دیگه اینو باید بدونید که همه رجیسترهای میکرو AVR هشت بیتی هستند !).

با نام های I-T-H-S-V-N-Z-C .

 

خب این از شکل و شمایلش !

 

بریم سر اصل مطلب :

 

این رجیستر وضعیت جاری پردازنده را نشان میدهد و بر اثر برخی از عملیات CPU فعال میشود.

هنگام Reset شدن تمامی بیت های آن "0" میشوند.

 

به زبان خودمونیش این میشه :

ببینید ! وقتی میکرو دستورات یک سیکل رو انجام داد،سیکل که انجام شد وضعیت عملیات محاسباتی انجام شده رو اعلام میکنه.

در واقع این رجیستر همواره دارای اطلاعاتی از آخرین دستور محاسباتی اجرا شده است.

 

هرکدوم از بیتها که ازش بعنوان "فلگ (Flag)" یا "پرچم" نیز یاد میشود با حرف اختصاری وظیفه خود،نامگذاری میشوند.

 

حالا شروع میکنیم به توضیح هریک از فلگ ها و شرح وظایف آنها :

 

0.فلگ "C" یا همون "Carry" :

این بیت نشان دهنده وجود یک Carry در عملیات منطقی و محاسباتی انجام شده میباشد.

در صورت وجود Carry در عملیات این فلگ "یک" میشود.

 

Carry دیگه چه ... (چیه laugh) ؟

به هیچ عنوان نگرخید !

دوستانی که با مبحث مدارات منطقی آشنایی دارند حتما مفهوم "کری" رو میدونند چیه.(شاید به اسم "بیت نقلی" بشناسیدش )

حالا یه مثال هم میزنیم برای دوستانی که نمیدونند چیه یا یادشون نمیاد ؛

فرض کنید تو برنامه قراره دو تا عدد 11111111 و 1 با هم جمع بشند :

 

 

 

 

 

 

این "یکی" که بیت اضافی هست و بیت نهم حساب میشه رو Carry مینامند !

در واقع میکرو از طریق این پرچم متوجه میشه که علاوه بر هشت بیت اصلی،یک بیت نهمی هم وجود داره که اون در قالب هشت بیت نمیگنجیده !!!

حالا فرض رو بر این بگیرید که این فلگ اصلا تعبیه نشده بود ! میکرو از کجا میخواست بفهمه که حاصل 100000000 هست نه 00000000 ?!!

 

1.فلگ "Z" یا همون "Zero Flag" :

هنگامی که نتیجه عملیات ریاضی برابر صفر باشد برابر "یک" میشود.


2.فلگ "N" یا همون "Negative Flag" :

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

منفی بودن یک عدد مساوی با "1" بودن بیت شماره هفت عدد باینری (آخرین بیت) میباشد :

 

 


3.فلگ "V" یا همون "Overflow" :

این فلگ اعلام میکند که در انجام عملیات Overflow رخ داده است.

با Overflow شدن عملیات ، این بیت "یک" میشود.

 

این Overflow چقدر اسمش آشناست !

چی بود ؟؟؟

هرگاه دو عدد مثبت با هم جمع شوند و حاصل عددی منفی شود و یا هرگاه دو عدد منفی با هم جمع شوند و حاصل مثبت شود میگویند "Overflow" رخ داده است.

که باعث میشود خطا رخ دهد و نتایج اشتباهی بدست بیاد.

در واقع ما انتظار داریم با جمع دو عدد مثبت حاصل عددی مثبت شود و با جمع دو عدد منفی حاصل عددی منفی شود.

 

به مثال زیر نگاه کنید :

 

دقیقا همون اتفاق افتاده !

دو تا عدد منفی جمع شدند و حاصل مثبت شده !

 

میکرو باید آگاه بشه که خطا رخ داده ! نه ؟!

پس وظیفه این فلگ اعلام خطا به میکرو هست که محاسبات دچار اشتباه نشند خدای ناکرده !!!


4.فلگ "S" یا همون "Sign Flag" :

این فلگ در واقع علامت واقعی عدد را نمایش میدهد !

حالا چجوری ؟!

خیلی ساده ! با استفاده از یک عمل منطقی با نام "XOR".

میکرو میاد حاصل فلگ های "N" و "V" رو با هم XOR میکنه ! جوابشو میزاره تو فلگ "S".


5.فلگ "H" یا همون "Halfcarry Flag" :

اگر بین بیت 3 و 4 یک عدد باینری،Carry حاصل بشه این فلگ "یک" میشود.(معمولا در انجام عملیات BCD استفاده میشود !)


6.فلگ "T" یا همون "Transferbit Flag" :

از این فلگ جهت بارگذاری و ذخیره بیت ها از رجیستری به رجیستر دیگر استفاده میشود.(بی خیالش بشید فعلا !!!)


7.فلگ "I" یا همون "Interupt Flag" :

این فلگ مجوز صدور وقفه را صادر میکند.(وقفه دیگه چیه؟؟؟ (دوباره هول نکن عزیز دل برادر !!!))

هرگاه قرار باشه وقفه ای رخ بده،بعد از اینکه دستور اجرای وقفه صادر شد میکرو چک میکنه که آیا اصلا اجازه داره اون وقفه رو عملیاتی کنه یا نه ؟!

با "یک" شدن این پرچم،مجوز صادر میشود و پس از اجرای وقفه مجددا "صفر" میشود.


 

خب این هم از بررسی مهم ترین رجیستر میکروکنترلر AVR تحت عنوان Status Register یا SREG .

همونطور که بالاتر خدمتتون عرض کردم ما با این رجیستر بصورت مستقیم کاری نداریم مگر اینکه بخوایم در سطح "اسمبلی" برنامه نویسی کنیم.

 

یه توضیح کلی و مختصر بدم برای کسانی که شاید با این رجیستر احساس غربت پیدا کردند :

 

ببین آقاجون !

میکرو دستوراتی که توسط برنامه نویس نوشته شده رو قراره اجرا کنه.

شروع میکنه به ترتیب و خط به خط اجرا کردن برنامه نوشته شده.

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

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

حاصل جمع میتونه هر عددی باشه ! (قرار نیست فقط 2 تا عدد خاص رو باهم جمع کنیم که !)

حاصل میتونه صفر،منفی،مثبت،دارای بیت نقلی،دارای خطای Overflow،دارای بیت نیم نقلی و ... باشه.

اما به دلیل فرم خاص 8 تایی بودن عدد باینری،باید یه سری ملاحظاتی رعایت بشه.

فرضا اگه عدد نهمی اضافه بشه،داخل قالب 8 تایی نمیگنجه و همین امر باعث بروز خطا در محاسبات میشه !

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

حالا برای اینکه اشتباه نکنه،بعد از اینکه هر دستوری رو اجرا کرد میاد و این رجیستر رو چک میکنه و موارد لازم رو لحاظ میکنه.

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

 

از بین این 8 فلگ،مهمترینشون برای ما،فلگ "Interupt Flag" هست که تحت عنوان فلگ "I" ازش یاد میشه.

فلگ صدور مجوز وقفه ! (میدونم که تو دلتون چه بد و بیراه هایی به من میدید ! اما عجله نکنید به توضیح وقفه هم میرسیم ).

اینکه وقفه چیه و به چه دردی میخوره مربوط به بحثای بعدیه،فعلا بدونید که با چنین فلگی کار داریم !!!

 

اگر عمری بود با قسمت بعدی خدمتتون میرسم.

موفق باشید ...

خیلی خیلی خیلی ممنونم از توضیحات خوب و شیرینتون
پاسخ:
خواهش میکنم.
انشاءالله که موفق باشید.
مفید بود، متشکرم.
پاینده باشید
پاسخ:
زنده باشید !
خوشحال شدم از اظهار لطفتون.
بسیار جالب بود ممنون
پاسخ:
موفق باشید.

سلام . دستت درد نکنه . به نظر من که خیلی مختصر و واضح بود .

یا علی

پاسخ:
سلام.سپاسگذارم.
عالی بود.مرسی

aliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii mer30
THANKS
عالییییییییییییی!
واقعا توضیح خوبی بود...ممنون :)
سلام گرم خدمت اقای احسان نوری
       اقا دمت گرم تک تک مطالبتون ارزش خوندن و دوباره خوندن رو داره.(B
راضیم ازت
شیوا بود

پاسخ:
شیوا کیه ؟ً! :))))
سلام بابت توضیحات ممنون.ممکنه بگید اگر بخوایم یک رجیستر رو not کنیم در اسمبلی باید چیکار کنیم؟!
پاسخ:
یعنی چه که رجیسترو نات کنیم ؟
مگه رجیسترم نات میشه ؟؟؟!!!
سلام،منظورم اینه که اگه داخل یک خونه ی رجیستر عدد 0 هست 1 بشه یا اگه 1 هست 0 ؟!یه جورایی همون نات شدن مقادیر داخل رجیستر میشه
پاسخ:
توسط دستورات اسمبلی فقط میشه بصورت بیت به بیت عمل کرد و برای نات کردن کلی رجیستر دستوری وجود نداره!
با سلام.
آقا دمتون گرم.خیلی عالی بود.
دستتون دردنکنه
پاسخ:
خواهش میکنم .
سلام ممنون که پاسخ میدید...آره دستورهایی که بیت به بیت عمل نات رو انجام بده و حاصل نات رو مرتب داخل یک رجیستر دیگه بریزه؟
خودم بلدم بیت به بیت نات کنم اما همین که بخوام مرتب حاصل نات ها رو توی یک رجیستر بنویسه رو نمی تونم...
پاسخ:
خیلی وقته سراغ اسمبلی نرفتم.
اما تا جایی که یادم میاد،باید از حلقه استفاده کنید !
agha ehsan y dune bashi
پاسخ:
سپاس
واضح . عالی بود ((:
پاسخ:
تشکر
ماهی و یه دونه.گلکم
پاسخ:
تشکر
آقا احسان 
دمت گرم 
عالی بود
ممنون

پاسخ:
ممنون
عکس ها بالا نمیاد...خواهشا رسیدگی کنید..........
عالی بود ممنون
بسیار عالی بود.
ممنونم

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">