پیکربندی پورت ها در Xmega
پیکربندی پورت ها در Xmega
میکروکنترلرهای ایکسمگا در حوزه پورت های I/O مانند سایر بخش ها نسبت به اتمگا کاملا متحول، بهینه و کارآمد شده و دست توسعه دهنده برای کار با پورت ها کاملا باز است.
- حالت های قابل کانفیگ برای پورت ها به صورت خروجی:
1- Totem-pole (نوع اتصال خروجی به جای push-pull)
2- Wired-AND
3- Wired-OR
4- Bus-keeper
4- Inverted I/O
- حالت های قابل کانفیگ برای پورت ها در حالت ورودی با سنس سنکرون یا غیرسنکرون همراه وقفه و ایونت:
1- حالت تغییر لبه بالا/پایین رونده
2- حالت لبه بالا رونده
3- حالت لبه پایین رونده
4- حالت ولتاژ سطح پایین
- مقاومت pull-up و pull-down روی ورودی ها و حالت Wired OR/AND
- امکان کنترل slew rate
- حالت وقفه تغییر وضعیت پایه ها به صورت آسنکرون که میتواند میکرو را از تمام حالت های اسلیپ خارج کند
- امکان خروجی کلاک روی پین مشخص از پورت
- حالت دسترسی امن به پین های پورت جهت خواندن، نوشتن یا تغییر با رجیسترهای اختصاصی برای toggle/set/clear
تمام حالت های ورودی و خروجی برای هر پین از هر پورت به صورت منحصر به فرد قابل پیکربندی میباشد.
پیکربندی و استفاده از پین ها:
هر پورت دارای یک رجیستر جهت داده (DIR) و یک رجیستر داده خروجی (OUT) که برای کنترل پین های پورت استفاده میشود. رجیستر ورودی دیتا (IN) برای خواندن وضعیت پین های پورت استفاده میشود. همچنین هر پین دارای یک رجستر پیکربندی (PINnCTRL) برای سایر تنظیمات میباشد.
جهت هر پایه توسط بیت DIRn در رجیستر DIR قابل تنظیم است اگر مقدار 1 در DIRn نوشته شود پایه به عنوان خروجی تنظیم میشود و اگر مقدار 0 در DIRn نوشته شود پایه به عنوان ورودی تنظیم میشود.
اگر جهت یک پایه به صورت خروجی تنظیم شود، بیت OUTn در رجیستر OUT برای SET کردن پایه استفاده میشود. اگر مقدار 1 در OUTn نوشته شود پین n یک (HIGH) میشود و اگر مقدار 0 در OUTn نوشته شود پین n صفر (LOW) میشود.
رجیستر IN برای خواندن مقدار پایه استفاده میشود مقدار این رجیستر همیشه قابل خواندن است چه پایه ورودی باشد چه خروجی، غیر از زمانی که ورودی های دیجیتال غیر فعال شده باشند.
رجیستر PINnCTRL برای پیکربندی های بیشتر پایه n از پورت میباشد. هر کدام از پایه ها با این رجیستر میتواند به صورت Totm-pole یا Wired-AND یا Wired-OR پیکربندی شود.
هر پایه میتواند به صورت معکوس شده به عنوان ورودی و خروجی عمل کند.( یعنی پایه رو صفر کنی ولی یک بشه )
خروجی Totem-pole دارای چهار حالت پیکربندی است:
- Totem-pole (push pull)
- pull-down
- pull-up
- bus-keeper
پیکربندی Totem-pole با pull-down و pull-up دارای مقاومتی است که فقط در حالت ورودی بودن پایه فعال میشوند. این ویژگی مصرف انرژی غیر ضروری را حذف میکند.
در حالت Wired-AND و Wired-OR مقاومت های pull-up و pull-down در دو حالت ورودی و خروجی قابل فعال شدن میباشند.
از آنجایی که پیکربندی مقاومت های pull-up و pull-down فقط از طریق رجیستر PINnCTRL قابل انجام است از تغییر ناخواسته در مقدار یا جهت پایه جلوگیری میشود.
Totem-pole:
در حالت Totem-pole (push-pull) وضعیت پایه بسته به مقدار بیت متناظر در رجیستر OUT صفر(0 ولت) یا یک(5 ولت) خواهد بود.
Totem-pole with Pull-down:
حالت ورودی با مقاومت pull-down داخلی
مثال: تنظیم پین 0 از پورت C در حالت ورودی PULL-DOWN
1 2 | PORTC.DIRCLR = PIN0_bm; PORTC.PIN0CTRL = PORT_OPC_PULLDOWN_gc; |
Totem-pole with Pull-up:
حالت ورودی با مقاومت pull-up داخلی
مثال: تنظیم پین 0 از پورت C در حالت ورودی PULL-UP
1 2 | PORTC.DIRCLR = PIN0_bm; PORTC.PIN0CTRL = PORT_OPC_PULLUP_gc; |
Bus-keeper:
در حالت Bus-keeper یک نگه دارنده ضعیف حالت منطقی پایه را حفظ میکند. اگر حالت قبلی پایه 1 باشد پیکربندی bus-keeper از مقاومت pull برای 1 نگه داشتن وضعیت پایه/باس استفاده میکند و برعکس
Bus-Keeper چیست؟
Bus-Keeper یک ویژگی در میکروکنترلرهای AVR است که به طور خاص در ورودیهای/خروجیهای با حالت pull-up فعال میشود. هدف اصلی این ویژگی، افزایش پایداری و مقاومت در مقابل نویز و افت نوسانی در خطوط ورودی است.
این ویژگی باعث میشود که ورودی در حالت pull-up باشد و در صورت عدم فعالیت خط (توسط دیوایس خارجی)، به ولتاژ pull-up (معمولاً VCC) برسد.
Bus-Keeper معمولاً در اتصال با خروجیهای open-drain کارآمد است. این حالت معمولاً در سیستمهای ارتباطی مانند I2C به کار میرود.
مثال: تنظیم پین 0 از پورت C در حالت Buss-Keeper:
1 2 | PORTC.DIRCLR = PIN0_bm; PORTC.PIN0CTRL = PORT_OPC_BUSKEEPER_gc; |
Wired-OR:
در حالت Wired-OR زمانی که بیت های متناظر در رجیسترهای OUT و DIR یک باشند، پایه در حالت یک قرار میگیرد. زمانی که رجیستر OUT صفر شود پایه آزاد شده و به مقاومت pull-down داخلی یا خارجی اجازه میدهد پایه در حالت صفر(صفر ولت) قرار بگیرد.
حالت Wired-OR یک تکنیک در طراحی سیستمهای دیجیتال است که در آن خروجیهای چندین منبع به صورت سیمی به یک خط (سیگنال) متصل میشوند. حالت Wired-OR معمولاً در ارتباط با خروجیهای open-drain مورد استفاده قرار میگیرد.
اگر حتی یکی از منابع ورودی در حالت HIGH باشد، خروجی به حالت HIGH خواهد رفت.
مثال: تنظیم پین 0 از پورت C در حالت Wired-OR:
1 2 | PORTC.DIRSET = PIN0_bm; PORTC.PIN0CTRL = PORT_OPC_WIREDORPULL_gc; |
Wired-AND:
در حالت Wired-AND زمانی که بیت های متناظر در رجیسترهای OUT و DIR صفر باشند، پایه در حالت صفر قرار میگیرد. زمانی که رجیستر OUT یک شود پایه آزاد شده و به مقاومت pull-up داخلی یا خارجی اجازه میدهد پایه در حالت یک (5 ولت) قرار بگیرد.
اگر حتی یکی از منابع ورودی در حالت LOW باشد، خروجی به حالت LOW خواهد رفت.
مثال: تنظیم پین 0 از پورت C در حالت Wired-AND:
1 2 | PORTC.DIRSET = PIN0_bm; PORTC.PIN0CTRL = PORT_OPC_WIREDANDPULL_gc; |
پیکربندی نوع تحریک ورودی
تحریک ورودی برای تشخیص یک لبه یا تغییر سطح روی ورودی پایه مورد استفاده قرار میگیرد. تنظیم تحریک متفاوت برای هر پایه جهت تشخیص لبه بالارونده، لبه پایین رونده، تغییر لبه یا یک سطح پایین امکان پذیر میباشد. تشخیص سطح بالا با استفاده از تنظیم حالت معکوس برای ورودی امکان پذیر میباشد.
تحریک ورودی میتواند برای درخواست وقفه یا ایونت در زمان تغییر روی پایه استفاده شود.
پین های ورودی از حالت آسنکرون و سنکرون برای تحریک ورودی پشتیبانی میکنند. تشخیص سنکرون نیاز به وجود کلاک پریفرال دارد اما در حالت آسنکرون نیازی به وجود کلاک نیست.
وقفه پورت
هر پورت دارای دو بردار وقفه میباشد و همینطور این امکان وجود دارد که مشخص کرد کدام پایه از پورت کدام وقفه را ایجاد کند. وقفه های پروت باید قبل از استفاده فعال شوند. اینکه کدام نوع از پیکربندی تحریک برای تولید وقفه قابل استفاده میباشد بستگی دارد به اینکه تحریک ورودی سنکرون یا آسنکرون برای پایه انتخاب شده امکان پذیر باشد یا نه.
در حالت سنکرون تمام حالت های تحریک ورودی برای تولید وقفه قابل استفاده میباشند. برای تشخیص لبه تغییر مقدار پایه باید توسط کلاک پریفرال نمونه برداری شود تا درخواست وقفه تولید شود.
در حالت آسنکرون فقط پایه 2 از هر پورت از تحریک آسنکرون پشتیبانی میکند.
حالت سطح پایین توسط تمام پایه ها بدون نیاز به بوجود کلاک پریفرال تشخیص داده میشود. در مد اکتیو میکروکنترلر سطح پایین باید تا اتمام اجرای دستورالعمل در حال اجرا نگه داشته شود تا وقفه تولید شود. در تمام حالت های اسلیپ، حالت سطح پایین باید تا پایان زمان خارج شدن میکرو از حالت اسلیپ حفظ شود تا وقفه تولید شود اگر سطح پایین قبل از پایان زمان بیدار شدن از حالت اسلیپ از بین برود میکرو از حالت اسلیپ خارج میشود اما وقفه تولید نمیشود.
ایونت پورت (رویداد پورت)
پایه های پورت میتوانند زمانی که یک تغییر روی آنها بوجود آمد یک ایونت تولید کنند. شرایط برای هر پایه برای تولید ایونت را پیکربندی تحریک مشخص میکند. تولید ایونت نیازمند وجود کلاک میباشد و بدون کلاک امکان تولید ایونت وجود ندارد.
برای تحریک سطح (level sesing)، سطح پایین روی پایه ایونت تولید نمیکند، و سطح بالا روی پایه دائما ایونت تولید میکند برای تولید ایونت در حالت سطح پایین پیکربندی پایه باید در حالت معکوس شده قرار بگیرد.
کنترل نرخ افزیش/کاهش (slew rate control)
فعال کردن این حالت برای هر پایه از پورت امکان پذیر میباشد. و باعث میشود که سرعت rise/fall به مقدار 50 تا 150 درصد افزایش پیدا کند که وابسته به شرابط مصرف کننده میباشد.
تفاوت اساسی در رجیستر پورت های ATmega و ATXmega
یکی از امکاناتی که در میکروکنترلر های ایکسمگا باعث بالا رفتن سرعت و ایمنی کار با پورت ها شده وجود سه رجیستر مجزا برای set, clear, toggle برای رجیسترهای DIR و OUT هست. در میکروکنترلرهای سری atmega برای خروجی کردن یک پایه باید در بیت متناظر با پایه 1 نوشته میشد و برای ورودی کردن پایه باید در بیت متناظر با پایه 0 نوشته میشد.
مانند:
1 | DDRC |= 1<<PORTC0; |
و
1 | DDRC&=~(1<<PORTC0); |
اما در میکروکنترلرهای atXmega برای خروجی کردن یک پایه میتوان از رجیستر DIRSET وبرای ورودی کردن یک پایه از DIRCLR و برای معکوس کردن جهت پایه از رجیستر DIRTGL استفاده کرد.
مثال:
1 | PORTC.DIRSET = PIN0_bm; |
و
1 | PORTC.DIRCLR = PIN0_bm; |
و
1 | PORTC.DIRTGL = PIN0_bm; |
عبارت PIN0_bm به پایه 0 از پورت مورد نظر (در اینجا پورت C ) اشاره دارد.
این پست در حال تکمیل شدن است