۱-۲ شروع کار با خروجی در پایههای با قابلیت I/O
۲۷ آذر ۱۳۹۷۳-۲ آشنایی با چند نوع موتور الکتریکی و روشهای راهاندازی آنها
۲۷ آذر ۱۳۹۷گاهی اوقات ما نیاز داریم تا یک مقدار خاص صفر یا یک را برای مدت محدود روی یک پایهی میکروکنترلر اعمال کنیم یعنی مثلا میخواهیم پین A.0 به مدت ۱ ثانیه مقدار ۱ و به مدت ۵۰۰ میلی ثانیه مقدار صفر را داشته باشد.
برای انجام چنین کاری به تابعی نیاز داریم که برنامه را برای مدت محدود در یک خط خاص از کد نگه دارد و پس از تمام شدن این زمان مشخص دوباره برنامه روند اجرای خط به خط خود را از سر بگیرد.
در نرم افزار CodeVision چنین قابلیتی وجود دارد.
در این نرم افزار با استفاده از کتابخانهی <delay.h> این قابلیت در نظر گرفته شدهاست.
برای استفاده از این قابلیت ابتدا باید کتابخانهی بالا را به صورت زیر به برنامهی خود اضافه کنید:
[php] #include<delay.h> [/php]
پس از اضافه کردن کتابخانهی بالا به برنامه با استفاده از دستور:
[php] delay_ms(milliseconds) [/php]
میتوانید برنامهی خود را به مدت چند میلیثانیه که به جای کلمهی milliseconds مینویسید در یک خط خاص متوقف کنید و با همین ویژگی مقدار ثبت شده روی یک پایه را برای مدت زمان محدود و مشخص ثابت نگه دارید و سپس اگر خواستید آن را تغییر دهید.
مثلا دستور:
[php] delay_ms(300) [/php]
برنامه را ۳۰۰ میلی ثانیه در خطی که این دستور را وارد کردهایم متوقف میکند.
حال با همین خاصیت میتوانیم یک LED چشمک زن بسازیم.
به این نحو که سعی میکنیم پین A.0 برای مدت ۱ ثانیه یک LED را روشن کرده و برای ۱ ثانیهی بعد آن را خاموش نگه دارد و این عمل همین طور تکرار شود.
به این منظور پس از تعریف یک پروژه و تعیین پین A.0 به عنوان خروجی با مقدار اولیهی صفر کار خود را شروع میکنیم.
در ادامه و در قطعه کد while(1) شروع به برنامه نویسی میکنیم. همانطور که در تعریف پروژه آمده است پین A.0 باید به مدت ۱ ثانیه روشن باشد، پس ابتدا پین A.0 را روشن میکنیم و سپس با استفاده از تاخیر این مقدار دهی را به مدت ۱۰۰۰ میلی ثانیه که همان یک ثانیه میشود بر روی این پایه حفظ میکنیم.
سپس مقدار پین A.0 را صفر کرده و بازهم با استفاده از تاخیر این مقدار دهی را به مدت ۱۰۰۰ میلی ثانیه بر روی این پایه حفظ میکنیم.
قطعه کد زیر نشان دهندهی این کار است:
[php] while(1){ PORTA.0=1; delay_ms(1000); PORTA.0=0; delay_ms(1000); } [/php]
در قطعه کد بالا کاملا همانند تعریف بالا عمل شده است.
حال با ریختن فایل HEX این کد را بر روی میکرو کنترلر ATmega32 در حالی که به پین A.0 آن یک LED متصل است، تست کنید.
یک LED چشمک زن مشاهده خواهید کرد.
پس از انجام این پروژه با تعریف پروژههای جدیدی که پایههای بیشتری از آنها روی حالت خروجی تنظیم شدهاند و به آنها LED متصل است، سعی کنید انواع بیشتر و زیباتری چشمک زن تولید کنید.
8 Comments
من همین دستور رو میدم اما موقع کامپایل کردن ارور میده مینویسه تابع تعریف نشده! تو اینکلود قرارش میدم و توی برنامه هم همین شکل مینویسم اما …
لطفا خطای اعلامی از کامپایلر را در اینجا قرار دهید تا بتوانیم به شما پاسخ درست تری بدهیم
سلام و خسته نباشید.
من این کد رو نوشتم اما متاسفانه هیچ تاخیری داخل مدارم ایجاد نمیشه. میخواستم ببینم آیا باید تغییراتی هم در پروتئوس انجام بدم؟
با تشکر
با سلام
آیا فایل hex تولیدی Codevision را در میکرو در Proteus لود کردید؟
سلام
من می خواستم یک تاخیر دوساعته ایجاد کنم , آیا از این دستور می تونم استفاده کنم؟
با سلام،
دستور delay، در واقع برای کاربردهای هست که زمان خیلی مهم نیست، به این علت که این دستور از دقت زمانی بالایی برخوردار نیست، و با توجه به شرایط داخلی برنامهِ که برای میکرو نوشتین زمانش عوض میشه، به این مفهوم که متناسب با interrupt هایی که در میکرو هست ممکنه زمان delay عوض بشه چرا که از اولویت بسیار پأیینی در کد برخوردار هست. به طور مثال ممکن یک delay با زمان ۱ ثانیه ۱۰ ثانیه طول بکشه!
برای همین برای کار شما توصیه میکنم از واحد تایمر کانتر استفاده کنین، و یک دقیقه شمار و ساعت شمار اونجا تعریف کنین و زمان رو به اون شکل با دقت بسیار بالا اندازه گیری و ثبت کنین،در فصل ۷ بخش ۴ کتاب زیر این مبحث به طور کامل توضیح داده شده
https://robotmakers.ir/%D9%85%DB%8C%DA%A9%D8%B1%D9%88-%DA%A9%D9%86%D8%AA%D8%B1%D9%88%D9%84%D8%B1%D9%87%D8%A7%DB%8C-avr/
سلام روز بخیر من میخوام همین برنامه چشمک زدن ledو با یک یک کلید بنویسم که pull_upداخلی داره و کار کلید اینه که با فشار دادنش اگه ledروشن باشه روشن میمونه و اگه خاموش باشه خاموش میمونه میتونید راهنمایی کنیدـ
میشه برنامه ای برای کدویژن معرفی کنید که هر شش ساعت یکبار یکی از پین هارو به مدت ۲۰ ثانیه فعال کنه و بعد از ۲۰ ثانیه دوباره شش ساعت بعد همین حلقه رو تکرار کنه ، ینی هر شش ساعت فقط بیست ثانیه ی پین یک بشه