میکروکنترلرهای AVR، مانند سایر میکروکنترلرها، برای تعامل با دنیای خارج از طریق پینهای ورودی/خروجی عمومی (General Purpose Input/Output - GPIO) خود استفاده میکنند. این پینها قابلیتهای بسیار متنوعی دارند و میتوانند به عنوان ورودی برای خواندن وضعیت سنسورها یا کلیدها، و یا به عنوان خروجی برای کنترل LEDها، رلهها، موتورها و سایر قطعات الکترونیکی پیکربندی شوند. درک نحوه کار با GPIOها یکی از اولین و اساسیترین گامها در برنامهنویسی AVR است.
پورتهای AVR
میکروکنترلرهای AVR پینهای GPIO خود را در گروههایی به نام "پورت" سازماندهی میکنند. هر پورت معمولاً ۸ پین دارد (مثلاً PORTA، PORTB، PORTC، PORTD و غیره). هر پین در یک پورت با یک شماره (از ۰ تا ۷) مشخص میشود، به عنوان مثال PA0، PB3، PC7.
رجیسترهای کلیدی GPIO
برای کنترل پینهای GPIO، سه رجیستر اصلی برای هر پورت وجود دارد:
1. DDRx (Data Direction Register):
* این رجیستر جهت هر پین در پورت x را تعیین میکند.
* اگر بیت مربوطه در DDRx برابر با
* اگر بیت مربوطه در DDRx برابر با
* مثال:
2. PORTx (Port Data Register):
* برای پینهای خروجی: این رجیستر برای نوشتن داده به پینهای خروجی استفاده میشود. اگر بیت مربوطه در PORTx برابر با
* برای پینهای ورودی: اگر پین به عنوان ورودی پیکربندی شده باشد (DDRx = 0)، تنظیم بیت مربوطه در PORTx به
3. PINx (Port Input Pins Register):
* این رجیستر برای خواندن وضعیت فعلی پینهای ورودی استفاده میشود.
* اگر پین مربوطه ولتاژ بالا (High) داشته باشد، بیت مربوطه در PINx برابر با
* اگر پین مربوطه ولتاژ پایین (Low) داشته باشد، بیت مربوطه در PINx برابر با
* توجه داشته باشید که برای خواندن وضعیت پین، باید آن پین به عنوان ورودی پیکربندی شده باشد (بیت مربوطه در DDRx = 0).
نحوه پیکربندی و استفاده از GPIO
۱. پیکربندی پین به عنوان خروجی (Output):
برای کنترل یک LED یا رله، پین باید خروجی باشد.
مثال (روشن کردن LED متصل به PB0):
۲. پیکربندی پین به عنوان ورودی (Input):
برای خواندن وضعیت یک کلید یا سنسور، پین باید ورودی باشد.
مثال (خواندن وضعیت کلید متصل به PD2 و کنترل LED متصل به PB0):
فرض کنید کلید به زمین (GND) متصل است و با فشار دادن، پین را Low میکند.
نکات مهم:
* تنظیم بیت به
* تغییر وضعیت بیت (Toggle):
با درک این مفاهیم پایه، میتوانید به راحتی با پینهای GPIO میکروکنترلرهای AVR کار کرده و پروژههای متنوعی را پیادهسازی کنید.
پورتهای AVR
میکروکنترلرهای AVR پینهای GPIO خود را در گروههایی به نام "پورت" سازماندهی میکنند. هر پورت معمولاً ۸ پین دارد (مثلاً PORTA، PORTB، PORTC، PORTD و غیره). هر پین در یک پورت با یک شماره (از ۰ تا ۷) مشخص میشود، به عنوان مثال PA0، PB3، PC7.
رجیسترهای کلیدی GPIO
برای کنترل پینهای GPIO، سه رجیستر اصلی برای هر پورت وجود دارد:
1. DDRx (Data Direction Register):
* این رجیستر جهت هر پین در پورت x را تعیین میکند.
* اگر بیت مربوطه در DDRx برابر با
1 باشد، آن پین به عنوان خروجی پیکربندی میشود.* اگر بیت مربوطه در DDRx برابر با
0 باشد، آن پین به عنوان ورودی پیکربندی میشود.* مثال:
DDRB = 0xFF; تمام پینهای PORTB را خروجی میکند. DDRD = 0x00; تمام پینهای PORTD را ورودی میکند.2. PORTx (Port Data Register):
* برای پینهای خروجی: این رجیستر برای نوشتن داده به پینهای خروجی استفاده میشود. اگر بیت مربوطه در PORTx برابر با
1 باشد، پین مربوطه ولتاژ بالا (High) و اگر 0 باشد، ولتاژ پایین (Low) خواهد داشت.* برای پینهای ورودی: اگر پین به عنوان ورودی پیکربندی شده باشد (DDRx = 0)، تنظیم بیت مربوطه در PORTx به
1 باعث فعال شدن مقاومت پولآپ (Pull-up) داخلی برای آن پین میشود. این کار برای جلوگیری از حالت شناور (Floating) پین ورودی و اطمینان از خواندن یک وضعیت مشخص (High) در صورت عدم اتصال خارجی مفید است.3. PINx (Port Input Pins Register):
* این رجیستر برای خواندن وضعیت فعلی پینهای ورودی استفاده میشود.
* اگر پین مربوطه ولتاژ بالا (High) داشته باشد، بیت مربوطه در PINx برابر با
1 خواهد بود.* اگر پین مربوطه ولتاژ پایین (Low) داشته باشد، بیت مربوطه در PINx برابر با
0 خواهد بود.* توجه داشته باشید که برای خواندن وضعیت پین، باید آن پین به عنوان ورودی پیکربندی شده باشد (بیت مربوطه در DDRx = 0).
نحوه پیکربندی و استفاده از GPIO
۱. پیکربندی پین به عنوان خروجی (Output):
برای کنترل یک LED یا رله، پین باید خروجی باشد.
- گام اول: بیت مربوطه در رجیستر DDRx را
1کنید. - گام دوم: برای روشن/خاموش کردن، بیت مربوطه در رجیستر PORTx را
1یا0کنید.
مثال (روشن کردن LED متصل به PB0):
C:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
۲. پیکربندی پین به عنوان ورودی (Input):
برای خواندن وضعیت یک کلید یا سنسور، پین باید ورودی باشد.
- گام اول: بیت مربوطه در رجیستر DDRx را
0کنید. - گام دوم (اختیاری اما توصیه شده): برای فعال کردن پولآپ داخلی، بیت مربوطه در رجیستر PORTx را
1کنید. این کار باعث میشود در صورت عدم اتصال کلید، پین در وضعیت High قرار گیرد. - گام سوم: برای خواندن وضعیت، رجیستر PINx را بخوانید.
مثال (خواندن وضعیت کلید متصل به PD2 و کنترل LED متصل به PB0):
فرض کنید کلید به زمین (GND) متصل است و با فشار دادن، پین را Low میکند.
C:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
نکات مهم:
- ماسک کردن بیتها: برای تغییر وضعیت یک بیت خاص بدون تأثیر بر سایر بیتها، از عملگرهای بیتی
|(OR),&(AND),~(NOT) و<<(شیفت به چپ) استفاده کنید.
1: PORTB |= (1 << PB0);* تنظیم بیت به
0: PORTB &= ~(1 << PB0);* تغییر وضعیت بیت (Toggle):
PORTB ^= (1 << PB0);- پینهای چندمنظوره: بسیاری از پینهای GPIO در AVR علاوه بر عملکرد ورودی/خروجی عمومی، قابلیتهای دیگری مانند ADC، PWM، SPI، I2C و UART را نیز دارند. هنگام استفاده از این قابلیتها، باید رجیسترهای مربوط به آن ماژولها را نیز پیکربندی کنید و معمولاً پین به طور خودکار از حالت GPIO خارج میشود.
- جریان مجاز: هر پین GPIO دارای محدودیت جریان خروجی است. برای راهاندازی بارهای با جریان بالا (مانند موتورها یا رلههای بزرگ)، باید از ترانزیستورها یا درایورهای مناسب استفاده کنید.
با درک این مفاهیم پایه، میتوانید به راحتی با پینهای GPIO میکروکنترلرهای AVR کار کرده و پروژههای متنوعی را پیادهسازی کنید.