آموزش میکروکنترلر XMEGA قسمت سوم : رجیسترهای پورت

آموزش میکروکنترلر XMEGA قسمت سوم : رجیسترهای پورت

آموزش میکروکنترلر XMEGA قسمت سوم : رجیسترهای پورت
آموزش میکروکنترلر XMEGA قسمت سوم : رجیسترهای پورت

آموزش میکروکنترلر XMEGA – قسمت سوم;

در قسمت دوم آموزش میکروکنترلر XMEGA به مباحث کلی در مورد خانواده XMEGA از جمله محدوده دما و تغذیه و کلاک پرداختیم. در این قسمت از  آموزش میکروکنترلر XMEGA  به آشنایی با رجیسترهای پورت در این خانواده می‌پردازیم.

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

 

PORTA.DIR:

در خانواده AVR برای تعیین جهت یک پورت و پین‌های مربوطه از رجیستر DDR استفاده می‌شود و بعد از آن نام پورت قرار می‌گیرد مانند DDRA.

در خانواده XMEGA برای تعیین جهت پورت‌ها از رجیستر PORTA.DIR استفاده می‌شود که DIR به معنای DIRECTION است. از این رجیستر به شکل PORTA_DIR هم میتوان استفاده کرد. پس اگر در این رجیستر بیتی را یک قرار دهیم پین متناظر در پورت به عنوان خروجی تعریف می‌شود.

 

PORTA.OUT:

در AVR برای تعیین وضعیت HIGH/LOW پایه‌ها از رجیستر PORT استفاده می‌شود، این رجیستر در خانواده XMEGA به صورت PORTA.OUT وظیفه تعیین صفر و یک بودن پورت‌ها را بر عهده دارد.

البته این رجیستر در AVR وظیفه فعال کردن PULL UP داخلی برای پین‌های ورودی را نیز دارد، بدین معنا که اگر یک پین به صورت وروردی تعیین شده باشد و بیت متناظر در رجیستر پورت یک قرار داده شود PULL UP فعال می‌شود.

اما مسئله فعال شدن PULL UP در رجیستر متناظر در XMEGA ،که PORTA.OUT است برقرار نیست. این رجیستر برای تعیین وضعیت پین‌هایی است که به صورت خروجی تعریف شده‌اند، اما برای پین‌های ورودی وظیفه فعال کردن PULL UP به عهده این رجیستر نیست.

برای مثال میخواهیم پین شماره صفر از پورت A را به صورت خروجی تعریف کنیم;

برای اینکار باید بیت شماره صفر در PORTA.DIR را یک قرار دهیم. حال اگر بخواهیم این پین در وضعیت LOW باشد باید در بیت شماره صفر در PORTA.OUT صفر نوشته شود و اگر بخواهیم در وضعیت HIGH باشد باید بیت مربوطه یک نوشته شود.

 

PORTA.IN

در AVR برای دسترسی به وضعیت پین‌ها از دستور PINA استفاده می‌شود با این تفاوت که در XMEGA از دستور PORTA.IN استفاده می‌شود، این دستور امکان دسترسی CPU به پین‌های PORTA  برای تعیین وضعیت HIGH/LOW را فراهم می‌کند .

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

با استفاده از دستور ;PORTA.DIR=0X01 می‌توان PA.0 را در وضعیت خروجی قرار دهیم. می‌توان به جای این دستور از PORTA.DIR=1<<0 استفاده کرد. اما به جای این دو دستور بهتر است از  ;PORTA.DIR=PIN0_bm که در فایل هدر iox64a3.h تعریف شده است استفاده کنیم.

همان‌طور که در قبل اشاره شد مبنای کار ما atmel studio است و این فایل هدر هم در کتابخانه atmel studio وجود دارد. هم‌چنین در برد آموزشی از ATXMEGA 64 A3 استفاده می‌کنیم.

عباراتی در کدها وجود دارد که دستور را خواناتر می‌کند. پس به همین دلیل سعی بر این است که به جای مقدار‌دهی عددی از عبارات تعریف شده در هدرها استفاده کنیم. اهمیت این مساله در زمانی مشخص است که تناظری در مقداردهی رجیستر و خروجی وجود ندارد، مثلاً در رجیستر مربوط به تایمر کانتر، USART ،SPI و … باید به طور کلی از عبارات معنی‌دار استفاده کنیم که هم برای خود ما و هم برای کسانی که می‌خواهند از این کدها استفاده کنند قابلیت استفاده مجدد داشته باشد و اصلاحات بعدی که ممکن است روی کد انجام گیرد به سادگی انجام شود.

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

اگر بخواهیم از طریق رجیستر PORTA.OUT پین‌های شماره 0 و 1 را در وضعیت HIGH قرار دهیم و پین‌های شماره 2 تا 7 را در وضعیت قبلی خودشان باقی بمانند، باید از عملگر OR استفاده کنیم.

 

 

اگر بخواهیم مقدار پین‌های صفر و یک را با صفر کردن بیت‌های متناظر انجام دهیم، باید به جای OR از AND  کنیم. اگر PORTA.OUT را بخوانیم و 0XFC را با آن ،AND کنیم، بیت‌های شماره 2 تا 7 در وضعیت قبلی خود باقی می‌مانند و فقط بیت‌های 0 و 1 صفر می‌شوند. این عملیات را اصطلاحا READ MODIFY WRITE می‌نامند. در زیر عبارت ;(PIN1_bm|PIN0_bm) برابر 0XFC است.

 

 

عمل بعدی عملیات NOT یا TOGGLE کردن وضعیت برخی بیت‌ها با حفظ وضعیت باقی بیت‌ها است، که برای این حالت به وسیله XOR این کار را انجام می‌دهیم.

هر بیتی که با یک XOR شود وضعیت آن NOT می‌شود، یعنی اگر صفر است یک می‌شود و اگر یک است صفر می‌شود. این عملیات READ MODIFY WRITE تامیده می‌شود.

این نوع عملیات زمان بیشتری را به دلیل چند مرحله‌ای بودن دستور اشغال می‌کند. این زمان شامل خواندن رجیستر، سپس با مقدار مورد نظر OR یا AND و … کردن و در آخر  نوشتن در محل است. هرچند یک دستور داریم ولی باید توجه داشت زمانی که به کدهای اسمبلی ترجمه می‌شود به چندین مرحله تقسیم می‌شود.

افزایش مراحل انجام دستور علاوه بر افزایش زمان باعث افزایش حجم اشغال شده حافظه FLASH می‌شود.

در خانواده XMEGA امکانی فراهم شده است که نیاز نیست از عملیات READ MODIFY  WRITE استفاده شود. علاوه بر اینکه رجیستر PORTA.OUT  وجود دارد، متناظر با هر پورت رجیستر‌های زیر نیز وجود دارند.

 

 

اگر مقداری در این رجیسترها نوشته شود، در بیت‌هایی که یک هستند عملیات SET,CLR و TGL انجام می‌شود.

برای مثال اگر بخواهیم فقط پین‌های 0 و 1 را یک کنیم از دستور زیر استفاده می‌کنیم.

 

 

برای پاک کردن مقدار یک پین از دستور PORTA.OUTCLR استفاده می‌شود. در این دستور هر بیتی که در رجیستر OUTCLR یک باشد پاک می‌شود.

با استفاده از دستور PORTA.OUTTGL می‌توان بیت متناظر با پین را تغییر وضعیت داد، اگر یک باید صفر می‌شود و اگر یک باشد صفر می‌شود.

هم‌چنین این عملیات برای ورودی و خروجی کردن پورت‌ها مورد استفاده قرار می‌گیرد:

 

 

به عنوان مثال و با استفاده از برد آموزشی که بر اساس این آموزش‌ها و دستورها است به مثال زیر توجه کنید:

 

رجیستر پورت

 

برای روشن شدن LED‌ها باید PE1 تا PE7 و PF0 به صورت خروجی تنظیم شود. وضعیت PF0 باید HIGH باشد و برای روشن شدن هر LED نیاز است پین مربوطه یک شود.

 

در قسمت چهارم آموزش میکروکنترلر XMEGA با نحوه ایجاد پروژه و کامپایل و پروگرم کردن آن در AtmelStudio آشنا می‌شویم. با سیسوگ همراه باشید.

 

سری مقالات آموزش میکروکنترلر XMEGA توسط آقای مهندس کی‌نژاد  تهیه شده است.

 

حمایت از رعنا جباری

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

رعنا جباری
رعنا جباری

رشته تحصیلی الکترونیک علاقمند به زندگی،گل و گیاه،الکترونیک،دوچرخم،عکاسی و ...

دیدگاه ها

2 دیدگاه

  • رضا
    ۲۰ شهریور ۱۳۹۸

    ممنون خیلی کار راه بنداز بود

    • Zeus ‌
      زئوس Zeus
      ۲۱ شهریور ۱۳۹۸

      خواهش میکنم دوست عزیز
      باید از جناب استاد کی نژاد تشکر کرد برای تهیه این مجموعه پربار

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

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

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش

درآمد زایی به سبک پینوکیو

ما مهندسین, بخصوص مهندسین برق و الکترونیک … علاقه خاصی به طراحی و ساختن داریم علاقه زیادی به تکنولوژی , بخصوص از...

Sisoog Os Sisoog Os
  • 3 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک