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

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

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

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

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

دریافت مستندات
آخرین نظرات
  • ۲۰ خرداد ۰۰، ۲۰:۴۹ - حسام الدین سلطانی
    خعلی عالی
  • ۲ ارديبهشت ۰۰، ۱۸:۱۱ - حسام الدین سلطانی
    خیلی عالی

 

در این بخش به معرفی مفهوم رجیسترها و همچنین نحوه استفاده از آنها خواهیم پرداخت.

 

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

 

در بخش پیشین [سازمان دهی حافظه در AVR] در مورد مکان رجیسترها توضیحاتی داده شد.دوستانی که این بخش رو مطالعه نکرده اند حتما یه مروری بکنند چون دیگه در مورد مکان رجیسترها در این بخش توضیحی ندادم !!!

همچنین تصویری که این بالا میبینید،نمایی از CPU کامپیوتر هست.بنابراین تعجب نکنید ! enlightened

در ضمن خواهشا بخش ها را گام به گام دنبال کنید.ممنونم ! wink


رجیستر چیست ؟؟؟
رجیستر ها حافظه هایی هستند که درون 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 را یک کنید.

به بقیه بیت هاش فعلا کاری نداشته باشید تا بعدا که نیاز بهشون پیدا کردیم دربارشون توضیح بدم.

اینو گفتم که بعدا نگید نگفتی !!!

 

انشاءالله در قسمت بعدی به تحلیل دیگر رجیسترها خواهیم پرداخت.

پس فعلا ...yes

 

عالی بود به جز آخرش که یکم کم توضیح دادین من که کامل متوجه نشدم
پاسخ:
لطفا اگر سوالی براتون پیش اومده در انجمن مطرح کنید تا پاسخگویی بشه !
باتشکر
خوب بود . ممنون
علی بود.
پاسخ:
منظورتون عالیه ؟!!!!

مرسی
سلام
DDRD=00010000
فکر کنم صحیحش این باشه: DDRD=00100000
پاسخ:
همین که نوشتم درسته !
دقت کنید.

- رجیستر PINx :

این رجیستر تعیین کننده وضعیت فیزیکی بیت(پین) مورد نظر برای CPU است.


اگه کپی میکنی،منبعش رو هم بنویس !!! منبع : www.noise.blog.ir
وضعیت فیزیکی و غیرفیزیکی یعنی چی؟
پاسخ:
فکر میکنم توضیحات خیلی واضحه !
شما از یه پست ساده بنده 3 تا سوال پرسیدین !!!
سوال پرسیدن عیب نیست ولی دقت نکردن عیبه !

منظور از استفاده از لفظ "فیزیکی" یعنی در دنیای خارج از میکروکنترلر !
منظور سخت افزاره نه نرم افزار !

زیاد چیز مهمی نیست که بخواین خودتونو درگیرش کنین !
فقط بهش گفتیم که تو خروجی باش،نگفتیم ولتاژ هم بده !
سوال:
مگه چه اشکالی داره همون موقع یکباره بهش بگیم حالا ولتاژ بده؟!! دیگه چه کاریه هی بگیم خروجی باش حالا ولتاژ بده؟
پاسخ:
یکم که بیاین جلوتر و عملی کار کنید،خیلی خوب به این نتیجه خواهید رسید که چرا !
سلام
به نظر منم آقا یا خانم D درست می گه ها...
فکر کنم تو جدول درسته ولی اینجا اشتباه نوشتید"پس مقدار رجیستر DDRD=00010000 میباشد.
ممنون از سایت خوب و مطالب مفیدتون
با تشکر
پاسخ:

تشکر ویژه از شما

مطلب اصلاح شد.

"اگر بیت مورد نظر در حالت ورودی تنظیم شده باشد و بیت مورد نظر آن در رجیستر PINx بصورت High تعریف شده باشد،مقاومت پول آپ داخلی فعال میشود"

تنظیم بیت تو حالت ورودی که دست ماست و از ddr استفاده می کنیم.ولی رجیستر
PINx رو که فرمودین وقتی اطلاعات رو می خونیم ازش استفاده می کنیم...یعنی ما تنظیمش نمی کنیم و اطلاعات ورودی روشه!
پس چرا نوشتین "تعریف شده باشد"؟!
پاسخ:

آفرین !

صد آفرین !!!


معلوم میشه که حواست جمعه !

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

این مطلب بعد از حدود 15 ماه اصلاح شد !


بنده اشتباها PORTx رو نوشتم PINx  !!!!

مطلب اصلاح شد.

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

خخخخخ ....
دم شما گرم
پاسخ:
ممنون
متاسفانه فقط یک جمله بیشتر نمیتونم بگم :

فوق العاده بود ((:
پاسخ:
ممنون :)
واقعا عالی بود دستتون درد نکنه
پاسخ:
:)

MERCE KHEILI KHOBE

 

پاسخ:
تشکر
ممنون- خیلی خوب بود. کلی به کار من اومد.
ممنون- خیلی خوب بود. کلی به کار من اومد.
عالی بود وخدا قوت
باسلام
میشه این قسمتو توضیح بدین؛"در صورتی که پین را در حالت پول آپ تنظیم کردید،لازم است که بیت PUD از رجیستر SFIOR را یک کنید."

خیلی ممنون

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

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

آیا در جریان هستی که کپی کردن دزدی محسوب میشه ؟! پس منبع رو بنویس | منبع : www.noise.blog.ir
در صورتی که پین را در حالت پول آپ تنظیم کردید،لازم است که بیت PUD از رجیستر SFIOR را یک کنید

آیا در جریان هستی که کپی کردن دزدی محسوب میشه ؟! پس منبع رو بنویس | منبع : www.noise.blog.ir
در صورتی که پین را در حالت پول آپ تنظیم کردید،لازم است که بیت PUD از رجیستر SFIOR را یک کنید.

آیا در جریان هستی که کپی کردن دزدی محسوب میشه ؟! پس منبع رو بنویس | منبع : www.noise.blog.ir
داره سخت میشه 

بازم ممنون

سلام مهندس جان
صفحه 57 از دیتاشیت 357 صفحه ای میکرو Mega16 نوشته اگه PUD مقدارش یک بشه پول آپ تمام پورتها غیرفعال میشه و تاکید کرده که حتی اگه روی پورتی DDR و PORT بصورت پول آپ تنظیم شده باشه با یک شدن PUD پول آپ اون پورت هم غیرفعال میشه
When this bit is written to one, the pull-ups in the I/O ports are disabled even if the DDxn and
PORTxn Registers are configured to enable the pull-ups

سلام.

اگه pud به 1 تغییر کنه مقاومت های پول آپ غیر فعال میشن نه فعال.چون تا اون جا که من میدونم  pud یعنی pullup disable.

ارسال نظر

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