مروری بر مهم ترین رجیسترهای کاربردی AVR ؟ #1 [8]
در این بخش به معرفی مفهوم رجیسترها و همچنین نحوه استفاده از آنها خواهیم پرداخت.
با ما در ادامه مطلب همراه باشید ...
در بخش پیشین [سازمان دهی حافظه در AVR] در مورد مکان رجیسترها توضیحاتی داده شد.دوستانی که این بخش رو مطالعه نکرده اند حتما یه مروری بکنند چون دیگه در مورد مکان رجیسترها در این بخش توضیحی ندادم !!!
همچنین تصویری که این بالا میبینید،نمایی از CPU کامپیوتر هست.بنابراین تعجب نکنید !
در ضمن خواهشا بخش ها را گام به گام دنبال کنید.ممنونم !
رجیستر چیست ؟؟؟
رجیستر ها حافظه هایی هستند که درون CPU وجود دارند.طول هرکدام 8 بیت بوده،تعدادشان محدود است و بدلیل ارتباط بسیار نزدیک با پردازنده سرعت فوق العاده بالایی نسبت به دیگر خانه های حافظه (SRAM) دارند.
هنگامی که CPU خواهان انجام عمل پردازش است به فضایی جهت انجام عملیات پردازشی خود نیاز دارد که این فضا همان حافظه داده یا SRAM میباشد.اما پیش از آنکه CPU اطلاعات را بر روی خانه های حافظه داده بریزد ابتدا از فضای رجیسترهای داخلی خود استفاده میکند در صورتی که فضای رجیسترها تکمیل شد داده ها را بر روی SRAM ذخیره میکند.
قاعدتا سرعت انجام عملیات پردازشی در رجیسترها به دلیل ارتباط نزدیک و بهینه با هسته پردازنده،بالاتر است.
رجیسترها در میکروکنترلر AVR :
در میکروکنترلرهای AVR تعداد 32 عدد رجیستر 8 بیتی در پردازنده میکرو (CPU) وجود دارد که از شماره R0 - R31 نامگذاری میشوند.
به دیاگرام زیر دقت کنید :
همانگونه که مشاهده میشود رجیسترها حد واسط CPU و SRAM هستند.یعنی ابتدا اطلاعات در رجیسترها ثبت شده و در صورتی که ظرفیت این حافظه ها تکمیل شد،CPU از SRAM استفاده میکند.
توجه کنید که میکروکنترلر AVR دارای 32 عدد رجیستر عمومی و 64 عدد رجیستر I/O است.
اون چیزی که ما باهاش کار داریم همون رجیسترهای I/O هستند.
نکته : واحد ALU به کلیه رجیسترهای عمومی پردازنده،دسترسی مستقیم دارد.
کلیه رجیسترهایی که در زیر بحث میشوند جزو رجیسترهای I/O هستند.
مقدار x در عبارات زیر تعیین کننده نام پورت مورد نظر است (مثلا :,PIND,DDRA,DDRB,PORTC,...).
- رجیستر DDRx :
این رجیستر دارای 8 بیت است که مقدار هر بیت تعیین کننده ورودی یا خروجی بودن همان بیت در پورت مورد نظر است.
اگر مقدار بیت 0 باشد ==>پین ورودی تعریف میشود.
اگر مقدار بیت 1 باشد ==>پین خروجی تعریف میشود.
برای DDRD داریم :
همونطور که ملاحظه میکنید 8 تا بیت داریم که از شماره های 0-7 شماره گذاری شده اند.ترتیب هم از راست به چپه !
برای مثال میخوایم پین سوم از پورت D رو بعنوان ورودی و پین ششم از همین پورت رو بعنوان خروجی تعریف کنیم.باید چه مقادیری رو به پین ها بدیم ؟!
پین سوم یعنی شماره 2
پین ششم هم یعنی شماره 5
DDRD
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
پس مقدار رجیستر DDRD=00100000 میباشد.
- رجیستر PORTx :
مقدار هریک از بیت های این رجیستر تعیین کننده High یا Low بودن پین متناظر است.
از این رجیستر تنها هنگام نوشتن در پورت استفاده میشود.
توضیح : ببینید ما با مقدار دهی DDRx تعیین کردیم که فلان بیت(پین) ورودی باشه یا خروجی ! با استفاده از DDRx تنها برای میکرو تعریف میکنیم که از اون پین مورد نظر چه استفاده هایی میخوایم بکنیم.(دقت کنید که مقدار دهی این رجیستر فقط یه تعریفه ولا غیر ! ).
اما حالا نوبت اینه که برای هر پین وضعیت هم تعیین کنیم.
فرض کنید که در نظر داریم یه LED رو به یکی از پین های میکرو وصل کنیم و فرمان بدیم که اون LED روشن بشه !
میایم چیکار میکنیم ؟! خوب دقت کنید !
چون میخوایم از پین مورد نظر ولتاژ بگیریم پس باید اون پین رو مقدار 1 (خروجی) بهش اختصاص بدیم.اما با 1 کردن اون بیت LED روشن نمیشه!چرا؟ چون ما فقط بهش گفتیم که تو خروجی باش،نگفتیم ولتاژ هم بده !
حالا اگه بیت متناظر همون پین رو در رجیستر PORTx برابر مقدار 1 قرار بدیم،وضعیت اون بیت(پین) به حالت High میرود و ولتاژ به پین مورد نظر وارد میشود.
پس :
این رجیستر دارای 8 بیت است که مقدار هر بیت تعیین کننده High یا Low بودن همان بیت در پورت مورد نظر است.
اگر مقدار بیت 0 باشد ==>وضعیت LOW
اگر مقدار بیت 1 باشد ==>وضعیت HIGH
برای PORTD داریم :
حتما براتون سوال پیش اومده (شایدم پیش نیومده!) که اگه بیت موردنظرمون ورودی تعریف شده بود،اونوقت HIGH یا LOW بودن چه معنایی داره ؟!
پس به ادامه ماجرا گوش فراسپارید !!!
- رجیستر PINx :
این رجیستر تعیین کننده وضعیت فیزیکی بیت(پین) مورد نظر برای CPU است.
از این رجیستر تنها هنگام خواندن از پورت استفاده میشود.
اگر پین مورد نظر بعنوان ورودی در نظر گرفته شده باشد،بیت متناظر با آن در رجیستر PINx،حاوی اطلاعات دریافتی از همان پین مورد نظر در میکرو است.
توضیح : همونطور که عرض کردم فقط هنگامی که میخوایم از پایه اطلاعات رو بخونیم یا بعبارتی پایه(پین) موردنظرمون رو ورودی تعریف کرده باشیم از این رجیستر استفاده میکنیم.
فرض کنید یه سنسور رو به یکی از پایه های میکرو وصل کرده ایم و این سنسور در شرایط مختلف مقدار 0 یا 1 را برمیگرداند.
حتما میدونید که چون سنسور داره اطلاعات رو به سمت میکرو میفرسته و میکرو هم باید اون اطلاعات رو دریافت کنه،در نتیجه پین مورد نظر باید در حالت ورودی تنظیم شده باشه !
اون موقع اگه خواستیم متوجه بشیم که الان سنسور مقدارش 1 هست یا 0 میایم و مقدار بیت متناظر در رجیستر PINx رو قرائت میکنیم.
پس :
این رجیستر دارای 8 بیت است که مقدار هر بیت تعیین کننده High یا Low بودن همان بیت در پورت مورد نظر است.
اگر مقدار بیت 0 باشد ==>وضعیت LOW
اگر مقدار بیت 1 باشد ==>وضعیت HIGH
اما در حالت ورودی منظور از HIGH یا LOW بودن چیست ؟!
اگر بیت مورد نظر در حالت ورودی تنظیم شده باشد و بیت مورد نظر آن در رجیستر PORTx بصورت High تعریف شده باشد،مقاومت پول آپ داخلی فعال میشود.
در صورتیکه بیت مورد نظر در رجیستر PORTx بصورت LOW تعریف شود،پین مورد نظر به صورت Tri-State یا Hi-z در آمده که معنای آن این است که پین موردنظر وضعیت مشخصی ندارد.همانند هنگامی که برای پین هیج مقداری در رجیسترهای DDRx و PORTx و PINx تعریف نکرده باشیم(حالت پیشفرض).
نکته :
در صورتی که پین را در حالت پول آپ تنظیم کردید،لازم است که بیت PUD از رجیستر SFIOR را یک کنید.
به بقیه بیت هاش فعلا کاری نداشته باشید تا بعدا که نیاز بهشون پیدا کردیم دربارشون توضیح بدم.
اینو گفتم که بعدا نگید نگفتی !!!
انشاءالله در قسمت بعدی به تحلیل دیگر رجیسترها خواهیم پرداخت.
پس فعلا ...