محل لوگو

پورت های ورودی و خروجی در AVR


پورت های ورودی و خروجی در AVR

پورت های ورودی و خروجی در AVR

در میکروکنترلرهای AVR پورت های زیادی برای انجام عملیات ورودی/خروجی وجود دارند. بسته به اینکه تراشه ی مورد نظر کدام عضو از خانواده ی AVR باشد، تعداد پورت ها، تعداد پایه‌های هر پورت و کاربرد پورت ها متفاوت خواهد بود. نامگذاری پورت ها با حروف بزرگ انگلیسی و با شروع از حرف A انجام می شود. مثلاً اگر تراشه ای ۴ پورت داشته باشد، داریم: PORTA، PORTB، PORTC و PORTD. پورت های AVR علاوه بر ورودی و خروجی بودن کاربردها و قابلیت‌های دیگری نیز دارند که در جلسات آتی در مورد آن‌ها بحث خواهد شد. جدول زیر تراشه های رایج و تعداد پورت هایشان را نشان می دهد.

p><!--EndFragment p><!--StartFragment

برای به کارگیری پورت ها جهت استفاده به عنوان ورودی و خروجی باید آن‌ها را برنامه‌ریزی نمود. پورت های ورودی و خروجی در AVR هرکدام دارای سه ثبات به نام های PORT و DDR و PIN می باشد. به عنوان مثال سه ثبات مربوط به پورت C عبارتند از: PORTC و DDRC و PINC.

پورت های ورودی و خروجی

اندازه ی هر سه ثبات هشت بیت می‌باشد و لازم به ذکر است که هر پورت می‌تواند بین سه تا هشت پایه داشته باشد. در ادامه در مورد این ثبات ها و نقش آن‌ها یاد می گیریم.

رجیستر DDRx

یک پورت می‌تواند هم نقش ورودی داشته باشد و هم نقش خروجی. اما چگونه؟ این کار با برنامه‌ریزی ثبات DDR انجام می گیرد. DDR که مخفف عبارت Data Direction Register می باشد، ثباتی هشت بیتی است. برای هر پورت یک ثبات DDR داریم که هم نام پورت است. به عنوان مثال ثبات DDR مربوط به پورت A به صورت DDRA شناخته می شود. هریک از بیت‌های ثبات DDRx یکی از پین های پورت x را کنترل می‌کند. برای مثال بیت پنجم ثبات، پنجمین پین پورت را کنترل می کند. ddrx-explanation

به منظور تنظیم کردن یک پین به عنوان ورودی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار صفر برنامه‌ریزی شود. به طور عکس برای تنظیم کردن یک پین به عنوان خروجی، باید بیت مربوط به آن پین در ثبات DDR مربوطه روی مقدار یک برنامه‌ریزی شود. به عنوان مثال فرض کنید می‌خواهیم پین ۳ و ۷ از پورت B را به عنوان خروجی و بقیه ی پین ها را به عنوان ورودی تنظیم کنیم. در زبان C باید بنویسیم:

p style="text-align: justify;"><!--StartFragment

DDRB=0b10001000;
div class="crayon-line" dir="rtl" style="text-align: right;"> <!--StartFragment

توجه شود که بیت ۳ و ۷ یک و دیگر بیت‌ها صفر شده‌اند. برای انجام این کار برای دیگر پورت ها نیز به همین صورت باید عمل کرد.

سؤالی که در اینجا پیش می‌آید این است که: «در پورت های ورودی و خروجی در AVR که تعداد پین ها کمتر از هشت عدد است تکلیف بیت‌های اضافی در رجیستر DDR چیست؟ و اگر ما مقدار آن ثبات را روی یک عدد هشت بیتی تنظیم کنیم چه اتفاقی برای بیت‌های اضافی می افتد؟» در جواب باید گفت که اتفاقی نمی‌افتد و میکروکنترلر بیت‌های اضافی را نادیده می گیرد.

رجیستر PORTx

یکی دیگر از رجیسترهایی که وضعیت صفر/یک پین را کنترل می‌کند رجیستر PORTx است. هر بیت در این رجیستر پین متناظر در پورت را کنترل می کند. به عنوان مثال بیت پنجم از این رجیستر پین پنجم از پورت مورد نظر را کنترل خواهد کرد. این رجیستر بر حسب این که پورت به عنوان خروجی و یا ورودی تنظیم شده باشد (توسط تنظیم رجیستر DDRx)، دو وظیفه دارد:

حالت ۱)‌ صفر یا یک کردن پین (در صورتی که پین مورد نظر در نقش خروجی عمل کند): portx-0xff-explained1

همان طور که در شکل بالا مشاهده می شود، در حالتی که پین به عنوان خروجی عمل کند (بیت مربوط به آن در رجیستر DDRx روی یک تنطیم شده باشد) با یک کردن بیت مربوط به آن پین در رجیستر PORTx ، مقدار آن پین در خروجی یک (high) خواهد شد. و به طور عکس با صفر کردن بیت مربوط به آن پین در رجیستر PORTx مقدار آن پین در خروجی صفر (low) خواهد شد. به برنامه‌های زیر که به دو زبان C نوشته شده‌اند توجه کنید:


DDRB=0b10001111;/* Configuring I/O pins of portb*/
PORTB=0b10001010;/* Write this byte to PORTB*/
div class="crayon-line crayon-striped-line" dir="rtl" style="text-align: right;"> <!--StartFragment

در برنامه‌های بالا بیت‌های صفر، سه و هفت ست (set) و بیت‌های صفر و دو ریست (reset) می شوند. دیگر بیت‌ها در حالت امپدانس بالا قرار می‌گیرند چرا که به عنوان پین های ورودی تنظیم شده اند.

حالت ۲) فعال/غیرفعال کردن مقاومت‌های پول آپ داخلی (در صورتی که پین مورد نظر در نقش ورودی عمل کند):

portx-internal-pullup1

در میکروکنترلر AVR همه ی پین ها به مقاومت پول آپ مجهزند. در حالتی که یک پین در نقش ورودی عمل کند، مقاومت پول آپ مربوط به آن را می‌توان با برنامه‌ریزی بیت مربوط به آن در رجیستر PORTx فعال یا غیر فعال کرد. در صورتی که آن را با یک برنامه‌ریزی کنیم مقاومت پول آپ فعال می‌شود و به طور عکس اگر آن را با صفر برنامه‌ریزی کنیم مقاومت پول آپ غیر فعال می شود. فعال کردن مقاومت‌های پول آپ ورودی را به حالت یک می برد. با فعال کردن مقاومت‌های پول آپ از نویزی شدن ورودی جلوگیری می کنیم.

در برنامه های زیر که به ترتیب به زبان C نوشته شده اند، پورت B به عنوان ورودی برنامه‌ریزی شده و سپس مقاومت‌های پول آپ پین های ۱، ۳، ۵، ۶ و ۷ آن فعال شده اند.


DDRB=0b00000000;/* Configuring I/O pins of portb*/
PORTB=0b01110101;/*enable internal pull-up resistors on output pins 1 , 3 , 5 , 6 , 7*/
 
div class="crayon-line crayon-striped-line" dir="ltr" style="text-align: right;"><!--StartFragment

 به طور پیش‌فرض پین های AVR در حالت ورودی و امپدانس بالا قرار دارند. یعنی هم بیت‌های رجیستر DDRx و هم بیت‌های رجیسترPORTx با صفر برنامه‌ریزی شده اند.

رجیستر PINx

pinx-explanation1

رجیستر PINx شامل وضعیت تمام پین های مربوط به آن پورت است. اگر پین مربوطه به عنوان ورودی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx سطح منطقی آن پین را نشان می دهد. و اگر پین مربوطه به عنوان خروجی تنظیم شده باشد، بیت مربوط به آن پین در رجیستر PINx شامل آخرین داده ی خروجی بر روی آن پین می باشد. برنامه‌های زیر وضعیت پورت D را خوانده و ذخیره می کنند:

p dir="rtl" align="justify"><!--StartFragment

DDRD=0b00000000;      /* Set all pins as input */
unsignedcharstatus;      /* Define a 8 bit integer variable */
status=PIND;             /* Store the current value of PIND in status*/
 
div class="crayon-line"> <!--StartFragment

شکل زیر نشان دهنده ی ارتباط بین سه رجیستر معرفی شده در بالا می باشد. به عبارت دیگر تمامی مباحث گفته شده را به طور خلاصه در بر دارد. لازم به ذکر است که این شکل یک شماتیک ساده می باشد و مدار داخلی پورت های I/O بسیار مفصل تر است.

inside_AVR_IO_port 

span class="crayon-c"><!--EndFragment
p dir="rtl" align="justify"><!--EndFragment

<!--EndFragment-->
 
 
 

  انتشار : ۱۳ آبان ۱۳۹۸               تعداد بازدید : 925

تمام حقوق مادی و معنوی این وب سایت متعلق به "" می باشد

فید خبر خوان    نقشه سایت    تماس با ما