الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

با سلام و عرض ادب خدمت هموطنان عزیز
در این سایت قصد داریم موضوعاتی که در حیطه الکترونیک ،مکانیک و برنامه نویسی ربات ها دارای جذابیت خاصی می باشد رو آموزش بدیم. امیدواریم که با نظرات شما عزیزان شاهد آموزشهای جامعی در این زمینه باشیم.
با تشکر

نویسندگان
پیوندهای روزانه
طبقه بندی موضوعی
آخرین نظرات

سه شنبه, ۲۲ دی ۱۳۹۴، ۰۷:۰۳ ق.ظ

۰

جلسه یازدهم


1- سلام خوبی
2- سلام ممنون
1- خوب امروز می خای چه مبحثی رو شروع کنی
2- امروز می خام در مورد کانتر یا همون شمارنده بگم
1- حالا این کانتر چکار می کنه؟
2- کانتر پالس ها رو میشماره مثلا شما می خای یک پاسی رو که از یک جا تولید شده رو بشماری از کانتر استفاده می کنی کانتر یعنی شمارنده .
1- کاربردش چیه؟
2- اولین کاربردی که به ذهن من میرسه فرکانس متر هستش . به این صورت که ما مقدار پالس هایی که در مدت زمان یک ثانیه تولید میشه رو اندازه گیری می کنیم بعد روی LCD نمایش می دیم
1- پس می تونیم مثلا از این کانتر در خط تولید یک کارخانه هم استفاده کنیم که تولیدات یک خط تولید رو بشماره
2- اره میشه ولی وقتی که با دستور INCR می تونی این کار رو بکنی چرا با کانتر این کار رو انجام بدی
1- راست میگی یا . گفتی که یکی از کاربرداش فرکانس متر هستش میشه یکم بیشتر توضیح بدی
2- تعریف فرکانس تعداد پالس هایی که در مدت زمان یک ثانیه تولید میشه هستش . یعنی اگه ما بتونیم تعداد پالس هایی روکه در مدت زمان یک ثانیه تولید میشه رو اندازه گیری کنیم میشه گفت که فرکانس متر درست کردیم . به طور کلی برای این کار میایم کانتر و تایمر رو همزمان با هم راه اندازی می کنیم تایمر رو روی یک ثانیه می زاریم که هر یک ثانیه بره و مقدار کانتر رو بخونه و روی LCD نمایش بده به این صورت که ما پالس ها رو به پایه کانتر می دیم این پالس ها در مدت زمان یک ثانیه توسط کانتر شمرده می شه . بعد از یک ثانیه تایمر و کانتر STOP میشن و مقدار کانتر در مدت زمان یک ثانیه روی ال سی دی نمایش می دیم .
من اینجا نحوه کار با کانتر یک رو برات می گم :
پالس هایی رو که ما می خاهیم توسط کانتر یک بشماریم رو باید به پایه T1 بدیم .
یک نکته مهم این که کانتر یک با 65535 تا پر میشه و با 65536 تا سرریز میشه یا به عبارتی صفر میشه . به زبان ساده تر اگه ما به پایه T1 که مربوط به کانتر یک هستش 65535 تا پالس بدیم کانتر پر میشه و اگه 65536 تا پالس بدیم کانتر سرریز میشه و دوباره از صفر شروع میشه.
2- خوب حالا بریم سر دستورات و پیکره بندی کانتر ( counterSad ما در اینجا از تایمر یک به عنوان کانتر استفاده کرده ایم
Config Timer1 = Counter , Edge = Rising
Config Timer1 = Counter : ما در این جا به میکرو دستور دادیم که می خواهیم از تایمر یک به عنوان کانتر استفاده کنیم
, Edge = Rising : ما در این جا به میکرو دستور دادیم که می خواهیم لبه بالا رونده رو بشماریم . اگه خواسته باشیم که لبه پایین رونده رو بشماریم به جای RISING می نویسم FALLING

ENABLE INTERUPTS : این دستور رو هر بار که از تایمر کانتر میکرو استفاده می کنی باید بنویسی با این کار وقفه ها رو فعال می کنیم
ENABLE COUNTER1 : با این دستور کانتر یک رو فعال کردیم که همیشه باید بنویسیش .
ON COUNTER1 SHOW : با این دستور به میکرو دستور می دیم که هر وقت که وقفه کانتر 1 خورد برو توی زیربرنامه SHOW یا به عبارت دیگه با این دستور به میکرو دستور می دیم که هر وقت کانتر سرریز شد ( با همان مقدار 65536 تا ) برو توی زیر برنامه SHOW
COUNTER1= X : با این دستور می تونیم به کانتر یک مقدار بدیم و یعنی به جای X عدد بزاریم مثلا COUNTER = 65530 با این کار ما کانتر یک رو با مقدار 65530 تا پر کردیم و کانتر از این مقدار شروع به شمردن می کند یعنی اگه یک پالس به پایه T1 بدم مقدار کانتر میشه 65531 اگه 6 تا پالس به پایه T1 بدیم کانتر سرریز می کنه و صفر میشه .
STOP TIMER1 : با این دستور می تونیم عملیات شمردن کانتر رو متوقف کنیم . توجه کن که اگه با این دستور عملیات شمردن کانتر رو متوقف کنیم مقدار کانتر صفر نمی شه بلکه روی همون مقداری که تا الان شمرده استپ می شه .
START TIMER1 : این دستور عکس STOP TIMER1 هستش یعنی هر جا که ما عملیات شمارش رو توسط دستورSTOP TIMER1 متوقف کرده باشیم با دستور START TIMER1 می تونیم شمردن رو اغاز کنیم .

بزار یک مثال بزنم که بهتر بفهمی :
برنامه زیر به ازای هر پالسی که به پایه T1 میکروکنترلر می خوره یک متغییر رو یک واحد اضافه می کنه

کد:
Config Timer1 = Counter , Edge = Rising
Enable Interrupts
Enable Counter1
On Counter1 Show
Counter1 = 65535
Dim A As WORD
Do
Loop
End
SHOW:
Counter1 = 65535
Incr A
Cls : Lcd A
Return


حالا تحلیل برنامه :
در خط اول ما تایمر یک رو در مد کانتر پیکره بندی کردیم یعنی به میکرو گفتیم که از تایمر یک می خواهیم به عنوان کانتر (شمارنده) استفاده کنیم و در ادامه همین خط نوشتیم Edge = Rising که با این دستور به میکرو فهموندیم که لبه بالا رونده رو می خایم بشماریم اگه ما به جای RISING می نوشتیم FALLING میکرو فقط لبه پایین رونده پالس رو میشمرد .
خط دوم Enable Interrupts : که با این دستور وقفه سراسری رو فعال می کنیم این دستور رو هر وقت که از کانتر یا تایمر استفاده می کنی باید بزاری .
خط سوم Enable Counter1 : با این دستور کانتریک رو فعال می کنیم این دستور رو هم هر وقت که از کانتر استفاده می کنی باید بنویسی.
خط چهارم On Counter1 Show2 : با این دستور به میکرو دستور می دیم که هر وقت کانتر سرریز شد ( با همان مقدار 65536 تا ) بپر برو توی زیر برنامه SHOW ( SHOW اسم زیربرنامه است که هر اسم دلخواه دیگر می تواند باشد مثلا AHMAD ).
خط پنجم Counter1 = 65535 : به کانتریک مقدار 65535 دادیم یعنی کانتر از ادامه این عدد شروع به شمردن می کند به جای این عدد هر عدد دخواه دیگر هم می توانیم بدهیم.
خط ششم Dim A As WORD: ما با این دستور یک متغییر به اسم A و از نوع WORD تعریف کردیم که در ادامه می گم که چه کاری رو انجام میده.
خط هفتم DO : با نوشتن این دستور ابتدای حلقه رو مشخص کردیم.
خط هشتم LOOP : با این دستور انتهای حلقه رو مشخص کردیم.
خط نهم END : این دستور یعنی انتهای برنامه که برنامه هیچ وقت به این دستور نمی رسه .
خط دهم SHOW : در اینجا یک زیر برنامه به اسم SHOW تعریف کردیم که داخل این زیر برنامه دستورات زیر نوشته شده :
خط یازدهم Counter1 = 65535 : اولین دستور داخل زیربرنامه SHOW است که در این جا به کانتریک مقدار 65535 دادیم یعنی کانتر از ادامه این عدد شروع به شمردن می کند به جای این عدد هر عدد دخواه دیگر هم می توانیم بدهیم.
خط دوازدهم INCR A : دومین دستور داخل زیر برنامه SHOW است که وقتی میکرو این خط رو می خونه مقدار متغییر A رو یک واحد اضافه میکنه.
خط سیزدهم Cls : Lcd A : سومین دستور داخل زیربرنامه SHOW است که با این دستور میکرو مقدار متغییر A رو روی LCD نمایش می ده .
خط چهاردهم RETURN : چهارمین دستور داخل زیربرنامه SHOW است که با این دستور میکرو بر می گرده اول برنامه .

تحلیل دوم :
برنامه از ابتدا توسط میکرو خونده میشه :
خط اول ما اومدیم تایمر یک رو در مد کانتر استفاده کردیم
خط دوم Enable Interrupts : ما در این جا وقفه سراسری رو فعال کردیم توجه کن که هر وقت از تایمر یا کانتر استفاده می کنی این دستور رو حتما بنویسی تا وقفه سراسری فعال بشه.
خط سوم Enable Counter1 : با این دستور میکرو کانتر یک رو فعال می کنه و میره سر خط بعدی
خط چهارم On Counter1 Show : میکرو این دستور رو می خونه ولی فعلا تا زمانی این دستور رو اجرا نمی کنه یعنی به زیر برنامه SHOW پرش نمی کنه تا زمانی که وقتش برسه
1- وقتش چه وقت می رسه
2- هر وقت که کانتر یک با مقدار 65536 تا سرریز کنه بدون درنگ این دستور توسط میکرو خونده و میپره توی زیر برنامه SHOW
خط پنجم Counter1 = 65535 : با این دستور میکرو میکرو کانتر یک رو تا مقدار 65535 تا پر می کنه . این دستور مثل این هستش که ما 65535 تا پالس به پایه T1 میکرو داده باشیم و کانتر هم به اندازه همین مقدار پر شده باشه.
خط ششم DIM A AS WORD : میکرو وقتی که به این خط از برنامه می رسه می فهمه که ما یک متغییر از نوع WORD به اسم A انتخاب کرده ایم و میره خط بعدی رو می خونه .
توی خط هفتم و هشتم ما یک حلقه DO - LOOP گذاشتیم میکرو به محض این که این دستور رو میخونه میوفته توی این حلقه و از این حلقه بیرون نمیاد . خوب حالا رسیدیم به قسمت جذاب ماجرا. توی این گیروداری که میکروی بیچاره افتاده توی حلقه ما تنها کمکی که به این میکروی بیچاره میتونیم بکنیم اینه که یک پالس ناقابل بدیم به پایه T1 میکرو .
1- خوب چه اتفاقی میوفته
2- اها یادت میاد که ما مقدار کانتر رو تا 65535 تا پر کردیم و بهتم گفتم که مقدار کانتر اگه به 65536 تا برسه کانتر سرریز میشه و از اونجایی هم که ما توسط دستور On Counter1 Show به میکرو دستور دادیم که اگه سرریز کردی بپر برو و توی زیر برنامه SHOW
1- خوب اره چه ربطی داره ؟
2- ربطش به اینه که ما با دادن یک پالس به پایه T1 یک واحد به مقدار کانتر یک اضافه کردیم یعنی 65535 + 1 = 65536 فهمیدی حالا
1- اها حالا فهمیدم
2- پس بزار بقیه ماجرا رو بگم. بعد ازا ین که ما با دادن یک پالس به پایه T1 مقدار کانتر رو به 65536 رسوندیم طبیعتا کانتر سرریز میشه و چون قبلا بهش دستور داده بودیم که اگه کانتر سرریز شد بپر توی زیر برنامه SHOW میکرو هم بدون استخاره میپره میره توی زیر برنامه SHOW و دستوراتی رو که ما داخل زیربرنامه SHOW نوشتیم رو اجرا میکنه . حالا فرض رو بر این میزاریم که ما یک پالس به پایه T1 دادیم و میکرو سرریز شده و پریده توی زیربرنام SHOW و بحث رو از اونجا دوباره پی میگیرم.
بعد از این که میکرو پرید توی زیربرنامه SHOW میاد دستورات داخل این زیربرنامه رو اجرا میکنه به ترتیب زیر :
اولین دستور داخل زیربرنامه SHOW هست Counter1 = 65535 : چون که کانتر یک قبلا سرریز شده و مقدارش صفر شده ما باید دوباره بیایم مقدار کانتر یک رو برگردونیم به حالت قبل یعنی 65535 .
دومین دستور داخل زیربرنامه SHOW هست INCR A یعنی یک واحد به مقدار متغییر A اضافه کن .
سومین دستور داخل زیر برنامه SHOW هست CLS:LCD A به این معنی که مقدار متغیر A رو روی LCD نمایش بده
چهارمین یا به عبارت دیگه اخرین دستور داخل زیربرنامه SHOW هست REUTURN که با این دستور میکرو دوباره میره توی زیر برنامه SHOW و دوباره منتظر یک پالس دیگه میمونه تا دوباره سرریز بشه و دوباره بپره بره توی زیربرنامه SHOW و دستورات زیربرنامه SHOW رو دوباره اجرا کنه.
1- یک سوال اگه ما خواستیم که کانتر به جای این که به ازای هر یک پالس بپره توی زیربرنامه SHOW بیاد و به ازای هر دوتا پالس این عمل رو انجام بده باید چه کار کنیم ؟
2- برای این کار ما باید یک کاری انجام بدیم که مقدار کانتر به ازای هر دوتا پالس سرریز بشه یعنی بعد از این که دوتا پالس به پایه T1 خورد سرریز بشه . پس باید به جای Counter1 = 65535 بنویسیم Counter1 = 65534 یعنی ما مقدار کانتر رو با 65534 تا پر کردیم و برای سرریز شدن کانتر تا 65536 به دو تا پالس نیاز داریم . اینطوری پالس اولی که به پایه T1 بخوره مقدار کانتر یک واحد افزایش پیدا می کنه و از 65534 میرسه به 65535 و هیچ اتفاق خاصی نمیوفته ولی با دادن پالس دومی مقدار کانتر یک واحد دیگه افزایش پیدا می کنه یعنی از 65535 میرسه به 65536 و اینجاست که کانتر سر ریز میکنه و میپره توی زیربرنامه SHOW
1- یک سوال دیگه از کجا بفهمیم که پایه T1 میکرو کجاست ؟
2- از روی دیتاشیت یا برگه مشخصات میکرو یک کار دیگه هم می تونی انجام بدی و اون این که بری توی سایت http://www.atmel.com و اونجا می تونی برگه مشخصات اون نوع میکرویی که باهاش کار می کنی رو دانلود کنی.
1- بازم سوال چرا توی از دستور Counter1 = 65535 دوبار توی برنامه استفاده کردی
2- ببین وقتی که ما تغذیه میکرو رو وصل می کنیم میکروکنترلر یک بار برنامه رو از اول شروع میکنه به خوندن و برای اولین بار دستور Counter1 = 65535 رو که ما در خط پنجم نوشتیم رو می خونه و با این دستور کانتر رو با مقدار 65535 تا پر می کنه و بعدش می یوفته توی حلقه DO-LOOP بعدش اونقدر توی این حلقه می مونه تا ما یک پالس به پایه T1 بدیم تا این که سرریز بشه و بره توی زیر برنامه SHOW . حالا بیا فرض رو بر این بزاریم که ما دستور Counter1 = 65535 رو در خط یازدهم ننوشته باشیم . خوب اگه ما این دستور رو درخط یازدهم ننویسیم میکرو میاد و تمام دستورات داخل زیربرنامه رو انجام می ده و با دستور RETURN که ما در اخر برنامه نوشته بودیم برمی گرده میره تو حلقه DO-LOOP و از اونجایی که کانتر یک بار سرریز شده یعنی مقدارش صفر شده دیگه با پالس بعدی نمیره توی زیر برنامه چون الان مقدار کانتر صفر هستش و ما باید 65536 تا پالس به پایه T1 بدیم تا بره توی زیر برنامه . حالا ما برای جلوگیری از این کار اومدیم دوبار دستور Counter1 = 65535 رو نوشتیم تا هر بار که دستورات زیر برنامه رو انجام داد مقدار کانتر رو برگردونه به 65535 و دوباره اماده یک پالس بعدی باشه .
پایان

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی