0

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

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

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

قسمت يازدهم


1- سلام خوبي
2- سلام ممنون
1- خوب امروز مي خاي چه مبحثي رو شروع كني
2- امروز مي خام در مورد كانتر يا همون شمارنده بگم
1- حالا اين كانتر چكار مي كنه؟
2- كانتر پالس ها رو ميشماره مثلا شما مي خاي يك پاسي رو كه از يك جا توليد شده رو بشماري از كانتر استفاده مي كني كانتر يعني شمارنده .
1- كاربردش چيه؟
2- اولين كاربردي كه به ذهن من ميرسه فركانس متر هستش . به اين صورت كه ما مقدار پالس هايي كه در مدت زمان يك ثانيه توليد ميشه رو اندازه گيري مي كنيم بعد روي LCD نمايش مي ديم
1- پس مي تونيم مثلا از اين كانتر در خط توليد يك كارخانه هم استفاده كنيم كه توليدات يك خط توليد رو بشماره
2- اره ميشه ولي وقتي كه با دستور INCR مي توني اين كار رو بكني چرا با كانتر اين كار رو انجام بدي
1- راست ميگي يا . گفتي كه يكي از كاربرداش فركانس متر هستش ميشه يكم بيشتر توضيح بدي
2- تعريف فركانس تعداد پالس هايي كه در مدت زمان يك ثانيه توليد ميشه هستش . يعني اگه ما بتونيم تعداد پالس هايي روكه در مدت زمان يك ثانيه توليد ميشه رو اندازه گيري كنيم ميشه گفت كه فركانس متر درست كرديم . به طور كلي براي اين كار ميايم كانتر و تايمر رو همزمان با هم راه اندازي مي كنيم تايمر رو روي يك ثانيه مي زاريم كه هر يك ثانيه بره و مقدار كانتر رو بخونه و روي LCD نمايش بده به اين صورت كه ما پالس ها رو به پايه كانتر مي ديم اين پالس ها در مدت زمان يك ثانيه توسط كانتر شمرده مي شه . بعد از يك ثانيه تايمر و كانتر STOP ميشن و مقدار كانتر در مدت زمان يك ثانيه روي ال سي دي نمايش مي ديم .
من اينجا نحوه كار با كانتر يك رو برات مي گم :
پالس هايي رو كه ما مي خاهيم توسط كانتر يك بشماريم رو بايد به پايه T1 بديم . 
يك نكته مهم اين كه كانتر يك با 65535 تا پر ميشه و با 65536 تا سرريز ميشه يا به عبارتي صفر ميشه . به زبان ساده تر اگه ما به پايه T1 كه مربوط به كانتر يك هستش 65535 تا پالس بديم كانتر پر ميشه و اگه 65536 تا پالس بديم كانتر سرريز ميشه و دوباره از صفر شروع ميشه.
2- خوب حالا بريم سر دستورات و پيكره بندي كانتر ( counter ): ما در اينجا از تايمر يك به عنوان كانتر استفاده كرده ايم
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- از روي ديتاشيت يا برگه مشخصات ميكرو
1- بازم سوال چرا توي از دستور Counter1 = 65535 دوبار توي برنامه استفاده كردي
2- ببين وقتي كه ما تغذيه ميكرو رو وصل مي كنيم ميكروكنترلر يك بار برنامه رو از اول شروع ميكنه به خوندن و براي اولين بار دستور Counter1 = 65535 رو كه ما در خط پنجم نوشتيم رو مي خونه و با اين دستور كانتر رو با مقدار 65535 تا پر مي كنه و بعدش مي يوفته توي حلقه DO-LOOP بعدش اونقدر توي اين حلقه مي مونه تا ما يك پالس به پايه T1 بديم تا اين كه سرريز بشه و بره توي زير برنامه SHOW . حالا بيا فرض رو بر اين بزاريم كه ما دستور Counter1 = 65535 رو در خط يازدهم ننوشته باشيم . خوب اگه ما اين دستور رو درخط يازدهم ننويسيم ميكرو مياد و تمام دستورات داخل زيربرنامه رو انجام مي ده و با دستور RETURN كه ما در اخر برنامه نوشته بوديم برمي گرده ميره تو حلقه DO-LOOP و از اونجايي كه كانتر يك بار سرريز شده يعني مقدارش صفر شده ديگه با پالس بعدي نميره توي زير برنامه چون الان مقدار كانتر صفر هستش و ما بايد 65536 تا پالس به پايه T1 بديم تا بره توي  زير برنامه . حالا  ما براي جلوگيري از اين كار اومديم دوبار دستور Counter1 = 65535 رو نوشتيم تا هر بار كه دستورات زير برنامه رو انجام داد مقدار كانتر رو برگردونه به 65535 و دوباره اماده يك پالس بعدي باشه .

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