در این بخش میخواهیم با این قابلیت میکروکنترلرهای 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 فعال شود.برای این کار پس از آنکه شروع به ساخت پروژه کردیم باید نکات زیر را در نظر بگیریم:
حال پس از انجام تنظیمات بالا و ساختن یک پروژهی جدید، مدار زیر را در 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]
در قطعه کد بالا به تربیب زیر عمل شده است:
دقت کنید که در بالا اگر شرط برقرار نباشد پورتها با دستور else به حالت صفر برده شدهاند تا از 1 ماندن خروجی پس از یک بار برقراری شرط مربوطه جلوگیری شود.حال به شکلهای بعد که حاصل اجرای کد برای مقادیر مختلف ورودی هستند دقت کنید.
در شکل ۱۳ همانطور که میبینید پس از فشردن سوییچ اول که متصل به پین A.0 است، پین A.0 به حالت 0 رفته است. بنابراین طبق کدهای خط ۳ تا ۱۲، LED متصل به پورت B.0 را روشن میکند.
شکل ۱۳
در شکل ۱۴ نیز پین A.3 به حالت 0 رفته است که در نتیجهی آن پورت B.3 روشن شده است. این بخش از اتفاقات مربوط به دستورات خط ۱۳ تا ۲۲ است.
شکل ۱۴
حال اگر دو سوییچ را به صورت همزمان فشار دهیم چه رخ خواهد داد؟ پس از انجام این کار شکل صفحهی بعد را مشاهده خواهید کرد. در شکل زیر همانطور که مشاهده میکنید هیچ LED روشن نشده است. علت این امر این است که ما در شرطهای خود چنین حالتی را پیشبینی نکرده بودیم. در واقع حالت PINA==0B00000110 در شرطهای ما وجود ندارد.
شکل ۱۵
اگر ما این شرط را به همراه کاری که میخواهیم در ازای آن میکرو برای ما انجام دهد به کد خود اضافه کنیم تغییرحالتی را در این حالت و یا تمام حالات پیش بینی نشدهی دیگر به وجود بیاوریم.
در این فصل سعی بر آن بود که علاوه بر کار کردن با ورودیها بتوانید نحوهی ارتباط متناسب با خروجیها را نیز تمرین کنید. در فصلهای بعد با روشهای دیگر ارتباط با محیط در میکروکنترلرهای AVR آشنا میشوید.