آموزش بسکام اتصال کلید به AVR (دو)
در قسمت قبلی آموزش بسکام پستی با عنوان کار با پورت ها میکروکنترلر AVR ارئه دادیم با ادامه آموزش بسکام با الکترولب همراه باشید. در هر دستگاهی الکترونیکی که به نظر شما میرسد حداقل یک کلید وجود دارد مثلا همین گوشی موبایل که حداقل 3 تا کلید داره که دوتا مربوط به ولوم صدا و دیگری مربوط به قفل کردن گوشی هست .
اما این کلید ها چگونه به میکروکنترلر وصل میشود:
در واقع نصب کلید راه های گوناگونی داره و متناسب با کاربرد آن در جاهای مختلف متفاوت هست مثلا در کنترل تلوزیون دکمه مربوط به خاموش و روشن کردن کلید اینگونه عمل میکند که که شما بازدن کلید دستگاه روشن میشود ولی اگه دستتون باز هم روی کلید باشد دوباره خاموش نمیشود و برای دوباره خاموش کردن آن باید دست خود را از کلید برداشته ودوباره فشار دهید در واقع با فشار دادن کلید پردازنده دستور روشن شدن رو یک بار میفرستد و منتطر میشود تا شما دست خود رو از کلید بردارید.
این یکی از روش های کلید زنی هست خاطر نشان کردم که روشهای خیلی زیادی وجود داره که میتوان فقط برای نحوه استفاده از کلید یک کتاب نوشت . به حر حال ان روشی که رایج هست همین روش دکمه خاموش روشن تلوزیون هست که در این قسمت نحوه اتصال کلید به میکرو کنترلر رو با این روش براتون توضیح میدم .
در اکثر شماتیک های تخصصی که میبینید یکطرف همه کلید ها به زمین وصل شده وطرف دیگه به میکرو کنترلر . در حالی که شما انتظار دارید یک طرف کلید به vcc یاهمون مثبت وصل بشه بله این روش هم میتولند استفاده بشه ولی علاوه بر کلید نیاز به المان دیگری یعنی مقاومت دارد
من این رو ازکجا میگم؟ بریم برسسی کنیم:
در حالت کلی وقتی کلیدی به میکرو وصل میشود باید میکرو وضعیت این کلید را بخواند و دستور مربوط به کلید رو در کد ها اجرا کند . اما چطور وضعیت این کلید توسط میکرو خونده بشه ؟ پاسخ همون صفر و یک منطقی هست وقتی شما یک کلید را که یک طرف آن به vcc وصل هست را بزنید میکرو روی آن پایه ای را که به کلید وصل هست vcc را دریافت میکند یعنی با کلید vccبه پایه میکرو انتقال یافت و میکرو متوجه زدن کلید میشود .
اما چرا باید از یک مقاومت استفاده کنیم؟ درپاسخ به این سوال باید گفت که وقتی شما کلید را فشا ردادید و میکرو متوجه زدن کلید شد زیر برنامه یا دستور مربوط به کلید اجرا میشود و بعد دوباره وضعیت کلید را بررسی میکند در این حال اگر شما دست خود را از کلید هم برداشته باشید احتمال وجود vcc رو پایه میکرو وجود خواهد داشت و میکرو در موقع بررسی وضعیت کلید با دیدن vcc روی پایه تشخیص میدهد که کلید زده شده و کار خود را انجام میدهد اما! کلید که زده نشده بود پس چرا بعد از زدن کلید هنوزvcc روی پایه میکرو باشه ؟ دلیل این آن است که وقتی در میکرو کلیدی را به یکی از پایه هایش وصل میکنیم آن پایه باید ورودی شود و در این حالت مقاومت ورودی آن پایه بالا هست و جریان بسیار کمی از vcc مصرف میکند در نتیجه بعد از زدن کلید توسط شما vcc روی پایه هنوز مصرف نشده وباقی مانده و باید تا زمانی که میکرو وضعیت کلید را دوباره بررسی میکند این vcc مصرف شود که مصرف نشده راه حل این هست که این پایه از میکرو با یک مقاومتی در حدود 8 یا 10 کیلو اهم به زمین وصل بشه . به این روش pulldown میگویند یعنی با یک مقاومت ولتاژ روی گایه به صفر ولت کشیده شود و ولتاژvcc روی پایه باقی نماند وقبل از بررسی دو باره میکرو ولتاژ روی پایه صفر شود. اما دلیل استفاده از مقاومت این هست که وقتی شما کلید رو فشار میدهید vcc یا همون مثبت مستقیما روی پایه میکرو میافتد ولی اگه مقاومت نباشد این پایه مستقیما به زمین یا همون منفی وصل هست به عبارتی منبع ولتاژ با هر بار زدن کلید اتصال کوتاه میشود برای جلوگیری از این خطا از یه مقاومت بین مثبت وزمین استفاده میشود.
در توضیحات بالا شما متوجه شدید که وقتی یکطرف کلید به مثبت وصل هست طرف دیگر دعین حال که میکرو وصل شده با یک مقومت نیز به زمین وصل شده (شکل زیر)
اما چرا گفتیم در طراحی های تخصصی کلید را به زمین وصل میکنند؟
در پاسخ بایدگفت مثل روش بالا وقتی کلیدی به زمین وصل باشه وقتی زده میشود منفی روی پایه میکرو میافتد و با برداشتن دست از روی کلید باز هم منفی روی پایه میکرو باقی میمونه که بایک مقاومت اینبار به vcc وصل میشود . اگه تا اینجا رو متوجه شده باشید دلیل اینکه در طراحی ها کلید رو به زمین وصل میکنند این هست که ان مقاومتی که باید به vcc وصل شود در داخل خود میکرو وجود داره وباید شما پس از ورودی کردن پایه این مقاومت رو فعال کنید این امکان میکرو باعث کمتر شدن هزینه و آسان شدن طراحی برد میشود پس عقل سالم حکم میکنه که کلید رو به زمین وصل کنیم (شکل زیر)
حالا کلا سخت افزار کلید توضیح داده شد در ادامه به آموزش برنامه نویسی اتصال کلید به AVR در بسکام میپردازیم :
در این قسمت من روش استاندارد یعنی وصل کردن کلید به منفی یا زمین رو انتخاب میکنم و متناسب با این روش برنامه ها رو توضیح میدهم کار را با یک مثال ساده پیش میریم . در این مثال قرار است با زدن یک کلید یک led روشن شود وبا زدن دوباره کلید خاموش بشه با دونستن صورت مسأله طراحی رو شروع میکنیم:
در ابتدا یک پایه از میکرو را برای led ویک پایه را برای کلید رد نظر میگیریم برای این کار من پایه PA0 رو برای LED وپایه PA1 را برای کلید رد نظر میگیرم ومدار رو به صورت زیر برای میکروatmega32 داریم
در کد نویسی میکرو بعداز مشخص کردن نوع میکرو و فرکانس کاری میکرو پایه PA0 را با دادن مقدار 1 خروجی میکنیم و پایه PA1 رو چون به کلید متصل هست و داده از آن در یافت میکنیم پس با دادن مقدار 0 ورودی میکنیم . حالا با دستور زیر مقاومت داخلی میکرو راکه بهVCC وصل بود را با دستور PORTA.1=1 فعال میکنیم.
$regfile = "M32def.dat" $crystal = 1000000 Ddra.0 = 1 Ddra.1 = 0 Porta.1 = 1
الگوریتم نوشتن خواندن کلید به این گونه هست که در ابتدای حلقه بینهایت با دستور IF پایه PA1 رو بررسی میکند که ایا 0 شده (یعنی کلید زده شده)است یا نه و هم چنین 0 بودن مقدار D و در صورت نزدن کلید ادامه اجرای کد ها بعد از END IF ادامه میابد و چون وضعیت پایه توسط مقاومت داخلی در حالت VCC هست پس بعد از دستور END IF دوباره با دستور IF دوباره بررسی میشود که ایا پایه PA1 1 هست یعنی کلید زده نشده در صورت صحیح بودن شرط کد مربوط به شرط اجرا میشود وکه در اینجا مقدار D 0 میشود
اما اگه کلید زده شود و مقدار D 0 باشد دستورات مربوط به شرط اجرا میشود که در ابتدا مقدار D 1 میشود بعد اگر پایه PA0 1بود(یعنی LED روشن بود( مقدار PA0 رو توسط دستور TOGGLE 0 میکند و برعکس . در اینجا ممکنه سوالی از خودتون داشته باشید که D چیز هست .Dیک متغر یک بیتی هست که میتواند فقط دو حالت را در خود جای دهد یک یا صفر حالا چرا ازاینمتغیر استفاده شده؟ پاسخ خیلی ساده هست .وقتی شما کلید رو فشار میدهید حداقل 200میلی ثانیه دستتان روی کلید باقی میماند و به دلیل سرعت زیاد میکرو وضعیت کلید حداقل هر 10 میکرو ثانیه یک بار چک میشود به عبارتی مدت زمانی که دست شما روی کلید هست حداقل 20 هزار بار میکرو وضعیت پایه کلید رو بررسی میکند و اگر ازD استفاده نکرده باشیم 20 هزار بار ال ای دی روشن خاموش میشود و وضعیت اخر ال ای دی موقعی که دستتون رو از کلید برمیدارید معلوم نیست که روشن خواهد شد یا نه حتی اگه قبل از کلید زنی ال ای دی روشن باشد ممکن است بعد از کلید زنی باز هم روشن باقی بماند پس برای جلوگیری از تغیر وضعیت ال ای دی از یک متغیر استفاده میکنیم که وقتی زدن کلید برای اولین بار تشخیص داده شد دو باره دستورات مربوط به کلید زنی اجرا نشود تا زمانی که مقدار D تغیر یابد مقدار D نیز در شرط دوم تغییر میابد یعنی موقعی که دستتان را از رو کلید برداشتید البته چند میلی ثانیه تاخیر هم به برنامه اضافه میکنیم تا عملکرد برنامه خوب شود
کل برنامه به صورت زیر هست:
$regfile = "M32def.dat" $crystal = 1000000 Ddra.0 = 1 Ddra.1 = 0 Porta.1 = 1 Dim D As Bit Do If Pina.1 = 0 And D = 0 Then D = 1 Toggle Porta.0 End If If Pina.1 = 1 Then D = 0 Waitms 10 Loop End
منتظر قسمت بعدی آموزش بسکام از الکترولب باشید.
واقعا عالیه مرسی ممنون
سلام
من تازه با برنامه نویسی بیسیک آشنا شدم
ببخشید
یه سوال داشتم
چه دستوری باید بنویسم
با هر بار 0 شدن یک کلید در ورودی هربار یک LED در خروجی به ترتیب روشن بشه
سلام
درود بر شرف شما دوست عزیزم که این طور کامل در جهت پیشرفت علم جوون های عزیز کشورمون توضیح میدین.
برایتان آرزوی توفیق روز افزون از درگاه ایزد منان مسئلت دارم
ان شاءالله همیشه با این پشتکار ادامه بدین.
فقط استاد جسارتا اگر اشتباه نکرده باشم شرط دوم ناقصه و دستور end if رو لازم داره
if pina.1=1 then d=0
waitms 10
end if
ممنون از لطف و نظرتون اصلاح میشه حتما نمونه برنامه
زیر شرط اگر تنها یک خط دستور وجود داشته باشد نیازی به endif نیست
بلیه دقیقا درسته
بعضی اوقات ارور هم میده.
سلام..خدا قوت….ممنون از شما….بی صبرانه منتظر قسمت های بعد هستیم…
سلام..خدا قوت….ممنون از شما…عالی توضیح میدین…قسمت سوم رو تازه دیدم…
اجرکم عند الله………..
سلام
ممنون
واقعا کامل و واضح بود
با ارزوی موفقیت روز افزون
سلام
ممنون
مهندس یه برنامه میخام بنویسم که بازدن یه میکرو سویچ یه پین خروجی باشه به مدت ۵ دقیقه وهمزمان یه چراغ چشمک زن فعال بشه
میشه راهنمایی کنین ممنون
بسیار عالی و کامل توضیح دادید
ممنون واقعا
سلام . چجوری میشه کلیدی وصل کرد به عنوان کلید stop . مثلا هر وقت بزنی برنامه متوقف بشه و وقتی دوباره بزنیم برنامه ادامه بده . مثلا در پروژه تایمر