۲-۳ نحوهی راهاندازی ورودیهای میکروکنترلرهای AVR
۱۲ دی ۱۳۹۷۱-۴ آشنایی با آرایهها و رشتهها
۱۲ دی ۱۳۹۷در این بخش میخواهیم با این قابلیت میکروکنترلرهای AVR که همان خواندن چندین ورودی به صورت همزمان است آشنا شویم. ابتدا به معرفی دستور PINX میپردازیم. در این دستور به جای X نام پورت میآید. این دستور معمولا در قالبهای شرطی میآید و برای خواندن تمام پایههای یک پورت به صورت یکجا کاربرد دارد. مثلا اگر در متغیر PINA مقدار 00000001 وجود داشته باشد چگونه بفهمیم که هر پایه چه مقداری دارد؟
برای پاسخ به این سئوال شکل زیر را در نظر بگیرید:
PINA.0 | PINA.1 | PINA.2 | PINA.3 | PINA.4 | PINA.5 | PINA.6 | PINA.7 |
حال اگر عددی که در بالا آورده شده است را به همان ترتیب در شکل بالا قرار دهید به راحتی متوجه خواهید شد که هر پایه چه مقداری دارد. مثلا برای مثال بالا پین A.0 مقدار 1 دارد و بقیهی پینها مقدار 0 دارند. در واقع اعداد متناسب با ارزششان در مبنای باینری به هر پین نسبت داده میشوند. در واقع کم ارزشترین رقم به پین صفرم و با ارزشترین رقم به پین هفتم نسبت داده میشود. حال یک پروژه را تعریف میکنیم به گونهایی که با خواندن یک پورت به صورت کامل اعمال متناسب و متفاوتی را در خروجی انجام دهیم.
تعریف پروژه:
برنامهای را شبیهسازی کنید که با دادن هر ورودی 0 به پینهای پورت A، پایههای پورت B متناسب با آنها فعال شود و LED متصل به خود را روشن کند. در واقع منظور این است که اگر ورودی 0 به پین A.5 وارد شد پورت B.5 فعال شود.برای این کار پس از آنکه شروع به ساخت پروژه کردیم باید نکات زیر را در نظر بگیریم:
- شبیهسازی را با میکروکنترلر ATmega32 انجام میدهیم، بنابراین از لیست میکروکنترلرها این میکرو را انتخاب کنید.
- تمام پایههای پورت A را در حالت ورودی Pull Up شده قرار دهید.
- تمام پایههای پورت B را در حالت خروجی با مقدار اولیهی صفر قرار دهید.
حال پس از انجام تنظیمات بالا و ساختن یک پروژهی جدید، مدار زیر را در Proteus شبیهسازی کنید.
در شکل بالا تمام پایههای پورت A در حالت Pull Up قرار دارند و با یک سویئچ همگی به زمین متصل شدهاند. حال به قطعه کد زیر نگاه بیندازید.
[php] while (1) { if(PINA ==0B11111110) PORTB.0=1; else PORTB.0=0; if(PINA==0B11111101) PORTB.1=1; else PORTB.1=0; if(PINA==0B11111011) PORTB.2=1; else PORTB.2=0; if(PINA==0B11110111) PORTB.3=1; else PORTB.3=0; }[/php]
در قطعه کد بالا به تربیب زیر عمل شده است:
- مقدار پورت A را میخوانیم.
- حال به پورت B مقدار متناسب با آن را در بدنهی هر شرط نسبت میدهیم.
دقت کنید که در بالا اگر شرط برقرار نباشد پورتها با دستور else به حالت صفر برده شدهاند تا از 1 ماندن خروجی پس از یک بار برقراری شرط مربوطه جلوگیری شود.حال به شکلهای بعد که حاصل اجرای کد برای مقادیر مختلف ورودی هستند دقت کنید.
در شکل ۱۳ همانطور که میبینید پس از فشردن سوییچ اول که متصل به پین A.0 است، پین A.0 به حالت 0 رفته است. بنابراین طبق کدهای خط ۳ تا ۱۲، LED متصل به پورت B.0 را روشن میکند.
در شکل ۱۴ نیز پین A.3 به حالت 0 رفته است که در نتیجهی آن پورت B.3 روشن شده است. این بخش از اتفاقات مربوط به دستورات خط ۱۳ تا ۲۲ است.
حال اگر دو سوییچ را به صورت همزمان فشار دهیم چه رخ خواهد داد؟ پس از انجام این کار شکل صفحهی بعد را مشاهده خواهید کرد. در شکل زیر همانطور که مشاهده میکنید هیچ LED روشن نشده است. علت این امر این است که ما در شرطهای خود چنین حالتی را پیشبینی نکرده بودیم. در واقع حالت PINA==0B00000110 در شرطهای ما وجود ندارد.
اگر ما این شرط را به همراه کاری که میخواهیم در ازای آن میکرو برای ما انجام دهد به کد خود اضافه کنیم تغییرحالتی را در این حالت و یا تمام حالات پیش بینی نشدهی دیگر به وجود بیاوریم.
**یک نکتهی دیگر که در اینجا لازم است که بدانید این است پورت C هنگام تنظیمات ورودی – خروجی کمی با دیگر پورتها متفاوت است. در این پورت به دلیل در نظر گرفتن قابلیت JTag، اگر میخواهید از این پورت به عنوان ورودی – خروجی استفاده کنید باید این قابلیت را غیرفعال کنید. این قابلیت معمولا به هنگام برنامهریزی کردن میکرو تنظیم میشود. بنابراین هنگام انجام عمل Programming همواره به خاطر داشته باشید که اگر میخواهید از پورت C به عنوان ورودی – خروجی استفاده کنید ویژگی JTag را غیر فعال کنید.
در این فصل سعی بر آن بود که علاوه بر کار کردن با ورودیها بتوانید نحوهی ارتباط متناسب با خروجیها را نیز تمرین کنید. در فصلهای بعد با روشهای دیگر ارتباط با محیط در میکروکنترلرهای AVR آشنا میشوید.