0

اموزش ميكروكنترلر AVR به زبان ساده(Basic)-قسمت دوازدهم

 
mojehb
mojehb
کاربر برنزی
تاریخ عضویت : آبان 1391 
تعداد پست ها : 25
محل سکونت : اصفهان

اموزش ميكروكنترلر AVR به زبان ساده(Basic)-قسمت دوازدهم

قسمت دوازدهم

1-   سلام خوبی
2-   سلام ممنون تو چطوری
1-   این بد نیستم . خوب برو سر اصل مطلب امروز می خای چیرو بهم باد بدی
2-   امروز می خام برات از INT0 یا وقفه خارجی میکرو برات بگم
1-   حالا چی هست کارش چیه ؟
2-   کارش فقط و فقط اشکار کردن هستش . یعنی شما در هر جای برنامه که باشی با تحریک کردن این پایه INT0 می تونی به یک زیر برنامه بپری و ...
کاربردش کجا هستش کاربردش توی جا که بخای . به عنوان مثال شما یک برنامه برای یک دستگاه پرس پیشرفته نوشتی که قرار میکروکنترلر روی این دستگاه نصب بشه  که توی این برنامه هم کیبرد هستش هم اندازه گیری دما هم تایمر و چندتا کار دیگه . یکی از کارهایی که این دستگاه پرس باید انجام بده اینه که وقتی که پرس داره به سمت پایین میاد یک سنسور فعال میشه  و با فعال شدن یا سنسور  یک تایمر شروع به شمارش کنه و بعد از مثلا پنج ثانیه پرس برمیگرده به حالت اول . با این اوصاف ما باید برنامه رو طوری طراحی کنیم که برنامه ما در هر وضعیتی که بود بره وتایمر رو فعال کنه . حالا تو اگه باشی برای این قسمت از برنامه چه کار میکنی
1-   میام و سنسور رو وصل می کنم به یکی از پایه های میکرو بعد برنامه رو به از همون دستوری بود که ورودی برای میکرو تعریف میکردیم یعنی این دسترو:
DEBOUNCE PINB.0 , 1 , STAR
 بعد میکرو میپره میره توی زیر برنامه STAR و کاری رو که گفتی یعنی تایمر رو فعال میکنه
2-   بخش سخت افزاری رو خوب اومدی ولی این دستور DEBOUNCE که گفتی کاملا توی این قسمت اشتباه بود می دونی چرا
1-   نه چرا ؟؟؟؟
2-   مگه ما نگفتیم که این میکروکنترلر قراره بهش کیبرد ماتریسی – سنسور دما و چنتا چیز دیگه وصل بشه . خوب با این اوصاف میکرو یکسره در حال خوندن این کیبرد و اندازه گیری دما هستش کی وقت میکنه بیاد دستور DEBOUNCE رو بخونه البته نه اینکه دستور DEBOUNCE رو نخونه منظورم اینه که ممکنه که موقعی که سنسور فعال شد میکرو در حال خوندن یک قسمت دیگه از برنامه باشه . پس ما باید یک ترتیبی بدیم که برنامه میکرو در هر قسمتی از برنامه که باشه بره اون کاری رو که ما ازش خاستیم رو انجام بده و این کار رو با استفاده از INT0 انجام میده . حالا بزار چند تا مثال میزنم می فهمی که چی به چیه
CONFIG  INT0 = X
گفتیم که برای استفاده از بعض امکانات میکرو نیاز به پیکره بندی ان داریم که ما با نوشتن دستور بالا این کار رو انجام دادیم . و به میکرو فهماندیم که می خاهیم از امکان INT0 ان استفاده کنیم بعد از علامت مساوی نوشتیم X که به جای X باید یکی از گزینه های زیر رو بنویسی :
RISING   : برای اشکار کردن لبه بالا رونده از RISING استفاده می کنیم .
FALLING : برای اشکار کردن لبه پایین رونده از FALLING استفاده میکنیم.
LOW LEVEL : برای اشکار کردن سطح صفر از LOW LEVEL استفاده می کنیم.
1-   والا ما که نمیدونیم این لبه بالا رونده – لبه پایین رونده و سطح صفر چی هستش؟؟
2-   الان میگم برات میگم .

 یک پالس می تونه توسط یک شسی یا یک سنسور یا هر چیز دیگه ایجاد شده باشه . حالا اون قسمتی از شکل موج رو که قرمز هستش رو میگن سطح صفر یا LOW LELEL   اون قسمت ابی رنگ رو بهش میگن لبه بالا رونده یا RISING  اون قسمت سیاه رنگ رو بهش میگن سطح یک یا HIGH LEVEL و اون قسمتی که  سبز رنگ هستش رو هم می گن لبه پایین رونده یا FALLING
1-   فهمیدم ادامه بده . راستی کاربردهای دیگه ای هم داره
2-   اره یکی از این کاربرد ها در دیمر دیجیتال هستش که برای اینکه ما بفهمیم شکل موج AC از صفر عبور کرده یا نه از INT استفاده می کنیم .
1-   این پایه int0 کدوم یکی از پایه های میکرو هستش ؟
2-   در هر میکرو فرق میکنه کافیه به دیتاشیت یا همون برگه مشخصاتش مراجعه کنی
یک مثال ساده برات می زنم بعد میریم سر مثال های دیگه .
در برنامه زیر به ازای هر بار که شسی رو فشار بدی خروجی TOGGLE میشه :

Config  int0 = rising
Config  portb = output
Enable Interrupts
Enable  Int0
On  Int0  eca
Reset  portb
Do
Loop
End
eca:
Toggle Portb
Return
خوب حالا بریم سر تحلیل برنامه :
در خط اول ما با دستور  Config  int0 = rising پیکره بندی int0 رو انجام دادیم یعنی به میکرو گفتیم که ما می خاهیم از int0 استفاده کنیم. راستی ما بعد از علامت مساوی نوشتیم rising و به معنی این هستش که ما می خاهیم پایه int0 نسبت به لبه بالا رونده حساس باشه
در خط دوم با دستور config   portb =  output ما پورت b رو به عنوان خروجی تعریف کردیم .
در خط سوم با دستور enabe  interrupts وقفه سراسری رو فعال کردیم . راستی اینو یادم رفت که بگم هر وقت که خاستی از int0 استفاده کنی باید این وقفه سراسری رو فعال کنی .
در خط چهارم با دستور enable  int0 ما int0 رو فعال کردیم . در ضمن اگر خاستی که در هر جای برنامه int0 رو غیر فعال کنی می تونی به جای enable از disble استفاده کنی
در خط پنجم نوشتیم  On  Int0  eca  این دستور این مطلب رو می رسونه که اگر پایه int0 با یک لبه بالا رونده تحریک شد میکرو بپره بره توی زیر برنامه eca
خط ششم نوشتیم reset  portb  به این معنی که پورت b رو صفر کن
خط هفتم و هشتم هم به ترتیب do-loop هستش که یک حلقه بینهایت هستش ما این حلقه رو برای این گذاشتیم که میکرو اول برنامه که همه دستورات پیکره بندی رو خوند و رسید به این حلقه بیوفته توی این حلقه و تا زمانی که وقفه int0 نخورد توی این حلقه گرفتار باشه حالا وقفه کی می خوره الان بهت می گم وقفه زمانی می خوره که پایه int0 توسط یک لبه بالا رونده تحریک بشه.
خط نهم نوشتیم end که خودت می دونی چی هستش در ضمن برنامه ما هیچ وقت به end نمی رسه.
خط دهم نوشتیم ahmad: که یک زیر برنامه هستش که توی تحلیل دوم می گم که چرا نوشتمش  .
خط یازدهم نوشتیم toggle portb به این معنی که حالت پورت b رو در هر وضعیتی که هست ( منظورم صفر یا یک ) معکوسش کن یعنی اگر یک بوده حالا صفرش کن و اگر صفر بوده حالا یکش کن .
خط دوازدهم نوشتیم return به این معنی که برگرد برو سر جای اولت یعنی دوباره برو توی حلقه .


خوب حالا بریم سر تحلیل دوم: میکروکنترلر میاد برنامه رو از خط اول شروع میکنه به خوندن
خط اول نوشتیم config  int0 = rising  در اینجا میکرو میفهمه که ما   int0  رو پیکره بندی کردیم .
در ادامه میاد خط دوم رو میخونه یعنی config  portb  = output  در اینجا ما پورت b رو به عنوان خروجی تعریف کردیم که به این پورت b میتونی هر چیزی وصل کنی مثلا LED .
در خط سوم نوشتیم enable  interrupts  و با این کار به میکرو فرمان فعال کردن وقفه سراسری رو دادیم . راستی اینو بگم که هر وقت از int0 خاستی استفاده کنی این وقفه سراسری رو هم با همین دستوری که نوشتم یعنی enable  interrupts فعال کن .
خط چهارم نوشتیم enable  int0 میکرو با خوندن این دستور int0 رو برای ما فعال میکنه بعد میره به خط پنجم.
خط پنجم ما نوشتیم on  int0  eca میکرو با خوندن این دستور می فهمه که هر وقت که به پایه int0 یک پالس با لبه بالا رونده خورد باید بپره بره توی زیر برنامه eca و دستورات داخل این زیر برنامه رو اجرا کنه .
1-   یک سوال میکرو از کجا میفهمه که وقتی که پالس با لبه بالا رونده به پایه int0 خورد باید بره توی زیر برنامه چرا بالبه پایین رونده نره توی زیر برنامه
2-   از اونجایی که ما در اول برنامه براش با دستور config  int0  = rising مشخص کردیم که باید به لبه بالا رونده حساس باشه و میکروهم تابع دستوری هستش که ما بهش میدیم در مورد این که چرا با لبه پایین رونده این کار رو نکنه باید بگم که کافیه به جای rising بدیم falling  اون وقته که به لبه پایین رونده حساس میشه . خوب حال بریم سر ادامه تحلیل برنامه
خط ششم ما نوشتیم reset  portb به این معنی که کل پورت b رو صفر کن . میکرو این خط رو میخونه و میره سراغ خط بعدی
خط هفتم و هشتم ما یک حلقه بینهایت یعنی do –loop نوشتم که بدبختی میکرو اینجا شروع میشه میکرو با رسیدن به این دستورات میوفته توی یک حلقه بینهایت و اگه قسمت باشه تا ابد اونجا گرفتار میشه . مگر اینکه یک پالس فداکار بیاد و نجاتش بده .
1-   منظورت رو نفهمیدم تا کی توی این حلقه do – loop هستش
2-   تا زمانی که ما به پایه int0 یک پالس با لبه بالا رونده بدیم . به محض اینکه ما این عمل رو انجام بدیم میکرو میفهمه که وقفه خورد و باید بره توی اون زیر برنامه eca که ما از قبل تعیین کرده بودیم. حالا بیا فرض رو بر این بگیریم که ما یک پالس با لبه بالا رونده به پایه int0 دادیم و میکرو هم رفت توی زیر برنامه eca   . پس تحلیل برنامه رو از زیر برنامه eca که در خط دهم هستش پی می گیریم .
در خط دهم ما زیر برنامه eca رو داریم که میکرو الان پریده توی این زیر برنامه و می خاد دستورات داخل این زیربرنامه رو انجام بده :
اولین دستور داخل این زیربرنامه هستش toggle  portb  میکرو با خوندن این دستور پورت b رو toggle میکنه . چون در اول برنامه  ما با دستور reset  portb پورت b رو صفر کرده بودیم حالا که میکرو دستور toggle  portb رو انجم میده پورت b میشه یک یا به عبارتی عکس حالت قبل . در اینجا اگه که یک led رو به یک از پایه های پورت b وصل کرده باشی می بینی که led روشن میشه.
دومین یا به عبارتی اخرین دستور داخل این زیربرنامه هستش return میکرو با خوندن این دستور بر می گرده توی حلقه do –loop  و مثل دفعه قبل توی این حلقه اونقدر میمونه تا دوباره یک پالس با لبه بالا رونده به پایه int0 بخوره تا دوباره بره توی زیربرنامه eca  و دوباره دستورات داخل این زیر برنامه رو اجرا کنه اگه این میره دوباره portb رو toggle کنه پورت b این دفعه صفر میشه به عبارتی عکس حالت قبل. یعنی اگه شما یک led به یکی از پایه های پورت b وصل کرده باشی led خاموش میشه.

خوب حاضری بریم سر مثال بعدی
1-   اره ولی بزار این دفعه من یک مدار بگم تو برنامه شو بنویس
2-   فکر خوبیه بگو
1- من یک مداری میخام به این صورت کار کنه . وقتی که تغذیه میکروکنترلر رو وصل میکنیم یک led روشن خاموش بشه به عبارت دیگر چشمک بزنه و یک led دیگه هم توی مدار باشه که در حالت اول خاموش باشه . یک میکروسوییچ هم توی مدارمون باشه که باید وصل بشه به پایه int0   این میکروسوییچ رو هر بار که میزنیم led دوم toggle بشه یعنی برای بار اول که میکروسوییچ رو زدیم led روشن بشه و برای بار بعدی که زدیم led خاموش بشه و این سیکل ادامه داشته باشه .
2-  خوب من توی این مداری که گفتی  led اولی که قرار یکسره چشمک بزنه رو وصل میکنم به پایه b.0 و led  دومی که قراره به ازای هر بار که ما میکروسوییچ رو میزنیم toggle بشه رو وصل کردم به پایه b.1 میکروسوییچ رو هم که قراره به پایه int0 وصل بشه رو هم وصل کردم به پایه int.0 
حالا بریم سر برنامه :

Config Int0 = Rising
Config Portb = Output
Enable Interrupts
Enable Int0
On Int0  led
Do
Toggle Portb.0
Waitms 100
Loop
End
Led:
Toggle Portb.1
Return

تحلیل اول برنامه :
خط اول config  int0  =  rising  با این دستور پایه int0 رو برای پالس با لبه بالارونده پیکره بندی کردیم
خط دوم config  portb = output در این دستور ما پورت b رو به عنوان خروجی پیکره بندی کردیم
خط سوم  enable  interrupts   در این دستور ما وقفه سراسری رو فعال کردیم که در هر جا که خاسته باشیم از int0 استفاده کنیم باید این وقفه سراسری رو هم فعال کنیم
خط چهارم  enable  int0 در این دستور ما int0 رو فعال کردیم
خط پنجم  on  int0  led  این دستور به این معنی هستش که هر وقت وقفه int0 خورد بپر برو توی زیر برنامه led . در ضمن وقفه int0 موقعی می خوره که ما یک پالس با لبه بالارونده به پایه int0 بدیم.
خط ششم do  این دستور اول یک حلقه بی نهایت هستش
خط هفتم Toggle Portb.0 این دستور پایه b.0 رو toggle میکنه
خط هشتم Waitms 100 این دستور یک تاخیر 100 میلی ثانیه ای در اجرای برنامه ایجاد میکنه
خط نهم loop انتهای حلقه بینهایت رو مشخص میکنه
خط دهم end  به معنی انتهای برنامه هستش که میکرو هیچ وقت این دستور رو نمی تونه بخونه
خط یازدهم led: ما در اینجا یک زیر برنامه با اسم led مشخص کردیم که درون این زیر برنامه دو دستور وجود داره که در خط دوازدهم و سیزدهم هستش
خط دوازدهم toggle  portb.1  اولین دستور داخل زیربرنامه هستش و همونطور که از اسمش پیداست پایه b.1 رو toggle میکنه
خط سیزدهم return دومین و اخرین دستور داخل زیربرنامه هستش میکرو با خوندن این دستور برمیگرده توی حلقه بینهایت.

تحلیل دوم :
ببین نمی خوام زیاد کشش بدم برای همین خیلی خلاصه می گم.
میکرو میاد از اول برنامه شروع میکنه به خوندن خط اول تا پنجم رو می خونه و به این نتیجه می رسه که ما یک از int0 می خاهیم استفاده کنیم و در ضمن می خواهیم از پورت b به عنوان خروجی استفاده کنیم .
در خط ششم یعنی do که اول حلقه هستش میوفته توی حلقه و اولین دستور داخل این حلقه رو که هست toggle  portb.0 رو اجرا میکنه یعنی وضعیت پایه b.0 رو عکس حالت قبلش میکنه از اونجایی که حالت قبل یا حالت فعلی هستش صفر این دفعه میاد پایه b.0 رو یک میکنه و شما محلاحضه میکنی که اون led ی که به این پایه وصل هستش روشن میشه .
بعد میره خط هفتم رو می خونه waitms  100  این دستور 100  میلی ثانیه توی اجرای برنامه تاخیر ایجاد میکنه توی این 100 میلی ثانیه تاخیر پایه b.0 در همون حالت یک بودن هستش . البته اینو بگم که در عمل از 100 میلی ثانیه بیشتر طول میکشه . بعد میره خط هشتم رو می خونه
خط هشتم هستش loop  این دستور اخر حلقه رو مشخص کرده میکرو به محض اینکه این دستور رو می خونه می فهمه که باید بره از خط ششم دوباره شروع به خوندن کنه یعنی از دستور do این دستور رو می خونه و دوباره میوفته توی این حلقه و دستورات داخل این حلقه رو انجام میده و دوباره portb.0 رو toggle می کنه و سپس 100 میلی ثانیه تاخیر ایجاد می کنه و می رسه به loop و با خوندن این دستور loop همانند قبل دوباره می ره به خط ششم یعنی do و این سیکل همینطور ادامه داره . این قسمت از برنامه که داخل حلقه هستش مربوط به قسمت چشمک زن هست اگه توجه کنی portb.0 یکسره داره toggle میشه البته با تاخیر 100 میلی ثانیه ای و با این کارش اون led که به پایهb.0 وصل هستش رو روشن خاموش می کنه .
1-   سوال دارم . این تاخیر 100 میلی ثانیه ای رو برای چی گذاشتی ؟
2-   برای اینکه سرعت toggle شدن رو کم کنه یا به عبارت دیگه سرعت چشمک زدن led رو کم کنه
تا ما بتونیم اونو ببینیم .
1-   یعنی ما میتونیم با کم و زیاد کردنش سرعت چشمک زدن led رو کنترل کنیم ؟
2-   اره مثلا میتونی به جای waitms 100  بنویسی waitms  50 اینطوری سرعت چشمک زدن led زیاد میشه یا اکر عددش رو زیادتر کنی مثلا 200 یا 300 میتونی سرعت چشمک زدن led رو کم کنی . حالا بریم سر ادامه تحلیل برنامه
خب اونجایی بودیم که برنامه ما توی حلقه بی نهایت do-loop گیر کرده بود و با این کارش یک led رو برای ما روشن خاموش میکرد . حالا با فرض کنیم ما میکروسوییچ رو فشار دادیم و با این کارمون یک پالس با لبه بالا رونده ایجاد کرده ایم که در این حالت وقفه int0 میخوره و میکرو میپره میره توی اون زیربرنامه ای که ما براش مشخص کردیم یعنی زیر برنامه led و دستورات داخل این زیربرنامه رو اجرا میکنه . حاالا بیا فرض کنیم که این اتفاق هم افتاده و میکرو میخاد بره توی زیربرنامهled
اولین دستور داخل زیر برنامه led هستش toggle porb.1 میکرو با خوندن این دستور پایه b.1 رو toggle میکنه یعنی عکس وضعیت فعلی و از انجایی که در وضعیت فعلی پایه b.1 صفر بوده این دفعه توسط دستور toggle portb.1  یک میشه  و میبینی که اون led که به این پایه وصل شده روشن میشه . سپس میکرو میره خط بعدی رو اجرا میکنه یعنی دستور return  و با خوندن این دستور اونو اجرا میکنه و برمیگرده داخل همون حلقه do –loop و دوباره شروع میکنه به انجام دادن دستورات داخل همون حلقه do –loop . اگه دوباره میکروسوییچ رو فشار بدی میکرو باز وقفش میخوره و میاد توی زیر برنامه led و دوباره پایه b.1 رو toggle میکنه و چون در وضعیت فعلی پایه b.1 یک هستش این دفعه با با دستور toggle portb.1 این پایه صفر میشه و میبینی که اون led که به این پایه وصل هستش خاموش می شه.

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

 

جمعه 3 آذر 1391  7:34 PM
تشکرات از این پست
دسترسی سریع به انجمن ها