پورت های میکروکنترلرهای AVR
در میکروکنترلرهای AVR، پورتهای I/O (ورودی/خروجی) برای ارتباط با دنیای خارجی مورد استفاده قرار میگیرند. هر پورت دارای یک سری از پایهها (پینها) است که هر کدام میتوانند به عنوان ورودی یا خروجی تنظیم شوند. هر پایه جریان دهی لازم برای جهات راه اندازی مستقیم نمایشگرهای LED را دارا میباشد همچنین تمام پایه های I/O دارای دیودهای حفاظتی میباشند.
پورت های میکروکنترلرهای AVR دارای سه رجیستر برای تعیین جهت پورت،نوشتن وضعیت پورت، خواندن از پورت و فعال کردن مقاومت PULL-UP داخلی کاربرد دارند.
این رجیسترها با نام DDRX(Data Direction Register)، PORTX(Data Register) ، PINX(Port Input Pins) شناخته میشوند و عملکردشان به شکل زیر است:
ساختار PORT:
هر پورت از یک سری از پایهها تشکیل شده است که به عنوان پایههای پین یا پایههای I/O شناخته میشوند.
نام پورتها در میکروکنترلرهای AVR به صورت معمول از حروف A تا F استفاده میشود. به عنوان مثال، PORTA، PORTB .
تنظیم جهت پایهها (پینها):
با استفاده از رجیسترهای مربوط به هر پورت (DDRx)، میتوان جهت هر پایه را به عنوان ورودی یا خروجی تعیین کرد.
عناصر متناظر با هر پایه به ترتیب با رجیستر DDRx مرتبط هستند. برای مثال، DDRA برای تنظیم جهت پایههای پورت A استفاده میشود.
تنظیم وضعیت پایهها:
وضعیت هر پایه (صفر یا یک) توسط رجیسترهای مخصوص PORTx کنترل میشود.
مقدار 1 یا 0 در هر بیت از این رجیسترها نشاندهنده حالت HIGH یا LOW برای هر پایه است.
تنظیم و مقداردهی به خروجی (در صورت تنظیم به عنوان خروجی):
در صورتی که یک پایه به عنوان خروجی تنظیم شده باشد، مقدار آن میتواند با استفاده از رجیسترهای PORTx تغییر داده شود.
این عمل باعث فعالسازی یا غیرفعالسازی خروجی (HIGH یا LOW) میشود.
تنظیم و خواندن وضعیت پینها (در صورت تنظیم به عنوان ورودی):
در صورتی که یک پایه به عنوان ورودی تنظیم شده باشد، میتوان اطلاعات وضعیت آن را از طریق خواندن از رجیسترهای PINx دریافت کرد.
مقدار خوانده شده نشاندهنده وضعیت HIGH یا LOW ورودی است.
ویژگیهای اضافی:
پورتها ویژگیهای خاصی نظیر توانایی فعالسازی/غیرفعالسازی مقاومتهای pull-up و تنظیم پایه به عنوان PWM برخوردار هستند.
برای نوشتن 1 در یک بیت از رجیستر میتوانید به این شکل عمل کنید:
1 | PORTB|=1<<PORTB4 |
برای نوشتن 0 در یک بیت از رجیستر میتوانید به این شکل عمل کنید:
1 | PORTB&=~(1<<PORTB4) |
برای خوانا شدن برنامه میتوانید یک ماکرو با نام دلخواه تعریف کرده و در برنامه از آن استفاده کنید:
1 | #define LED(x) (x ? (PORTB|=1<<PORTB4) : (PORTB&=~(1<<PORTB4))) |
برای خواندن وضعیت یک پایه از پورت میتوانید به صورت زیر عمل کنید:
1 | PINB & (1<<PORTB0) |
در صورتی که PORTB0 در وضعیت LOW باشد خروجی برابر صفر میباشد. و اگر PORTB0 در وضعیت HIGH باشد خروجی عددی غیر از صفر است (با توجه به ارزش جایگاه بیتی)
در ابتدای هر برنامه ای باید وضعیت ورودی/خروجی بودن پایه های استفاده شده در مدار تعریف شود سپس میتوان در هر کجا از برنامه در پایه نوشت و یا از آن خواند.
برای غیر فعال کردن تمام مقاومت های pull-up به صورت هم زمان میتوان در بیت PUD در رجیستر SFIOR مقدار 1 را نوشت.
پایه های بدون استفاده
اگر در پروژه تان تعدادی پایه بدون استفاده وجود داشت برای کاهش جریان مصرفی میکروکنترلر مطمئن شوید که این پایه ها دارای سطح ولتاژ مشخصی هستند مثلا میتوانید مقاومت pull-up داخلی را فعال کنید یا حتی اگر میخواهید میکرو در زمان ریست هم جریان مصرفی ناشی از پایه های بدون استفاده نداشته باشد میتوانید مقاومت pull-up یا pull-down خارجی قرار دهید.
اتصال مستقیم پایه ها به تغذیه یا زمین مدار توصیه نمیشود زیرا اگر اشتباها یک پایه خروجی تعریف شود باعث جریان کشی زیادی خواهد شد.