پینهای ورودی/خروجی همهمنظوره (General Purpose Input/Output - GPIO) از اساسیترین و پرکاربردترین قابلیتهای هر میکروکنترلری، از جمله خانواده AVR، هستند. این پینها به میکروکنترلر اجازه میدهند تا با دنیای خارج ارتباط برقرار کند؛ اطلاعات را از سنسورها، کلیدها و سایر ورودیها دریافت کرده و فرمانهایی را به LEDها، رلهها، موتورها و سایر خروجیها ارسال کند. درک نحوه کار با GPIOها برای هر کسی که قصد برنامهنویسی AVR را دارد، ضروری است.
ساختار پینهای GPIO در AVR
هر پورت در میکروکنترلرهای AVR (مانند Port A, Port B, Port C, Port D) معمولاً شامل ۸ پین است که هر کدام میتوانند به صورت مستقل به عنوان ورودی یا خروجی پیکربندی شوند. برای کنترل این پینها، سه رجیستر اصلی برای هر پورت وجود دارد:
1. DDRx (Data Direction Register):
* این رجیستر جهت هر پین را تعیین میکند.
* اگر بیتی در DDRx روی
* اگر بیتی در DDRx روی
* مثال:
2. PORTx (Port Data Register):
* برای پینهای خروجی: با نوشتن
* برای پینهای ورودی: با نوشتن
3. PINx (Port Input Pins Register):
* این رجیستر فقط برای خواندن وضعیت منطقی پینهای ورودی استفاده میشود.
* با خواندن بیت مربوطه از PINx، میتوان وضعیت فعلی (High یا Low) پین ورودی را تشخیص داد.
* نوشتن در این رجیستر هیچ تأثیری ندارد.
پیکربندی و استفاده از GPIO
1. تنظیم پین به عنوان خروجی و کنترل آن:
برای مثال، فرض کنید میخواهیم یک LED را به پین PB0 (پین ۰ از Port B) متصل کرده و آن را روشن و خاموش کنیم.
برای تغییر وضعیت (Toggle) یک پین خروجی، میتوان به رجیستر PINx نوشت. این یک ویژگی خاص در AVR است:
2. تنظیم پین به عنوان ورودی و خواندن آن:
فرض کنید میخواهیم وضعیت یک کلید متصل به پین PD2 را بخوانیم.
با فعال کردن پولآپ، اگر کلید فشرده نشود، پین PD2 در وضعیت High قرار میگیرد. با فشرده شدن کلید (که پین را به زمین متصل میکند)، وضعیت پین Low میشود.
مثال کامل: چشمکزن LED و خواندن کلید
این کد یک LED متصل به PB0 را هر ۵۰۰ میلیثانیه روشن و خاموش میکند و اگر یک کلید متصل به PD2 فشرده شود، LED سریعتر چشمک میزند.
نکات مهم:
با درک این مفاهیم پایه، میتوانید به راحتی با پینهای GPIO میکروکنترلرهای AVR کار کرده و پروژههای متنوعی را پیادهسازی کنید.
ساختار پینهای GPIO در AVR
هر پورت در میکروکنترلرهای AVR (مانند Port A, Port B, Port C, Port D) معمولاً شامل ۸ پین است که هر کدام میتوانند به صورت مستقل به عنوان ورودی یا خروجی پیکربندی شوند. برای کنترل این پینها، سه رجیستر اصلی برای هر پورت وجود دارد:
1. DDRx (Data Direction Register):
* این رجیستر جهت هر پین را تعیین میکند.
* اگر بیتی در DDRx روی
1 تنظیم شود، پین مربوطه به عنوان خروجی عمل میکند.* اگر بیتی در DDRx روی
0 تنظیم شود، پین مربوطه به عنوان ورودی عمل میکند.* مثال:
DDRB = 0xFF; تمام پینهای Port B را به عنوان خروجی تنظیم میکند. DDRD = 0x00; تمام پینهای Port D را به عنوان ورودی تنظیم میکند.2. PORTx (Port Data Register):
* برای پینهای خروجی: با نوشتن
1 یا 0 در بیت مربوطه از PORTx، میتوان وضعیت منطقی (High/Low) پین خروجی را تعیین کرد. 1 پین را High (ولتاژ تغذیه) و 0 پین را Low (زمین) میکند.* برای پینهای ورودی: با نوشتن
1 در بیت مربوطه از PORTx، میتوان مقاومت پولآپ (Pull-up) داخلی را برای آن پین فعال کرد. این کار برای جلوگیری از وضعیت شناور (floating) پینهای ورودی و اطمینان از خواندن یک وضعیت منطقی مشخص (High) در صورت عدم اتصال خارجی مفید است. نوشتن 0 مقاومت پولآپ را غیرفعال میکند.3. PINx (Port Input Pins Register):
* این رجیستر فقط برای خواندن وضعیت منطقی پینهای ورودی استفاده میشود.
* با خواندن بیت مربوطه از PINx، میتوان وضعیت فعلی (High یا Low) پین ورودی را تشخیص داد.
* نوشتن در این رجیستر هیچ تأثیری ندارد.
پیکربندی و استفاده از GPIO
1. تنظیم پین به عنوان خروجی و کنترل آن:
برای مثال، فرض کنید میخواهیم یک LED را به پین PB0 (پین ۰ از Port B) متصل کرده و آن را روشن و خاموش کنیم.
- گام اول: تنظیم جهت پین:
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
- گام دوم: کنترل وضعیت پین:
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
2. تنظیم پین به عنوان ورودی و خواندن آن:
فرض کنید میخواهیم وضعیت یک کلید متصل به پین PD2 را بخوانیم.
- گام اول: تنظیم جهت پین:
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
- گام دوم: فعال کردن مقاومت پولآپ (اختیاری اما توصیه شده):
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
- گام سوم: خواندن وضعیت پین:
کد:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
مثال کامل: چشمکزن LED و خواندن کلید
این کد یک LED متصل به PB0 را هر ۵۰۰ میلیثانیه روشن و خاموش میکند و اگر یک کلید متصل به PD2 فشرده شود، LED سریعتر چشمک میزند.
C:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
نکات مهم:
- نامگذاری پینها: در فایل
avr/io.h، نامهای مستعاری مانندPB0,PD2و ... برای بیتهای پورتها تعریف شدهاند که استفاده از آنها کد را خواناتر میکند. - عملگرهای بیتی: برای کار با رجیسترها، استفاده از عملگرهای بیتی (
|,&,~,<<) بسیار مهم است تا فقط بیتهای مورد نظر تغییر کنند و به سایر بیتها آسیبی نرسد. - مقاومتهای پولآپ/پولداون خارجی: در برخی موارد، ممکن است نیاز به استفاده از مقاومتهای پولآپ یا پولداون خارجی باشد، به خصوص اگر جریان مورد نیاز بیشتر از توان مقاومتهای داخلی باشد یا برای ورودیهای آنالوگ.
با درک این مفاهیم پایه، میتوانید به راحتی با پینهای GPIO میکروکنترلرهای AVR کار کرده و پروژههای متنوعی را پیادهسازی کنید.