دوشنبه , ۳۰ اردیبهشت ۱۳۹۸
آخرین مطالب
LINK TABLES
خانه | پروژه های کاربردی | تایمر معکوس با سون سگمنت مالتی پلکس

تایمر معکوس با سون سگمنت مالتی پلکس

سلام به مخاطبای خوب سایت،
بالاخره وقتش رسید که از تمامی مطالبی که در دوره های آموزشی AVR یاد گرفتیم، در عمل استفاده کنیم. این بار در خدمتتونم با پروژه تایمر معکوس که در طی اون با مالتی پلکس کردن سون سگمنت ها هم آشنا خواهیم شد. امیدوارم که براتون مفید باشه.

  • توضیحات
  • کدنویسی/شبیه سازی
  • پیاده سازی سخت افزاری

توضیحات اولیه

قصد داریم در این پروژه تایمر معکوس طراحی کنیم. این تایمر دو رقم دقیقه شمار و دو رقم ثانیه شمار خواهد داشت. با توجه به این که می خواهیم نمایشگر این تایمر از جنس سون سگمنت باشد در مورد مالتی پلکس کردن سون سگمنت نیز مطالب مورد نیاز بیان خواهند شد. برای دادن اعداد تنظیم نیز از کی­پد استفاده می کنیم. در ادامه این تایمر را طراحی، برنامه نویسی، شبیه سازی کرده و مدار آن را نیز خواهیم بست تا به طور عملی نتیجه کار را ببینیم. تصویر زیر نمونه مدار بسته شده از این پروژه را نشان می دهد. حتما ویدیوهای مرتبط را در تب های کدنویسی/شبیه سازی و پیاده سازی ببینید.

تایمر معکوس

قطعات مورد نیاز

  1. یک عدد میکروکنترلر ATmega16
  2. دو عدد سون سگمنت دو رقمی به عنوان نمایشگرهای دقیقه و ثانیه شمار
  3. یک عدد کیپَد جهت وارد نمودن اعداد تنظیم
  4. یک عدد آی سی ۷۴۲۱ (گیت AND چهار ورودی)
  5. هشت عدد مقاومت ۳۳۰ اهمی
  6. یک عدد کریستال ۱۲ مگاهرتزی و دو عدد خازن در محدوده ی پیکوفاراد
  7. بِرِد بورد و سیم

یادآوری

با توجه به این که در انجام پروژه تایمر معکوس از برخی از امکانات میکروکنترلر AVR استفاده خواهیم کرد، ممکن است نیاز به یادآوری داشته باشید. در لیست زیر مفاهیمی که برای انجام این پروژه به کار برده می شوند، به همراه مرجع یادگیری ارائه شده اند:

مالتی پلکس کردن سون سگمنت

در مورد ساختمان سون سگمنت و انواع آن و همچنین روش های راه اندازی سون سگمنت توسط میکروکنترلر AVR توضیحات مورد نیاز به تفصیل ارائه شد. برای خواندن آن به پست راه اندازی سون سگمنت مراجعه نمایید. در این پروژه از دو سون سگمنت دو رقمی کاتد مشترک استفاده خواهیم کرد. اگر بخواهیم به صورت قبل و ساده از  چهار سون سگمنت جداگانه استفاده کنیم به ۳۲ پین میکروکنترلر نیاز داریم که ممکن نیست. چون برای مقاصد دیگرمان پین کم خواهیم داشت. راه حل این مشکل استفاده از تکنیک مالتی پلکس می باشد.

تکنیک مالتی پلکس چیست؟

مالتی پلکس کردن به معنای ارسال چند سیگنال دیجیتال از طریق یک واسط است. هدف از این کار به اشتراک گذاشتن منابعی می باشد که تعدادشان به دلایلی محدود است. در این جا منبع محدود ما تعداد پین های میکروکنترلر می باشد. برای همین از تکنیک مالتی پلکس استفاده کرده و فقط با تعداد ۸ پین هر ۴ سون سگمنت مان را راه اندازی و مورد استفاده قرار خواهیم داد.

برای استفاده از این تکنیک از این نکته بهره می بریم که چشم انسان توانایی تشخیص فاصله ی زمانی اندک بین دو اتفاق بسیار سریع را ندارد. به عنوان مثال در تماشای فیلم، ویدیویی که برای انسان پخش می شود متشکل از تصویرهایی است که با سرعت و با فاصله زمانی کم پشت سرهم به نمایش گذاشته می شوند. ولی چشم انسان قادر به تشخیص این فاصله نبوده و تصاویر پخش شده را به صورت فیلمی پیوسته مشاهده می کند. به طور مشابه ما نیز در این جا با تکنیک مالتی پلکس ابتدا یکی از سون سگمنت ها را روشن می کنیم و دیگر سون سگمنت ها خاموش می مانند و سپس سون سگمنت روشن را خاموش کرده و سون سگمنت بعدی را روشن می کنیم. و به همین ترتیب این خاموش و روشن کردن را برای چهار سون سگمنت تکرار می نماییم. اما این کار را اینقدر سریع انجام می دهیم که چشم انسان قادر به تشخیص این امر نبوده و همه ی سون سگمنت ها را همیشه روشن ببیند.

استفاده از تکنیک مالتی پلکس هم تعداد پایه های مورد نیاز را کاهش داده و هم مصرف توان را نیز کم می کند. چون در یک زمان فقط یک سون سگمنت روشن بوده و دیگر سون سگمنت ها خاموش هستند. به عبارتی توانی که مصرف می شود توان مورد نیاز برای روشن کردن تنها یک سون سگمنت می باشد.

چگونگی مالتی پلکس کردن سون سگمنت ها در این پروژه

در پروژه تایمر معکوس هر سون سگمنت را هربار به مدت ۴ میلی ثانیه روشن می کنیم. یعنی هر سون سگمنت در هر ثانیه ۲۵۰ بار روشن می شود. به همین دلیل چشم ما قادر به احساس این تغییر سریع نیست. و در نهایت چیزی که چشم ما می بیند روشن بودن همزمان همه ی سون سگمنت ها با هم خواهد بود. چیزی که در واقع اتفاق می افتد این است که میکروکنترلر به پایه ای که به سون سگمنت کاتد مشترک وصل است مقدار صفر اعمال کرده و آن را به مدت ۴ میلی ثانیه روشن نگه می دارد تا مقداری که روی پورت وجود دارد توسط سون سگمنت مورد نظر نمایش داده شود. سپس این پین را یک کرده و سون سگمنت خاموش می شود و به جای آن پین بعدی صفر می گردد تا سون سگمنت بعدی روشن شود و مقدار روی پورت را نمایش دهد. تمام این روند برای هر چهار سون سگمنت انجام شده و در یک حلقه ی بینهایت تکرار می شود.

شکل زیر شماتیک مداری که باید بسته شود را نشان می دهد:

شماتیک تایمر معکوس ۱

همان طور که در شکل بالا مشاهده می کنید با چهار پین اول از پورت D تعیین می کنیم که کدام سون سگمنت روشن باشد و سپس از طریق پورت C کد سون سگمنت کاراکتری را که می خواهیم روی سون سگمنت فعال به نمایش در آید، به آن می دهیم.

در مواردی که جریان کلیِ کشیده شده از میکروکنترلر زیاد باشد، می توان از ترانزیستور به عنوان کلید یا آی سی ULN2003 به عنوان راه انداز استفاده کرد. شکل زیر روش مالتی پلکس سون سگمنت با استفاده از آی سی ULN2003 را نشان می دهد:

شماتیک تایمر معکوس ۲

ولی چون در اینجا میکروکنترلر جریان مورد نیاز را بدون مشکل تامین می کند نیازی به این کار نیست.

طراحی و الگوریتم نویسی پروژه تایمر معکوس

قصد داریم تایمری را طراحی کنیم که دارای دو رقم دقیقه و دو رقم ثانیه باشد و بتوانیم توسط کی پد اعداد تنظیم را به آن بدهیم.  و پس از زدن کلید استارت شروع به شمردن معکوس کند. همچنین می خواهیم با زدن کلید توقف، شمارش متوقف شده و قابلیت ادامه ی شمارش یا تنظیم دوباره را داشته باشد. برای زیبایی کار، پس از روشن شدن مدار یک انیمیشن ساده را طراحی کرده و پیاده سازی خواهیم نمود.

فلوچارت این تایمر را در شکل زیر مشاهده می کنید:

countdown timer flowchart

برنامه نویسی و شبیه سازی

توضیحات و آموزش برنامه نویسی و شبیه سازی این پروژه در قالب ویدیو را در قسمت برنامه نویسی/شبیه سازی در بالا مشاهده کنید.

انیمیشن گیف شبیه سازی این پروژه در شکل زیر آورده شده است:

countdown timer gif

شبیه سازی این پروژه در محیط پروتئوس ورژن ۸٫۴ انجام شده است. برای دانلود این ورژن به پست دانلود نرم افزار پروتئوس ۸٫۴ مراجعه فرمایید.

پیاده سازی سخت افزاری پروژه تایمر معکوس

ویدیوی تهیه شده در مورد پیاده سازی سخت افزاری پروژه تایمر معکوس را در قسمت پیاده سازی در بالا مشاهده فرمایید.

همانطور که در ویدیوی مربوط به برنامه نویسی و شبیه سازی گفته شد، کیپد را به پورت C متصل می کنیم. پورت A را به پایه های داده ی سون سگمنت ها وصل می کنیم. توسط چهار پین اول از پورت A مالتی پلکس کردن سون سگنت ها را انجام می دهیم، برای همین باید آن ها را به پین های enable سون سگمنت ها که همان پایه های مشترک COM می باشد،متصل کنیم. همچنین برای اعمال وقفه ی سخت افزاری کیپد باید از آی سی ۷۴۲۱ که دارای دو گیت AND چهار ورودی است، استفاده می کنیم. ساختار داخلی و چینش پین های این آی سی در شکل زیر نشان داده شده است:

۷۴۲۱ IC

نمونه ی پروژه ی بسته شده بر روی بِرِد بورد در تصویر اول همین صفحه نشان داده شده است.

در تب بعدی می توانید قسمت هایی از کد نوشته شده برای این پروژه به همراه ویدیوی توضیح کدها را مشاهده فرمایید.

برنامه نویسی پروژه تایمر معکوس با زبان سی و در محیط نرم افزار کدویژن ۳٫۱۲ انجام شده است. همچنین شبیه سازی انجام شده در محیط پروتئوس ۸٫۴ صورت گرفته است. در زیر می توانید قسمت هایی از کد نوشته شده برای پروژه را مشاهده کنید. برای دریافت کد کامل این پروژه که نزدیک به ۴۰۰ خط می باشد و هم چنین فایل شبیه سازی پروتئوس می توانید در پایین همین پست اقدام به خرید نمایید.

ویدیوی زیر را شامل توضیحات الگوریتم، برنامه نویسی و شبیه سازی این پروژه می باشد، حتما ببینید:

از مدار بسته شده ی پروژه تایمر معکوس بر روی بردبورد ویدیویی تهیه نمودیم تا به صورت ملموس تر بستن این پروژه را نیز یاد بگیرید. توضیحاتی مختصر نیز در مورد آن ارائه گردیده است. ویدیوی زیر را حتما ببینید:

خرید سورس کد پروژه 

چرا سورس کد این پروژه رایگان نیست؟

  • در این پروژه نزدیک به ۴۰۰ خط کدنویسی زبان C انجام شده که مستلزم صرف ساعت ها وقت بوده است.
  • از این کد تست سخت افزاری گرفته شده و علاوه بر شبیه سازی در عمل هم جواب دقیق می دهد.
  • کدنویسی پروژه به صورت بهینه و با کیفیت انجام شده تا از سخت افزار به درستی استفاده کند.
  • سورس کد به صورتی نوشته شده که به راحتی قابلیت ویرایش برای استفاده در دیگر پروژه ها را داشته باشد.
  • میکرولرن همیشه به مخاطبان خودش احترام می گذارد و در نظر دارد تا محصولات بهتری برای آن ها تهیه کند. این مهم بدون تامین مالی امکان پذیر نمی باشد. شما با خرید این کد ما را به تولید کدهای بهتر و کاربردی تر تشویق می کنید.

برای دریافت فایل های این پروژه شامل فایل hex، فایل زبان C و فایل شبیه سازی پروتئوس لطفا روی دکمه زیر کلیک نمایید:

خب اگه این پروژه رو انجام دادین و اونو بستین بهتون خسته نباشید میگم. در پروژه های بعد سعی مون بر اینه که کارهای جدیدتر و جذاب تر رو با میکروکنترلر AVR انجام بدیم. منتظر باشین.
در ضمن اگه ایده، نظر، پیشنهاد یا انتقادی دارین حتما حتما به ما منتقل کنین. مطمئن باشین که نظرات شما برای تیم میکرولرن بسیار پراهمیت هست.

درباره ی مجتبی حکیمیان

کارشناس الکترونیک و کارشناس ارشد مخابرات سیستم | زمینه ی تحقیقاتی : پردازش تصویر و تعقیب اشیاء متحرک |‌فعال در حوزه ی الکترونیک مبتنی بر میکروکنترلر | برنامه نویس و طراح بردهای الکترونیکی مبتنی بر میکروکنترلر

۳۹ دیدگاه

  1. با عرض سلام و خسته نباشید

    مطلب کی پد تو سایت هیچ شباهتی با برنامه کی پد در فیلم نداره!!!

    اگه میشه یه توضیحی در مورد برنامه کی پد بدید.

    ممنون

  2. با سلام و خسته نباشید

    در برنامه شما زمانی که ما بخواهیم عددی را از روی کی پد انتخاب کنیم سون سگمنت ها باید صفر باشند.

    حالا اگر بخواهیم بدون صفر شدن سون سگمنت ها عددی را انتخاب کنیم باید چه کار کنیم؟؟

    یعنی زمانی که بخواهیم عددی را انتخاب کنیم اعداد روی سون سگمنت ها همان اعداد موقع استپ باشد.

  3. سلام.

    من پروژه رو شبیه سازی می کنم تقریبا ۲ ثانیه رو ۱ ثانیه نشون می ده . علت چیه ؟

  4. سلام و وقت بخیر
    من برنامه رو از طریق فیلم مشاهده کردم و بازنویسی کردم و در کدویژن کامپایل و هگز ایجاد شده رو در پروتئوس تست کردم و خیلی خوب هم جواب گرفتم ((به غیر از کلید استپ ک غیرعادی جواب میده))
    سپس همین برنامه رو در کامپایلر اتمل استودیو پیاده کردم ، اما جواب نمیده ، چی میتونه علتش باشه ؟؟؟ میتونم برنامه ای که در اتمل نوشته ام هم ارسال کنم >>>>سوالم اینه ک این برنامه براساس زبان سی هست و در اتمل فقط نوع نوشتار وقفه ها تفاوت داره و تفاوت های خاص دیگه ای هم نداره چون کتابخانه ای در این برنامه نیست ک تفاوت زیادی ایجاد کنه ، ممنون میشم کمک کنین …

    • سلام و عرض ادب
      بسیار عالیه که روحیه مهندسی قوی دارید و با کدها خودتون کار کردید. قاعدتا اگه اصول نوشتن برنامه به زبان سی رعایت شده باشه و طبق اتمل استدیو تنظیم شده باشه نباید مشکل خاصی در کد پیش بیاد. با این حال پیشنهاد میکنم یک بار دیگه دقیق و خط به خط کد منتقل شده به اتمل را بررسی کنید تا اشکالات احتمالی رفع بشه. اگه به نتیجه نرسیدید پیام بدید تا کدتون را بررسی کنم.

  5. سلام وقت بخیر دوستان اگه بخوایم تایمر فیکس باشه یعنی یه زمان مشخص داشته باشه و نیازی نباشه که هر بار تایم رو بهش بدیم چکار باید کرد ؟ممنون

  6. سلام
    من پروژه رو خریدم اما وقتی میزنم ران تو پروتئوس اصلا کیبورد رو اسکن نمیکنه
    یا بهتره بگم هر چی کلید میزنم هیچ عددی وارد نمیشه و همچنان صفر رو نشون میده

    • مشکل از کتابخانه پروتئوس بود (گیت منطقی رو نداشت)
      هر کاری هم کردم کتابخونش درست نشد با آموزش های که دیدم
      ممنون میشم راهنمایی کنید

  7. سلام این پروژه رو برد avr کار نمیکنه
    لطفا فیلم نصب رئی برد avr رو بزارین هر چه زودتر تا قبل از فردا

  8. سلام مهندس من دانشجو کامپیوترم و یکم تو الکترونیک مشکل دارم…فقط اینن قسمت رو اگه توضیح بدید ممنون میشم که از خازن ها برای چی اینجا استفاده میکنیم

    • سلام
      مهندسای برق و کامپیوتر دوستای خوبی برای هم هستن 🙂
      دو تا خازن در رنج پیکوفاراد رو که باید بین دو تا سر کریستال خارجی و زمین قرار داد.
      اون خازنی که بین پین وقفه ی خارجی و زمین قرار میگیره برای رفع نویز هست و باید حدود یک نانوفاراد باشه.

  9. سلام، ممنونم، نظر لطفتونه. متاسفانه بحث خوبی که شما کلید زدین بسیار طولانیه و در کامنت جا نمیشه واقعا.
    اول این که روش هایی که باهاشون فشرده شدن کلید رو چک میکنیم فقط به سرکشی ختم نمیشه. اتفاقا وقتی برنامه مفصل میشه دیگه سرکشی کردن به درد نمیخوره. روش های مختلفی برای این کار وجود داره: یکیش همین سرکشی هست که شما می فرمایین. روش دیگه استفاده از وقفه ی خارجیه. روش دیگه استفاده از تایمر واچ داگ هست. روش دیگه استفاده از مد capture تایمرها هست و … .
    دوم این که شما فرض کنید که یه میکروکنترلر دارین و تمام امکاناتش رو هم میدونین. کسی نمیاد به شما بگه برای انجام فلان کار از فلان امکانات استفاده کن. و واژه ی مهندس دقیقا همینجا خودش رو نشون میده. شما یه خروجی عملی مطلوب بده! حالا با استفاده از هرچیزی که دوست داری به شرط اینکه ایجاد باگ و مشکل نکنه. یعنی در کل خلاق باشیم. پس تعصب خاصی روی استفاده از روش خاصی نیست. در این مورد من از وقفه استفاده کردم تا بتونم طبق چیزی که توی ذهن دارم راحت تر ادامه ی برنامه م رو بنویسم. البته تمام جوانب رو هم در نظر گرفتم و در تست سخت افزاری هم بهش توجه کردم.
    سوم: حرف شما در مورد بانس کلید به هنگام رهاشدن کلید و ورود دوباره به وقفه درسته. ولی در مورد این پروژه رعایت نکردن این موضوع ایجاد مشکل نمیکنه و در تست سخت افزاری (همینطور که فیلمش توی سایت موجوده) هیچ باگ، کندی، لرزش و خاموشی در سون سگمنت ها و … ایجاد نشد و خیلی خوب جواب میده.
    چهارم: فرض کنیم در کاربردی باید حتما برنامه طوری نوشته بشه که کلید وقتی عمل کنه که کاربر دستش رو از روی اون برداره. در این صورت اگه با توجه به حرفتون از حلقه ی وایل و اون هم درون برنامه ی اصلی استفاده کنیم، آیا همین حلقه ی وایل وقتی کاربر دستش روی کلید مونده ایجاد اختلال و توقف در کل برنامه نمیکنه؟ پس در کل چه این حلقه ی وایل رو درون وقفه بنویسیم و چه درون برنامه ی اصلی ایجاد مشکل میکنه. فقط تفاوت در یه چیزه که در ادامه میگم.
    پنجم: وقتی که درون وقفه هستیم باید از ایجاد تاخیر پرهیز کنیم. البته فقط وقتی که وقفه های دیگه هم زیاد باشن و توجه به اون وقفه ها هم خیلی مهم باشه. چون وقتی درون زیرروال یک وقفه هستیم به وقفه های دیگه توجه نمیشه (به طور پیشفرض، وگرنه میشه کاری کرد که اینجور نباشه —> در موارد خاص و پیشرفته). در این پروژه چون تنها وقفه ی موجود دیگه، وقفه ی تایمر برای رفرش کردن سون سگمنت ها هست، بنده محاسبه کردم که در طول حضور در وقفه ی خارجی (چه در زدن کلید و چه در رهاشدن کلید) ایجاد مشکل نمیشه و به طور سخت افزاری هم تست کردم و مشکلی نبود (داخل فیلم هم پیداس). کلیدها رو هم کلیدهای حاضر در نظر گرفتم و ازشون استفاده کردم، چون قرار نیست به عهد باستان برگردیم. این حرفتون اصلا حرف جالبی نبود 😐
    ششم: این برنامه با توجه به شرایط موجود در این پروژه نوشته شده و کاملا بدون هیچ مشکلی به لحاظ عملی جواب میده، اما تاکیدی که وجود داشته این بوده که اگه شرایط تغییر کرد خیلی راحت بشه برنامه رو ادیت کرد. مثلا لرزشگیری نرم افزاری به سادگی حذف بشه و از سخت افزاری استفاده بشه و موارد دیگه ای که اینجا اصلا مطرح نشد.
    هفتم: به عنوان حرف آخر بگم که به طور کلی امکان برنامه نویسی برای رها شدن کلید در وقفه ی خارجی وجود نداره چون تا کاربر دستش رو برنداره از وقفه خارج نمیشیم. و این که حتی در این پروژه امکان لرزش گیری نرم افزاری در حالت سرکشی هم برای رها شدن کلید وجود نداره (پیشنهاد شما) چون تا وقتی کاربر دستش روی کلید هست کل برنامه مختل و متوقف میشه. اما در این پروژه امکان لرزش گیری نرم افزاری در وقفه ی خارجی در هنگام زدن کلید وجود داره.
    پ.ن : در ضمن کار با کلید فقط برای رها شدنش نیست و اتفاقا طرفدار زیادی هم نداره و کلا کاربرها از این شیوه ی فشردن کلید خوششون نمیاد، مگه این که مجبور باشیم ازش استفاده کنیم. در اکثر کاربردها کلید به هنگام زدن عمل میکنه و نه هنگام رها شدن. برای زدن کلید هم سرکشی و لرزشگیری تعریف میشه، فقط برای رها شدن کلید نیست.

    • سلام ممنونم از پاسختون و سایت خوبتون

      همه صحبتی که شما مطرح کردید درسته و من باهاش موافقم ولی در مورد این حرف “سوم: حرف شما در مورد بانس کلید به هنگام رهاشدن کلید و ورود دوباره به وقفه درسته. ولی در مورد این پروژه رعایت نکردن این موضوع ایجاد مشکل نمیکنه و در تست سخت افزاری (همینطور که فیلمش توی سایت موجوده) هیچ باگ، کندی، لرزش و خاموشی در سون سگمنت ها و … ایجاد نشد و خیلی خوب جواب میده.”،

      باید بگم که من دیدگاهم یه کم فرق داره. دوست دارم اصول برنامه نویسی رعایت بشه. مثلا اینجا هر جند که پروژه تو عمل داره جواب میده ولی چون امکان لرزش گیری نرم افزاری هنگام رها شدن نبود حداقل از وقفه خارجی استفاده نمی شد یا لرزش گیری سخت افزاری می شد. راستش من تازه کارم و دارم تازه یاد می گیرم . دوست دارم کدهای برنامه نویسی پیشرفته و اصولی رو یاد بگیرم.

      در مورد روش لرزش گیری با watchdog اگه امکان داره تو سایتتون مطلب بذارید؟ من کلا با این روش آشنایی ندارم.

      در مورد روش کپچر با تایمر منظورتون همون روش شمارش در وفقه تایمر هست؟ اگه نه میشه توضیح بدید؟

      در مورد عدم استفاده از تاخیر هم حرف شما صحیح است و من یه چیز باحال تو این مورد فهمیدم که می خوام با شما و دوستان به اشتراک بذارم. یکی از دلایل عدم استفاده از تاخیر چه تو وقفه چه تو بدنه اصلی تابع اون موقعی مطرح میشه که قراره برنامه چند تا سرویس بده. در این موقع هست که بزرگترین تاخیری که شما می تونید استفاده کنید باید کوچکتر از حداقل زمان سرویس دهی باشه. در غیر این صورت برخی از داده ها از بین می رند و دیگه نمیشه روی اون داده ها پردازش انجام بشه.

      در انتها هم ازتون صمیمانه سپاسگزارم بابت وقتی گه گذاشتید و پاسخ بنده رو داید و همچنین زحماتی که بابت تهیه این سایت دارید انجام میدید

      • سلام، خواهش می کنم
        دوست من این موضوعی که من گفتم هیچ ربطی به برنامه نویسی اصولی نداره. حتی با چیزی که من بیان کردم باز هم برنامه ی اصولی زیر سوال نمیره اصلا. توجه کنین که مسائل رو با هم قاطی نکنین.
        ما در مهندسی موضوعی داریم تحت عنوان trade off. در اکثر موارد شما بین دو تا موضوع می مونی و باید تصمیم بگیری که کدوم رو انتخاب کنی. انتخاب هرکدوم مزایا و عیوبی داره. ولی همیشه یه trade off یا به زبون عربی مصالحه ای وجود داره.
        استفاده از لرزش گیری نرم افزاری:
        —-> مزایا: عدم نیاز به قطعات سخت افزاری، قابل تنظیم بودن مدت زمان تاخیر، راحت تر بودن پیاده سازی
        —-> عیوب: در این مورد دوباره وارد شدن به وقفه بعد از رها شدن کلید، ایجاد تاخیرهایی که اجرای برنامه را کند می کنند.
        استفاده از لرزش گیری سخت افزاری:
        —-> مزایا: رها شدن از تاخیرهای ناخواسته در برنامه، در این مورد رفع شدن ورود دوباره به روال وقفه به هنگام رها شدن کلید
        —-> عیوب: نیاز به قطعات سخت افزاری، نیاز به فضای بیشتر بر روی برد، قابل تنظیم نبودن مدت تاخیر

        ما همیشه توی علوم مهندسی به همچین دوراهی هایی میرسیم که طبق نیازمون به لحاظ عملی و گاهی طبق سلیقه یکی رو انتخاب می کنیم. من لرزش گیری نرم افزاری رو انتخاب کردم. بازم تاکید می کنم که این کار هیچ ارتباطی با اصولی یا غیر اصولی کار کردن نداره.

        در مورد روش های دیگه ی پیمایش کلید هم بگم که در کامنت نمیگنجه و در صورتی که امکانش ایجاد شد پستی در این رابطه خواهم نوشت.
        ممنون

  10. سلام اول از همه تشکر می کنم بابت وقتی که گذاشتید
    یه اشکال جدی به این پست وارده و اونم اینه که متصل کردن کلید یا کیپد به وقفه خارجی منطقی نیست. کلا بحث پردازش کلید و لرزش گیری نرم افزاری هنگام استفاده از وقفه خارجی بی معنی هستش، چون در این صورت بحث سرکشی به کلید منتفیه. بهتره جایی که کاربر ما یک انسان هستش (سرعت انسان نسبت به سرعت اجرای برنامه در میکرو خیلی پایینه) از همون روش سرکشی میکرو در تابع اصلی برنامه یا در وقفه تایمر برای بررس کیپد استفاده می شد.
    البته در یه صورت میشه کلید رو توی وقفه خارجی لرزش گیری نرم افزای کرد و اونم این طوریه که از تاخیر استفاده کنیم و تا هنگامی که کاربر دستش رو از روی کلید برنداشته روند اجرای برنامه رو با استفاده از while متوقف کنیم که این کار اصلا از لحاظ برنامه نویسی تازه اونم تو سرویس روتین وقفه خارجی منطقی نیست.
    اما در حالتی که نوع کاربرد نیاز به استفاده از کلید رو روی وقفه خارجی توجیه پذیر می کنه (مثلا در اینجا بگیم که جنبه کار آموزشی بوده و ما برای مرور دروس گذشته از وقفه خارجی استفاده می کنیم) اونوقت اولا نمیشه لرزش گیری نرم افزاری کرد ثانیا باید حتما از لرزش گیری سخت افزاری استفاده کرد. اگه به نظر شما امکان لرزش گیری نرم افزاری با استفاده از وقفه خارجی هست لطفا مطرح کنید.

    با تشکر از شما و زحماتتون

    • سلام، ممنونم.
      احساس میکنم باید یه توضیح اولیه بدم که چرا برنامه رو این طور نوشتم:
      ۱- معتقدم که وقتی برنامه ای نوشته میشه نباید خاص همون پروژه باشه و باید قابلیت ارتقاءش وجود داشته باشه. مثلا میشه خیلی راحت از سرکشی استفاده کرد ولی اگه یه جای برنامه بعدا نیاز به تاخیر مثلا نیم ثانیه ای باشه همه چیز به هم میریزه. گاهی ممکنه حجم برنامه تون رو برای یه کاربرد بزرگتر کنید و زمان اجرای حلقه ی اصلی واقعا در حد چند ده میلی ثانیه شه و گاهی فشرده شدن سریع یک کلید بی جواب بمونه و مثالهای زیادی که میشه زد.
      ۲- با استفاده از وقفه ی خارجی دیگه نیاز نیست که با تایمر همیشه و هر لحظه به کیپد سرکشی کنیم یا هربار که حلقه ی اصلی تکرار شد بی جهت روند سرکشی رو انجام بدیم. بهتر اینه که مقدار کلید فقط وقتی خونده بشه که کلیدی زده شده باشه. در این صورت برنامه سریع تر و بهینه تره و سی پی یو آزادتر خواهد شد. و همچنین دیگه هیچ جای برنامه دغدغه ی سرکشی به کلید رو نداریم و میدونیم که وقتی کلیدی زده شد مقدارش توی یه متغیر باقی می مونه.
      ۳- حالا یه متغیر داریم حاوی مقدار کلید فشرده شده، که در هرجایی از برنامه که بخوایم میتونیم بهش دسترسی داشته باشیم، میتونیم مقادیری رو نخونیم و خیلی راحت فیلتر کنیم به نوعی خیلی خوب میتونیم اعمال شرط ها رو آسان و انعطاف پذیر کنیم.
      اما ایرادهای شما:
      شما میگین: «کلا بحث پردازش کلید و لرزش گیری نرم افزاری هنگام استفاده از وقفه خارجی بی معنی هستش، چون در این صورت بحث سرکشی به کلید منتفیه. » در جوابتون بگم که اتفاقا چون میخواستم بحث سرکشی منتفی باشه از وقفه استفاده کرده م. وقتی میشه خیلی راحت فقط هنگامی که کیپد فشرده میشه مقدارش رو خوند، چرا باید به دفعات وقت صرف بشه که آیا کلیدی زده شده یا نه؟!
      شما میگین: «بهتره جایی که کاربر ما یک انسان هستش (سرعت انسان نسبت به سرعت اجرای برنامه در میکرو خیلی پایینه) از همون روش سرکشی میکرو در تابع اصلی برنامه یا در وقفه تایمر برای بررس کیپد استفاده می شد.» این کلمه ی بهتر رو چرا به کار می برین و به چه دلیل؟ بله، وقتی کاربر انسانه میشه از سرکشی استفاده کرد. ولی کی گفته بهتره ؟ و چرا؟ من میگم نیاز رو برطرف میکنه ولی بهتر نیست. اتفاقا بهتر اینه که از سرکشی استفاده نکنیم که بی جهت سی پی یو مشغول نباشه. (فراموش نکنیم که به هنگام برنامه نوشتن بهینه نوشتن مهمه نه فقط نوشتنی که نیاز رو رفع کنه!)
      شما میگین: « در یه صورت میشه کلید رو توی وقفه خارجی لرزش گیری نرم افزای کرد و اونم این طوریه که از تاخیر استفاده کنیم و تا هنگامی که کاربر دستش رو از روی کلید برنداشته …» دلیلتون برای این حرف چیه؟ کی گفته در یه صورت میشه؟ من میگم در دو صورت میشه و صورت دومش همون کاریه که من کرده م. کلیدی زده میشه و در هنگام زدن کلید مقدارش هم خونده میشه و نیاز به برداشتن هم نیست. و اتفاقا خیلی هم خوب روی تست سخت افزاری جواب میده. بدون هیچ باگی.

      شما میگین: «اما در حالتی که نوع کاربرد نیاز به استفاده از کلید رو روی وقفه خارجی توجیه پذیر می کنه … اونوقت اولا نمیشه لرزش گیری نرم افزاری کرد ثانیا باید حتما از لرزش گیری سخت افزاری استفاده کرد.» این شدن یا نشدن رو به چه دلیل مطرح میکنید؟ شما وقتی میگی نمیشه یعنی عملی نیست و ممکن نمیشه. اما من انجامش داده م و شد. پس میشه. من متوجه منظور شما هستم. شما می فرمایید ممکنه لرزش چندین وقفه ایجاد کنه. ولی یه سوال: وقتی لرزش اتفاق بیفته یعنی چی؟ یعنی کلیدی فشرده شده و با لرزش گیری نرم افزاری خیلی راحت مقدار کلید خونده میشه. توجه کنید که نویز خارجی نمیتونه در حکم لرزش باشه (چون اندازه و مدت زمان مانایی نویز اصلا شبیه لرزش نیست و نمیتونه در کاربرد کیپد به جای کیپد اختلال ایجاد کنه) من اگه توی وقفه تاخیر ۱۵ میلی ثانیه ای میدم مگه همین تاخیر توی سرکشی هم اتفاق نمیفته؟ پس در این کاربرد فرقی وجود نداره. بله، استفاده از لرزش گیری سخت افزاری برای کاربردهایی که وقفه های دیگه هم زیادن، یا مثلا جایی که تاخیرهای لرزش گیری دردسرساز باشن، بهتره. ولی عیوبش هم فراموش نشه: هزینه، جایی که روی برد اشغال میکنه و غیرقابل تغییر بودنش با تغییر شرایط. حرف شما اینه که نمیشه از لرزش گیری نرم افزاری استفاده کرد؟ چرا؟ نشدی در این کاربرد در کار نیست.
      منتظر دلایلتون هستم. ممنون.

      • سلام اول تشکر می کنم از پاسخی که دادید و سایت خوبتون

        همه صحبتی که شما مطرح کردید درسته و من باهاش موافقم جز مرحله آخر یعنی وقتی که کاربر دستش رو از روی کلید برمیداره.
        سوال اصلی: آیا می توان کلید را هنگام استفاده از وقفه خارجی لرزش گیری نرم افزاری کرد. چرا؟
        جواب – خیر. کلید رو دو لحظه باید لرزش گیری کرد یکی هنگام فشرده شدن و یکی هنگام رها شدن.
        حال من داستان رو از اول تعریف می کنم. فرض کنیم من می خوام با تاخیر در سرویس روتین وقفه خارجی کلید رو لرزش گیری کنم.
        کاربر کلید رو فشار می ده. سرویس روتین وقفه اجرا می شه و من با تاخیر چند میلی ثانیه ای لرزش رو می گیرم و تا اینجا همه چی درسته (هر چند که با استفاده از تاخیر تو وقفه خارجی مخالفم ولی چون فعلا دلیل قطعی برای این حرف ندارم و فقط در حد شنیدن هستش، قبول می کنم). حالا کاربر دستش رو از روی کلید بر می داره و باز باید لرزش گیری با تاخیر انجام بشه. من می خوام چه جوری متوجه بشم که کاربر دستش رو از رو کلید برداشته؟ تنها راه ممکن اینه که من بیام با یه while روند اجرای برنامه رو متوقف کنم و صبر کنم تا کاربر دستش رو از روی کلید برداره و وقتی برداشت حالا از تاخیر استفاده کنم. که این روش به شدت از لحاظ اصول برنامه نویسی و سرویس دهی به برنامه درست نیست (اومدیم و کاربر دستش رو از روی کلید برنداشت).
        اگه هم نخوام با while روند اجرای برنامه رو متوقف کنم خوب اجرای برنامه از سرویس روتین وقفه خارج میشه و چون کلید هنوز لرزش داره (فرض کنید یه کلید اهل باستان هستش که تا ۴۰ میلی ثانیه لرزش داره) پس مجددا سرویس روتنن وقفه اجرا می شه.

        لرزش گیری نرم افزاری بر اساس سرکش (polling) هستش و چرایی اون هم دقیقا برای همین فهمیدن رها شدن کلید و پردازش کلید تو اون لحظه هست. به عنوان یه حرف کلی باید بگم که لرزش گیری نرم افزاری کلید = سرکشی کردن به کلید.

        اگه به نظر شما امکان لرزش گیری نرم افزاری با استفاده از وقفه خارجی برای هنگامی که کلید رها میشه هست لطفا مطرح کنید.

        در انتها هم ازتون تشکر می کنم بابت زحماتتون

  11. البته من فیوز بیتا رو رو کریستال خارجی تنظیم کردم
    که ۱۲مگه

    • سلام به ایمیلتون سر بزنین. ممکنه علت تابع خوندن از کیپد باشه. این تابع میتونه ایجاد باگ کنه. هرچند برای کار خودم جواب داد. برای همین یه تابع دیگه برای خوندن کیپد نوشتم و براتون ایمیل زدم.

  12. بله ماله شماس

  13. سلام
    منم مشابه همین پروژه رو ساختم
    اما از روی کیپد هر دکمه ای زده میشه خروجی ۷یا ۸یا ۹
    مشکل کارم کجاست؟

    • سلام بر شما
      برنامه ای که استفاده کردی دقیقا برنامه ی من بوده؟ یا از برنامه ی دیگه ای استفاده کردی؟

  14. سلام خسته نباشید
    میخوام وقتی تایمر استارت میشه دو عدد لامپ ۲۲۰ ولت روشن بشه
    میشه راهنماییم کنید ؟؟؟

    • سلام
      ممنونم
      حتما، به لحاظ سخت افزاری شما می تونید با تعریف کردن یکی از پایه های پورت ها مثلا PORTD.0 به عنوان خروجی و وصل کردن اون به یک ترانزیستور این کار رو انجام بدی. به این صورت که با ترانزیستور یه رله رو فعال می کنی تا دو تا لامپ ۲۲۰ ولتی متصل بهش رو روشن کنه. برای آشنایی با نحوه ی اتصال یک رله به میکروکنترلر به این لینک مراجعه کنید: http://microlearn.ir/1616/relay.html

      اما به لحاظ نرم افزاری، در برنامه ای که نوشته م (هم در فیلم توضیحاتش رو گفته م و هم برای دانلود در اختیارتون هست) در ابتدای تابع main پورت PORTD.0 رو به عنوان خروجی تعیین کنید. بعد از اون در ابتدای تابع countdown این پایه رو یک کرده و در انتهای تابع countdown همین پایه رو صفر کنید. با این کار با آغاز شمارش لامپ ها روشن و با اتمام شمارش لامپ ها خاموش می شن.

      اگه هم میخواید که کنترل دو تا لامپ رو به صورت جداگانه در اختیار داشته باشید که باید از دو تا پایه استفاده کنید و دو تا ترانزیستور و همچنین دو تا رله. برنامه رو هم برای دو تا پایه تغییر بدین.
      در صورتی که براتون سوالی باقی مونده، مخلصانه در خدمتم 🙂 .

      • خیلی ممنون بابت پاسخ

      • آقا من میخوام دو تا لامپ رو واسه همیشه همینطور گفتم با تایمر در زمان مشخص روشن کنم و …
        بنظر شما استفاده از میکرو at mega 8 مشکلی داره (میخوام تو خونه این مدارو استفاده کنم و با توجه به نویز و.. میگم )

        • انتخاب میکرو بستگی به نیازتون داره.
          – اول نیاز سخت افزاری. یعنی اینکه آیا اجزای داخلی ای که برای میکرو میخواین رو مدل مورد نظرتون دارا هست یا نه؟ مثلا شما باید از تایمرهای داخلی AVR استفاده کنید. باید ببینید امکاناتی که در تایمرهای Atmega8 در اختیارتون قرار گرفته کار شما رو راه میندازه یا نه؟ همچنین باید ببینید به لحاظ تعداد پایه به مشکلی برنخورید. مثلا شما سون سگمنت نیاز دارید و سوییچ و خروجی و … باید ببینید که مبادا پایه کم بیارید.
          – دوم نیاز نرم افزاریه. یعنی یه موقع شما به لحاظ سخت افزار مشکلی با mega8 نداری ولی چون برنامه ای که مینویسی مفصل میشه و حجمش بالاتر از ۸ کیلوبایت میشه، دیگه نمیتونی از mega8 استفاده کنی.
          البته به طور کلی به نظر میرسه که با کاری که شما قصد دارین انجام بدین مشکلی وجود نداشته باشه.
          به لحاظ نویز هم چون توی خونه دارین ازش استفاده میکنید مشکلی نیست. فقط در مورد تکنیک های نویززدایی در میکروکنترلر AVR مطالعه کنید و اونها رو رعایت کنید که خیالتون راحت باشه.

  15. محمدرضا قلی پور

    باسلام و تشکر بابت آموزشی ک گذاشتید
    درقسمت “پیاده سازی سخت افزار” نام پورتها بدرستی ذکر نشده
    مثلا پورت مربوط به مالتی پلکس سگمنتها پورت B است ک D ذکر کردید

    • سلام، ممنون
      از این که نظرتون رو به ما منعکس می کنین متشکرم
      فقط من درست متوجه منظورتون نشدم. در تب «پیاده سازی سخت افزاری» فقط یک ویدیوی حدودا ۳ دقیقه ای موجوده که در اون ویدیو هم حرفی از پورت زده نمیشه. میشه بگین دقیقا کجا رو می فرمایین؟

      • محمدرضا قلی پور

        دقیقا در انتهای خط دوم توضیحات مربوط فیلمی میفرمایید اشتباها بجای پورت B پورت D ذکر شده است

  16. سلام
    برای سون سگمنت مالتی پلکس چه روش هایی وجود داره؟ آیا تنها روش همین روشیه که شما استفاده کردین؟

    • سلام
      دو روش برای مالتی پلکس سون سگمنت وجود داره:
      ۱) استفاده از دستور delay
      ۲) استفاده از وقفه ی تایمر

      در روش اول برای انجام مالتی پلکس، یه تابع تعریف می کنیم که در اون تابع سون سگمنت فعال جابجا میشه. و بین فراخوانی های متوالی این تابع از دستور delay استفاده میشه. عیب این روش اینه که در طول اجرای دستور delay هیچ کار دیگه ای نمیشه انجام داد و بقیه ی عملیات ها مختل می مونن. ولی برای برنامه هایی که سنگین نیستند و وظایف زیاد دیگه ای رو بر عهده ندارن کارآمد هست.
      در روش دوم انجام تاخیر رو برعهده ی تایمر داخلی میذاریم و در طول ایجاد تاخیر، میکروکنترلر به دیگر وظایفش هم میرسه. وقتی که تایمر وقفه داد برنامه وارد روال وقفه میشه و سون سگمنت فعال رو جابجا میکنه. البته باید توجه کرد که زمان ایجاد وقفه خیلی کم نباشه (مثلا هر ۱۰۰ میکروثانیه نباشه) و دستورات داخل زیرروال وقفه هم در حد امکان کم و سریع باشن، تا میکرو در کنار مالتی پلکس کردن سون سگمنتها به وظایف دیگه شم برسه.

      در این پروژه از روش دوم استفاده شده.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *