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

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

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

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

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

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

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

دوشنبه, ۲۱ دی ۱۳۹۴، ۰۸:۲۶ ق.ظ

۰

جلسه دهم

1- سلام خوبی
2- سلام ای بد نیستیم تو خوبی
1- قربانت . امروز چه مبحثی رو می خای بگی
2- دستور ROTATE رو اول می گم بعد می ریم سر بحث شیرین تایمر کانتر
1- برو که رفتیم
2- دستور ROTATE : توسط این دستور می شه بیت ها رو به سمت چپ یا راست ببری که کاربرد زیادی هم داره مثلا در کنترل استپ موتور . بزار یک مثال بهت بگم تا به اهمیت این دستور پی ببری
فرض کن که هشتا LED داری و می خای اولی روشن بشه بعد از چند ثانیه خاموش بشه و همزمان با خاموش شدنش دومین LED روشن بشه بعد از چند ثانیه خاموش بشه همزمان با خاموش شدنش LED سوم روشن بشه و الی اخر تا این که LED هشتم روشن بشه و چند ثانیه روشن بمونه و خاموش بشه و از دوباره LED اول روشن بشه و این ریتم از دوباره تکرار بشه . خوب اگه ما بخایم این کار رو انجام بدیم باید از برنامه زیر استفاده کنیم در برنامه زیر LED ها به پورت A متصل شده اند

کد:
Config Porta = Output
Do
Set Porta.0
Waitms 25
Reset Porta.0
Set Porta.1
Waitms 25
Reset Porta.1
Set Porta.2
Waitms 25
Reset Porta.2
Set Porta.3
Waitms 25
Reset Porta.3
Set Porta.4
Waitms 25
Reset Porta.4
Set Porta.5
Waitms 25
Reset Porta.5
Set Porta.6
Waitms 25
Reset Porta.6
Set Porta.7
Waitms 25
Reset Porta.7
Loop
End

برنامه بالا کار می کنه ولی از نظر من غلط هستش چون که ما با دستور ROTATE می تونیم این کار رو خیلی راحتر انجام بدیم و نیاز به نوشتن این همه دستور نیست به مثال زیر توجه کن

کد:
Config Porta = Output
Dim B As Byte
B = &B10000000
Do
Rotate B , Right
Porta = B
Waitms 100
Loop
End

برنامه بالا همون کار برنامه قبلی رو انجام می ده می بینی که چقدر دستورات کم شد البته من فقط یک مثال زدم که باید در مورد ستور هم بهت بگم که چی به چیه. گفتیم که یک بایت تشکیل شده است از هشت بیت .ما در این برنامه یک متغییر به اسم B و از نوع بایت تعریف کردیم . این بیت ها رو می تونیم به یک پورت هم ارتباط بدیم. حالا بزار بریم سر برنامه بهت می گم که چه اتفاقی افتاده .
خط اول ما اومدیم پورت A رو به عنوان خروجی تعریف کردیم
خط دوم اومدیم یک متغییر از نوع بایت و به اسم B تعریف کردیم
خط سوم با دستور B = &B10000000 کد باینری برای متغییر B انتخاب کردیم اگه توجه کنی متوجه میشی که این عدد یک عدد هشت رقمی است یعنی هشت بیتی هستش اون یکی که اول نوشته شده همون منطق یک دیجیتال و اون صفرهایی که نوشته شده همون منطق صفر دیجیتال هستش . این دستور یک نوع مقدار دهی به متغییر هستش. توضیحات این دستور هنوز ادامه داره که در ادامه توضیح میدم.
خط بعدی با دستور DO اومدی و ابتدای حلقه رو مشخص کردیم
خط بعدی با دستور ROTATE B , RIGHT به میکرو دستور دادیم که بیت های متغییر B رو که در خط قبل توضیح دادیم یک گام به سمت راست جلوتر ببر یعنی میشه 01000000 اگه توجه کنی متوجه می شی که عدد یک 1 یک گام جلو تر رفته البته صفرها هم جلوتر می رن ولی هیچ بیتی خارج نمی شه و اگه به اخر برسه دوباره دور می زنه و میاد اول قرار می گیره.
خط بعد با دستور PORTA = B به میکرو فرمان دادیم که مقدار بیت های متغییر B رو روی پایه های پورت A بار گذاری کن . حتما از خود می پرسی که یعنی چی . خوب الان من بهت می گم یعنی چی . همونطور که می دونی هر پورت هشت پایه داره و هر متغییر از نوع بایت هم هشت بیت داره ما اومدیم با این دستوری که نوشتیم به ترتیب بیت ها رو روی پایه های A.0 تا A.7 بار گذاری کردیم در اینجا عدد باینری ما هستش 01000000 پس پایه A.0 میشه 0 پایه A.1 میشه 1 پایه A.2 میشه 0 پایه A.3 میشه 0 و الی اخر که بقیه پایه ها هم صفر هستش چون ادامه عدد باینری صفر هستش صفر در اینجا به معنی خاموش بودن پایه مورد نظر و یک در اینجا به معنی روشن شدن پایه مورد نظر است . پس تا اینجا پایه A.1 ما 1 هستش یعنی روشن هستش پس اون LED ی که به پایه A.1 وصل هستش باید روشن بشه و تمام LED های دیگه خاموش باشه.
خط بعدی با دستور WAITMS 100 یک تاخیر صد میلی ثانیه ای در اجرای برنامه ایچاد کردیم که با تغییر این عدد می تونی سرعت روشن روشن و خاموش بودن LED ها رو تغییر بدی.
خط بعدی با دستور LOOP انتهای حلقه رو مشخص کردیم که میکروکنترلر وقتی به این دستور می رسه بر می گرده و از خط بعدی DO شروع می کنه به خوندن مجدد دستورات .
خط بعدی نوشتیم END که برنامه هیچ زمان به END نمی رسه .
گفتیم که برنامه وقتی به LOOP رسید بر می گرده می ره خط بعدی DO رو می خونه خط بعدی DO هستش Rotate B , Right به محض این که این دستور توسط میکرو خونده شد بیت ها دوباره یک واحد به سمت راست هدایت می شوند حالا قبلا بیتها بودن 01000000 که بعد از خونده شدن دستور
Rotate B , Right یک واحد به سمت راست هدایت می شن یعنی 00100000 اگه توجه کنی می بینی که این دفعه بیت سوم از سمت چپ یعنی 1 جلوتر رفت اونم به سمت راست
خط بعدی PORTA = B هستش که قبلا توضیح شو دادم به این معنی هستش که مقدار فعلی بیت ها رو روی پورت A بارگذاری کن به محض خونده شدن این دستور میکرو مییاد این بیت ها رو به ترتیب از سمت چپ روی پورت A بار گذاری می کنه این دفعه بیت سوم از سمت چپ شده 1 و بیت دوم از سمت چپ که در دفعه قبل 1 بوده شده صفر پس پایه A.1 که قبلا یک بوده یعنی روشن بوده میشه صفر و پایه A.2 که قبلا صفر بوده حالا میشه یک و LED ی که بهش وصل هستش روشن میشه
1- همین جا وایستا که یک سوال دارم چه اتفاقی افتاد که بیتی که قبلا یک بوده شد صفر و بیتی که قبلا صفر بود شده یک
2- به دلیل همون دستور Rotate B , Right که نوشتیم بوده . ببین ما با این فرمان به میکرو دستور دادیم که بیت ها رو یک واحد به سمت راست هدایت کن و از اونجایی هم که گفتیم بیت ها خارج نمیشن و دور می زنن هر بیتی که اخر از همه بود و یک واحد به سمت راست هدایت شد بر میگرده میره اول.
خوب بزار ادامه تحلیل رو بگم:
خط بعدی هستش WAITMS 100 که قبلا دربارش توضیح کافی داده شد
خط بعدی که توسط میکروکنترلر خونده میشه LOOP هستش و با خونده شدن این دستور میکرو میپره دوباره می ره از خط زیری DO شروع می کنه به خوندن یعنی خط Rotate B , Right و با خونده شدن این دستور دوباره تمام بیت ها یک واحد به سمت راست هدایت میشن یعنی 00010000 و الی اخر و هی این برنامه دور مزنه و LED ها یکی پس از دیگری روشن و خاموش می شه
1- سوال دارم بعد از این که این 1 به اخر رسید یعنی شد 00000001 و دوباره میکرو به دستور
Rotate B , Right رسید تکلیف این 1 چی می شه چون که باید یک واحد به سمت راست هدایت بشه
2- این که خیلی راحته خوب 1 دوباره بر می گرده سر خط یعنی 10000000
یکم این مثال رو دستکاری کن تا همه چیز دستت بیاد مثلا در اونجایی که ما نوشتیم B = &B10000000
می تونی دستکاری کنی و یک مقدار دیگه بدی مثلا B = &B 10101010 یا هر چیز دیگه .
خوب رسیدیم به مبحث تایمر کانتر در میکرو کنترلر AVR :
درمیکرو کنترلر AVR نهایتا دو سه تا تایمر و کانتر بیشتر نداریم البته در میکروکنترلر نوع
ATMEGA8 چهار تایمر کانتر داریم که در این نوع استسنا هستش
1- تایمر رو فهمیدم ولی کانتر چی هست
2- کانتر ( COUNTER ) به معنی شمارنده هستش که در میکروکنترلر هم وظیفه این کانتر شمردن پالس هایی هستش که به ورودیش اعمال میشه که سر فرصت بهم می گم . من اینجا فقط تایمر صفر 0 و تایمر یک 1 رو بهت می گم تایمر 3 هم به کارم نیومده که برم دنبالش به کار توهم نمیاد . این تایمر کانتر صفر و یک دو تا فرق باهم دارن و اون اینه که تایمر کانتر صفر 8 بیتی هسش و تایمر کانتر یک 16 بیتی .
1- موارد کاربردش کجا هستش
2- موارد کاربردش ساخت ساعت . شمارنده . فرکانس متر و ...
اول میرم سر تایمر کانتر صفر .ببین یزار یک چیز رو اول بهت بگم که بعضی از دستورات رو نمی شه موشکافی کنیم پس زیاد گیر نده .
1- باشه
2- اول تایمر صفر : برای این که شما بتونی از تایمر کانتر برای زمان های دقیق استفاده کنی مجبوری بری و یک RTC از بازار بخری و وصل کنی به دو تا از پایه های مخصوص میکروکنترلر که بهش بعدا اشاره می کنم . برای ایجاد یک تایم مثلا یک ثانیه ای شما باید ابتدا به میکروکنترلر با دستور پیکره بندی CONFIG حالی کنی که اقای میکروکنترلر من می خام از تایمر صفر شما استفاده کنم . برای ایجای زمان یک ثانیه توسط تایمر صفر به ترتیب زیر باید عمل کنی
اول باید ببینی فرکانس کاری میکروکنترلرت چند هستش که اکثر میکروکنترلرها 8 مگا هستن.

کد:
Config Timer0 = Timer , Prescale = 256
Dim A As Byte
Dim B As Byte
Enable Interrupts
Enable Timer0
On Timer0 Show

Do
Loop
End
Show:
Timer0 = 6
Incr A
If A = 125 Then
Incr B
Cls
Lcd B
Timer0 = 0
A = 0
End If
Return

این برنامه باید برای ما یک تایم یک ثانیه ایجاد می کنه ولی در عمل این طور نیست وزمان ها بیشتر از یک ثانیه طول می کشه که این مشکل بایک RTC قابل حل هستش.
در خط اول برنامه ما با دستور Config Timer0 = Timer , Prescale = 256 اومدیم و تایمر صفر رو برای مد تایمر پیکره بندی کردیم البته با این دستور CONFIG TIMER0 = TIMER در ادامه همین خط بعد از گذاشتن علامت , با دستور Prescale = 256 اومدیم و مقدار فرکانس کاری میکرو رو بر 256 تقسیم کردیم توجه کن که به جای این عدد از اعداد 1 و 8 و 64 و 1024 هم می تونی استفاده کنی که گذاشتن یکی از این اعداد بعد PRESCALE اجباری هست با این کار ما فرکانس کاری میکروکنترلر رو بر 256 تقسمت کردیم یعنی 8000000 / 256 = 31250 خوب حتما از خودت می پرسی که ما چرا این تقسیم رو انجام دادیم .باید بهت بگم که برای این که فرکانس یکم کوچیکتر بشه و بتونیم ازش برای ایجاد یک ثانیه استفاده کنیم.
خط دوم اومدیم یک متغییر از نوع بایت به نام A تعریف کردیم
خط سوم هم اومدیم یک متغییر از نوع بایت به نام B تعریف کردیم که در ادامه می گم که این متغییر ها رو برای چه کاری هستن .
خط بعدی با دستور ENABLE INTERRUPTS اومدیم وقفه میکرو کنترلر رو فعال کردیم توجه کن که ما در میکرو کنترلر یک وقفه داریم که انواع مختلف هم داره که بعدا در بارش توضیح می دم ولی همین رو بدون که هر وقت از تایمر و کانتر استفاده می کنی باید این دستور رو در اوایل برنامه بزاری تا هر وقت که وقفه تایمر خورد به میکرو اعلام بشه که زمان یک ثانیه شد . در ضمن با دستور
DISABLE INTERRUPTS هم می تونیم این فرمان رو غیر فعال کنیم
خط بعد با دستور ENABLE TIMER0 تایمر 0 رو فعال کردیم . بادستور DISABLE TIMER0 هم می تونیم این تایمر 0 رو غیر فعال کنیم.
خط بعدی نوشتیم ON TIMER0 SHOW این دستور به این معنی هستش که اگر تایمر صفر سرریز شد بپر برو توی زیر برنامه SHOW . توجه داشته باش که این سرریز شدن تایمر به منزله زمان یک ثانیه نیست که در ادامه میگم زمان یک ثانیه کی به وجود میاد .
خط بعدی نوشتیم DO وپایین DO هم نوشتیم LOOP . این حلقه DO –LOOP رو که تو حلقه هم خالی گذاشتیم برای این هستش که اگه برنامه دیگه ای هم داشتیم بزاریم داخل این حلقه مثلا شاید ما یک برنامه ای نوشته باشیم که علاوه بر تایمر یک کیبرد هم در برنامه استفاده کرده باشیم که برنامه مثلا کیبرد هم داخل این حلقه باید نوشته بشه.
در خط بعدی نوشتیم END که برنامه ما هیچ وقت به این END نمی رسه
خط بعدی نوشتیم SHOW: که زیر برنام ما رو مشخص کرده که داخل این زیر برنامه عبارات زیر نوشته شده:
اولی دستور داخل این زیربرنامه هستش TIMER0 = 6 ببین ما گفتیم که تایمر صفر یک تایمر 8 بیتی هستش یعنی یک بایتی خوب یک بایت هم با 255 پر میشه و با 256 تا هم سرریز میشه و دوباره صفر میشه
ما اومدیم برای این که این 256 سرراست بشه تایمر صفر رو با 6 تا پر کردیم که تقسیمات هم اعشاری نشه .
قبل از این که بخام خط بعدی یعنی INCR A رو توضیح بدم بزار یک چیزی رو اول بگم بعد برم سراغش چون که به هم ربط دارن . ما یک تقسیم دیگه هم باید انجام بدیم یعنی 31250 / 250 = 125 که حاصل شد 125 این 250 همون عدد تایمر هستش که در دستور قبل با فرمان TIMER0 =6 شش واحد بهش اضافه کرده بودیم که تقسیم ما سرراست بشه نه این که اعشاری بشه . حالا ما این تقسیم رو برای این انجام دادیم که بفهمیم یک متغییر رو چند بار باید افزایش بده تا تایم یک ثانیه ایجاد بشه که در اینجا عدد 125 به دست اومد یعنی برای این که زمان یک ثانیه ایجاد بشه متغییر ( در این جا متغییر A ) باید 125 تا پر بشه . حالا بریم سر خط دستور بعدی.
خط بعدی نوشتیم INCR A به این معنی که هر وقت تایمر ما وقفه خورد بیاد و یک واحد به این متغییر A اضافه کنه
خط بعدی نوشتیم IF A = 125 THEN ما گفتیم که برای به دست اومدن زمان یک ثانیه طبق تقسیماتی که انجام دادیم متغییر A باید 125 تا پر بشه برای همین دستور شرط رو نوشتیم که اگر متغییر A مساوی 125 شد برو دستور شرط رو اجرا کن این دستور شرط هر چیزی می تونه باشه مثال برو یک پورت رو یک کن یا این که یک واحد به یک متغییر دیگه اضافه کن . یا یک پایه رو صفر کن یا هر چی که دوست داشتی فقط ما این جا اومدیم و دستورات شرط رو در خط های پایین نوشتیم که دستورات شرطی که نوشتیم به این ها هستن :
اولین دستور شرط این هستش INCR B یعنی یک واحد به متغیی B اضافه کن که هر دستور دیگه ای هم می تونستیم بزاریم مثلا این که یک پایه رو TOGGLE کن که ما حال کردیم بعد از یک ثانیه یک متغییر دیگه رو بره اضافه کنه .
دستور شرط بعدی CLS هستش یعنی ال سی دی رو پاک کن
دستور شرط بعدی LCD B هستش که ما به میکرو دستور دادیم که مقدار متغییر B رو روی ال سی دی نمایش بده.
دستور شرط بعدی TIMER0 = 0 قرار دادیم تا برای شروع مجدد صفر بشه
دستور شرط بعدی A = 0 هستش که با این کار مقدار متغییر A رو صفر کردیم تا برای بار بعدی که می خاد متغییر رو اضافه کنه دوباره از صفر شروع به اضافه کردن کنه نه این که از ادامه 125
خط بعدی END IF هستش که ما هر وقت دستورات شرط تمام میشه باید از این دستور استفاده کنیم تا میکرو بفهمه که دستورات شرط تموم شده . پس از این که میکرو به این خط رسید و این دستور رو خوند هیچ کاری انجام نمی ده و فقط از خط پایین این دستور شروع به خوندن ادامه برنامه می کنه
خط اخر نوشتیم RETURN ببین ما برای این که دوباره یک تایم یک ثانیه دیگه به وجود بیاد مجبوریم که دوباره برگردیم به اول برنامه در تایمر ها با دستور RETURN این کار رو انجام می دیم . و میکرو میره به اول برنامه از دوباره روز از نو روزی از نو و این ایجاد زمان یک ثانیه ادامه داره .
1- یک سوال اگه ما خاستیم که یک زمان بیشتر از یک ثانیه ایجاد کنیم مثلا دو ثانیه یا بیشتر باید چکار کنیم
2- سوال خوبی کردیم این کار خیلی راحته در خطی که نوشتیم IF A = 125 و این 125 برای یک ثانیه بود رو دو برابرکنیم تا زمان دو ثانیه حاصل شه یعنی بزاریم 250 . یک چیز دیگه هم باید بهت بگم که اگه زمان بیشتری مثلا از دو ثانیه بیشتر خاستی باید 125 رو ضرت در اون تایمی که می خای بکنی
مثلا زمان سه ثانیه می خای 125 * 3 = 375 که حاصل شد 375 که این جا چون متغییر A فقط تا 255 تا می تونه پر بشه و با 256 تا سرریز میشه ما نمی تونیم از این نوع متغییر استفاده کنیم و مجبوریم از یک متغییر دیگه استفاده کنیم که از نوع WORD هستش که ظرفیت خیلی بالا داره . حالا کافیه در اویل برنامه به جای دستور DIM A AS BYTE بنویسیم DIM A AS WORD و به جای دستور
IF A = 125 بنویسیم IF A = 375 (البته برای تایم سه ثانیه)

خوب برای امروز دیگه کافیه بقیه باشه برای جلسه بعدی

نظرات  (۰)

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

ارسال نظر

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