آموزش AVR

معرفی کامل رجیستر های AVR (آموزش AVR #4)

در این جلسه به معرفی و نحوه استفاده از رجیستر های AVR میپردازیم. در جلسه قبل ما به آموزش پردازنده و حافظه میکروکنترلر AVR پرداختیم.

رجیستر چیست؟

رجیستر ها یک نوع حافظه هستند که در سی پی یو قرار دارند. طول هر رجیستر 8 بیت است و به دلیل اینکه با پردازنده میکروکنترلر ارتباط نزدیکی دارند ، سرعت بالایی دارند. همچنین تعدادش آن ها محدود است.

وقتی که CPU میخواهد چیزی را پردازش کند به یک فضا برای انجام عملیات پردازشی نیاز دارد. این فضا همان حافظه SRAM است. ولی قبل اینکه اطلاعات روی SRAM ریخته شوند، سی پی یو از فضای رجیستر داخلی خود استفاده میکند و وقتی که فضای رجیستر ها تکمیل شود نوبت به SRAM میرسد. (به همین دلیل سرعت آن بیشتر است)

رجیستر های میکروکنترلر های AVR

به تصویر زیر دقت کنید :

آموزش رجیستر AVR
آموزش رجیستر AVR

همانطور که مشاهده میکنید ، ما در میکروکنترلر 32 عدد رجیستر هشت بیتی داریم. این رجیستر ها R0-R31 نام گذاری میشوند.

همانطور که میبیند ، Register ها بین CPU و SRAM هستند. یعنی اول اطلاعات در رجیستر ها ثبت میشود و بعد از آن وارد SRAM میشود.

نکته هایی که برای ادامه مطلب باید بدانید :

  1. میکروکنترلر های ای وی آر 32 رجیستر عمومی دارند و 64 رجیستر I/O دارند.
  2. ما دراین آموزش کلا با رجیستر های ورودی / خروجی (I/O) کار داریم .
  3. ALU به همه رجیستر های عمومی میکروکنترلر دسترسی دارد.
  4. x توی ادامه مطلب به معنی اسم پورت ها هست مثل A , B , و …

رجیستر DDR

این رجیستر 8 بیتی است. مقدار هر بیت تعیین کننده ورودی یا خروجی بودن همان بیت در پورت مورد نظر هست.

یعنی :

  • اگر مقدار بیت 0 باشد > پین ورودی در نظر گرفته میشود.
  • اگر مقدار بیت 1 باشد > پین خروجی در نظر گرفته میشود.

این جدول رو ببینید :

رجیستر DDRx در میکروکنترلر AVR
رجیستر DDRx در میکروکنترلر AVR

همانطور که گفتیم و در تصویر بالا هم میبینید ، ما 8 بیت داریم و از 0 تا 7 نام گذاری شده اند. برای مثال ما اگر بخواهیم پین چهارم از پورت A را به عنوان ورودی و پین 7 از پورت A را به عنوان خروجی تعریف کنیم باید این مقادیر را به پین بدهیم :

DDRD : b01000000

(ترتیب از راست به چپ هست)

رجیستر PORT

در رجیستر DDRx ما فقط تعیین کردیم که پین (یا همون بیت) ورودی باشد یا خروجی و از رجیستر PORTx فقط وقتی استفاده میکنیم که بخواهیم چیزی در پورت بنویسیم. با مقدار دادن به بیت های این رجیستر ما تعیین میکنیم که پین Low هست یا High. حالا برای هر پین وضعیت را تعیین میکنیم ، مثلا وقتی میخواهیم یک ال ای دی را روشن کنیم ، یکی از پایه های ال ای دی را به یک پین از میکروکنترلر وصل میکنیم. پین مورد نظر را با DDRx خروجی در نظر میگیریم. سپس همان بیت را با PORTx برابر با 1 قرار میدهیم.

در نتیجه :

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
  • اگر مقدار پین 1 باشد > High
  • اگر مقدار پین 0 باشد > Low

ما برای پورت PORTD داریم :

رجیستر PORTx در میکروکنترلر های AVR

رجیستر PIN

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

آموزش رجیستر PINx در AVR

این رجیستر هم 8 پایه هست و ما با 0 یا 1 قرار دادن آن را High یا Low میکنیم.

  • اگر مقدار پین 1 باشد > High
  • اگر مقدار پین 0 باشد > Low

حالا اگر حالت ورودی را انتخاب کرده باشیم چه اتفاقی می افتد؟ اگر پین روی ورودی تنظیم شده باشد و پین در رجیستر PORTx برابر با High باشد، مقاومت پول آپ داخلی فعال میشود. همچنین اگر پین روی ورودی تنظیم شده باشد ولی پین در رجیستر PORTx بر روی Low تنظیم شده باشد، پین حالت نامشخص به خودش میگیرد و مثل وقتی میشود که انگار اصلا هیچی برای آن تعریف نکردیم.

رجیستر SREG

SREG یعنی رجیستر وضعیت (Status Register). این رجیستر بسیار مهم است ولی زیاد مورد استفاده قرار نمیگیرد. این رجیستر مثل بقیه رجیستر ها 8 بیت دارد. در صورتی که بخواهیم در سطح اسمبلی برنامه نویسی کنیم به این رجیستر ها بیشتر نیاز داریم.

تصویر پایین را ببینید :

رجیستر SREG در میکروکنترلر

این رجیستر در کنار بعضی از عملیات های CPU فعال میشود و وضعیت فعلی پردازنده را نشان میدهد. وقتی که پردازنده Reset شود همه بیت های این رجیستر 0 میشوند. این رجیستر اطلاعاتی را نشان میدهد وقتی میکروکنترلر ما دستورات را اجرا میکند و محاسبات را انجام میدهد.

فلگ های رجیستر SREG

هر کدام از بیت های این رجیستر به پرچم (یا فلگ یا Flag) نام برده میشوند و و توسط اسم اختصاصیشان نام گذاری میشوند.

1 : فلگ C (یا Carry) : این بیت نشان میدهد که یک Carry (حمل ، انتقال (بیت نقلی)) در عملیات منطقی و محاسبانی وجود دارد. در صورت وجود انتقال این فلگ 1 میشود.

یک مثال از Caryy :

آموزش AVR

فرض کنید در برنامه قرار است دو عدد 11111111 و 1 با هم جمع شوند، عددی که رنگش قرمز است بیت نهم است و به آن Carry میگویند. با این کار میکروکنترلر میفهمد که جواب ما 10000000 است و 00000000 نیست.

میکروکنترلر AVR از طریق این فلگ متوجه میشود که علاوه بر 8 بیت اصلی ، یک بیت اضافه هم دارد.

2 : فلگ Z (یا Zero) : هر وقت حاصل عملیات ریاضی 0 شود، این بیت 1 میشود.

3 : فلگ N (یا Negative) : هر وقت نتیجه عملیات منطقی یا ریاضی منفی شود این فلگ 1 میشود.

یعنی هر وقت حاصل ما منقی بشه بیت شماره هفت عدد باینری 1 میشود.

4 : فلگ V (یا Overflow) : این پرچم اعلام میکند که در عملیات یک Overflow رخ داده است.

هر وقت عملیات و محاسبات Overflow شوند، این بیت 1 میشود.

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

5 : فلگ S (یا Sign) : این پرچم علامت واقعی عدد را نشان میدهد.

این فلگ با استفاده از عملیات منطقی XOR و جمع پرچم های V و N را XOR میکند و نتیجه را در فلگ S قرار میدهد.

تصویر زیر رو ببینید :

Sign Flag

6 : فلگ H (یا HalfCarry) : اگر بین بیت های 3 و 4 یک عدد باینری Carry شوند حاصل این پرچم 1 میشود.

7 : فلگ T (یا Transfer bit) : با این فلگ ، بیت ها بارگذاری و ذخیره میشوند و انتقال داده میشوند به رجیستر دیگر.

8 : فلگ I (یا Interupt) : کار این پرچم صدور مجوز برای وقفه یا همان اینتراپت است.

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

4.6 (21 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

برای ارسال تصاویر از انجمن سایت استفاده کنید.

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

9 نظر

  1. آیا تمامی این آموزش در سایت با برنامه اتمل استودیو است؟

    1. سلام عزیز
      دوره ای وی آر با اتمل استودیو هست: irenx.ir/avr-course

  2. سلام.ایا زمانی که اوپ امپ به منبع تغذیه وصل باشد و ورودیهای معکوس و غیر معکوس به جایی متصل نباشند،درخروجی ولتاژ صفر ولت را خاهیم داشت؟؟

  3. ببینید من یه مدار دارم که با avrیه ماسفت مثبت را راه اندازی میکنه و خروجیشم یه سیم پیچ هست برای ایجاد میدان مغناطبسی.که با ایسی درایو میشه ماسفتش.حالا من میخاستم به جای ماسفت مثبت ازماسفت منفی استفاده کنم.امکانش هست؟

  4. ینی دراصل من با میکرو میخام ماسفت راه اندازی کنم ،پالس ارسالی میکرو به ماسفت فرق میکند برای ماسفت مثبت و منفی؟

  5. باسلام و خسته نباشید
    خاستم ببینم اگررجیستری از میکرو را به عنوان input تعریف کنیم از دستور pinباید استفاده کنیم و اگر به عنوان output تعریف کنیم از دستور پورت استفاده کنیم؟؟؟؟
    pinx=input
    portx=output

    1. سلام جناب. بله به همین صورت هست.

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

    3. جناب من نمیدونم برای چه مداری میفرمایید و نمیتونم به این صورت بگم و همچنین ربطش رو به AVR نمیدونم.

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

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