در میکروکنترلرهای AVR پورت های زیادی برای انجام عملیات ورودی/خروجی وجود دارند. بسته به اینکه تراشه ی مورد نظر کدام عضو از خانواده ی AVR باشد، تعداد پورت ها، تعداد پایههای هر پورت و کاربرد پورت ها متفاوت خواهد بود. نامگذاری پورت ها با حروف بزرگ انگلیسی و با شروع از حرف A انجام می شود. مثلاً اگر تراشه ای ۴ پورت داشته باشد، داریم: PORTA، PORTB، PORTC و PORTD. پورت های AVR علاوه بر ورودی و خروجی بودن کاربردها و قابلیتهای دیگری نیز دارند که در جلسات آتی در مورد آنها بحث خواهد شد. جدول زیر تراشه های رایج و تعداد پورت هایشان را نشان می دهد.
p><!--EndFragment p><!--StartFragment
برای به کارگیری پورت ها جهت استفاده به عنوان ورودی و خروجی باید آنها را برنامهریزی نمود. پورت های ورودی و خروجی در AVR هرکدام دارای سه ثبات به نام های PORT و DDR و PIN می باشد. به عنوان مثال سه ثبات مربوط به پورت C عبارتند از: PORTC و DDRC و PINC.
اندازه ی هر سه ثبات هشت بیت میباشد و لازم به ذکر است که هر پورت میتواند بین سه تا هشت پایه داشته باشد. در ادامه در مورد این ثبات ها و نقش آنها یاد می گیریم.
یک پورت میتواند هم نقش ورودی داشته باشد و هم نقش خروجی. اما چگونه؟ این کار با برنامهریزی ثبات DDR انجام می گیرد. DDR که مخفف عبارت Data Direction Register می باشد، ثباتی هشت بیتی است. برای هر پورت یک ثبات DDR داریم که هم نام پورت است. به عنوان مثال ثبات DDR مربوط به پورت A به صورت DDRA شناخته می شود. هریک از بیتهای ثبات DDRx یکی از پین های پورت x را کنترل میکند. برای مثال بیت پنجم ثبات، پنجمین پین پورت را کنترل می کند.
به منظور تنظیم کردن یک پین به عنوان ورودی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار صفر برنامهریزی شود. به طور عکس برای تنظیم کردن یک پین به عنوان خروجی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار یک برنامهریزی شود. به عنوان مثال فرض کنید میخواهیم پین ۳ و ۷ از پورت B را به عنوان خروجی و بقیه ی پین ها را به عنوان ورودی تنظیم کنیم. در زبان C باید بنویسیم:
p style="text-align: justify;"><!--StartFragment
توجه شود که بیت ۳ و ۷ یک و دیگر بیتها صفر شدهاند. برای انجام این کار برای دیگر پورت ها نیز به همین صورت باید عمل کرد.
✓ سؤالی که در اینجا پیش میآید این است که: «در پورت های ورودی و خروجی در AVR که تعداد پین ها کمتر از هشت عدد است تکلیف بیتهای اضافی در رجیستر DDR چیست؟ و اگر ما مقدار آن ثبات را روی یک عدد هشت بیتی تنظیم کنیم چه اتفاقی برای بیتهای اضافی می افتد؟» در جواب باید گفت که اتفاقی نمیافتد و میکروکنترلر بیتهای اضافی را نادیده می گیرد.
یکی دیگر از رجیسترهایی که وضعیت صفر/یک پین را کنترل میکند رجیستر PORTx است. هر بیت در این رجیستر پین متناظر در پورت را کنترل می کند. به عنوان مثال بیت پنجم از این رجیستر پین پنجم از پورت مورد نظر را کنترل خواهد کرد. این رجیستر بر حسب این که پورت به عنوان خروجی و یا ورودی تنظیم شده باشد (توسط تنظیم رجیستر DDRx)، دو وظیفه دارد:
حالت ۱) صفر یا یک کردن پین (در صورتی که پین مورد نظر در نقش خروجی عمل کند):
همان طور که در شکل بالا مشاهده می شود، در حالتی که پین به عنوان خروجی عمل کند (بیت مربوط به آن در رجیستر DDRx روی یک تنطیم شده باشد) با یک کردن بیت مربوط به آن پین در رجیستر PORTx ، مقدار آن پین در خروجی یک (high) خواهد شد. و به طور عکس با صفر کردن بیت مربوط به آن پین در رجیستر PORTx مقدار آن پین در خروجی صفر (low) خواهد شد. به برنامههای زیر که به دو زبان C نوشته شدهاند توجه کنید:
در برنامههای بالا بیتهای صفر، سه و هفت ست (set) و بیتهای صفر و دو ریست (reset) می شوند. دیگر بیتها در حالت امپدانس بالا قرار میگیرند چرا که به عنوان پین های ورودی تنظیم شده اند.
حالت ۲) فعال/غیرفعال کردن مقاومتهای پول آپ داخلی (در صورتی که پین مورد نظر در نقش ورودی عمل کند):
در میکروکنترلر AVR همه ی پین ها به مقاومت پول آپ مجهزند. در حالتی که یک پین در نقش ورودی عمل کند، مقاومت پول آپ مربوط به آن را میتوان با برنامهریزی بیت مربوط به آن در رجیستر PORTx فعال یا غیر فعال کرد. در صورتی که آن را با یک برنامهریزی کنیم مقاومت پول آپ فعال میشود و به طور عکس اگر آن را با صفر برنامهریزی کنیم مقاومت پول آپ غیر فعال می شود. فعال کردن مقاومتهای پول آپ ورودی را به حالت یک می برد. با فعال کردن مقاومتهای پول آپ از نویزی شدن ورودی جلوگیری می کنیم.
در برنامه های زیر که به ترتیب به زبان C نوشته شده اند، پورت B به عنوان ورودی برنامهریزی شده و سپس مقاومتهای پول آپ پین های ۱، ۳، ۵، ۶ و ۷ آن فعال شده اند.
به طور پیشفرض پین های AVR در حالت ورودی و امپدانس بالا قرار دارند. یعنی هم بیتهای رجیستر DDRx و هم بیتهای رجیسترPORTx با صفر برنامهریزی شده اند.
رجیستر PINx شامل وضعیت تمام پین های مربوط به آن پورت است. اگر پین مربوطه به عنوان ورودی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx سطح منطقی آن پین را نشان می دهد. و اگر پین مربوطه به عنوان خروجی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx شامل آخرین داده ی خروجی بر روی آن پین می باشد. برنامههای زیر وضعیت پورت D را خوانده و ذخیره می کنند:
p dir="rtl" align="justify"><!--StartFragmentشکل زیر نشان دهنده ی ارتباط بین سه رجیستر معرفی شده در بالا می باشد. به عبارت دیگر تمامی مباحث گفته شده را به طور خلاصه در بر دارد. لازم به ذکر است که این شکل یک شماتیک ساده می باشد و مدار داخلی پورت های I/O بسیار مفصل تر است.
span class="crayon-c"><!--EndFragment