برق. قدرت. کنترل. الکترونیک. مخابرات. تاسیسات.

دایره المعارف تاسیسات برق (اطلاعات عمومی برق)

آموزش میکرو avr به زبان ساده قسمت پنجم
1- سلام خوبی
2- خوبم تو چطوری
1- ای بد نیستم خوب قراره امروز چی یادم بدی
2- امروز می خوام کار با حافضه EEPROM رو بهت بگم
1- چی هستش
2- حافضه بلند مدت یا حاظه پایدار میکروکنترلر . اگه یادت باشه برنامه ای رو که ما می نوشتیم و بعد پروگرام می کردیم و با این کار برنامه رو می ریختیم توی قسمت حافضه FLASH . ما در AVR می توانیم برنامه ای رو که نوشتیم یا توی حافظه FLASH بریزم و یا توی حافضه EEPROM بریزیم بستگی داره که دوست داشته باشیم اطلاعات ذخیره بشه یا نه
1- من که نفهمیدم چی شد بالاخره توی کدوم حالضه بریزیم بهتره
2- ببین این دوتا حافظه نسبت به هم یک سری خوبی ها یی دارن و یک سری بدی ها مثلا حافضه FLASH نسبت به حافضه EEPROM از سرعت بالاتری برخورداره و ما برنامه ای رو که قبلا توی این حافظه ریخته بودیم می تونیم از طریق نرم افزار پاکش کنیم بدی حافظه FLASH هم توی همین هستش که اطلاعاتی رو که توی اون ریختیم بعد از این که تغذیه میکروکنترلر قطع بشه از بین می ره
1- منظورت از اطلاعات همون برنامه ای هستش که توش ریختیم
2- نه نه اشتباه نشه منظورم اینه که مثلا شما داری یک متغییر رو افزایش می دی و روی ال سی دی هم نمایش می دی بعد تغذیه میکروکنترلر رو بر می داری بعد دوباره تغذیه رو وصل می کنی ایا مقدار متغییری که قبلا افزایش داده بودی از صفر می یاد یا اخرین عددی که افزایش پیدا کرده بوده خوب مصلما از صفر چون اطلاعاتش پاک شده. خوب بریم سر بحث خودمون حافضه EEPROM هم نسبت به حافضه FLASH یک سری میزیت داره اون هم اینه که می تونیه اطلاعات رو در خودش نگه داره یک بدی هم که داره اینه که سرعتش نسبت به حافظه FLASH پایین هستش و برنامه ای رو که شما توی این حافضه می ریزی نمی تونی با نرم افزار پاکش کنی و باید با اشعه پاک بشه . بزار یک مثال بزنم . فرض کن که داری توی برنامه WORD یک متن رو تایپ می کنی و کلی هم تایپ کردی و ناگهان برق
می ره و بعد از دو ساعت برق میاد می ری کامپیوتر رو روشن می کنی ایا اون متنی رو که بایپ کرده بودی هنوز هستش یا اینکه از بین رفته
1- خوب مسلما چون که ذخیره نکرده بودم از بین رفته
2- افرین . حالا بیا فرض کنیم که شما بعد از این که این متن رو تایپ کردی رفتی توی یک درایوی ذخیرش کردی و بعد از این که ذخیرش کردی یک دفعه برق می ره بعد از دو ساعت برق می ره می ری کامپیوترت رو روشن می کنی بعد می ری سراغ اون متنی که قبلا ذخیره کرده بودی ایا پاک شده
1- نه چون که ذخیرش کرده بودم
2- احسن حافظه EEPROM هم همینظوره و می تونه اخرین اطلاعاتی رو که بهش دادی تا مدت های نا محدود در خودش نگه داره
1- بابا یک مثال هم از نحوه برنامه نویسیش بزن
2- چشم این هم یک مثال


کد:

Dim A As Byte
Readeeprom A , 0
Do
Debounce Pinb.0 , 1 , Show , Sub
Debounce Pinb.1 , 1 , Show2 , Sub

Loop
End

show:
Incr A
Writeeeprom A , 0
Waitms 5
Readeeprom A , 0
Cls
Lcd A
Return
show2:
A = 0
Writeeeprom A , 0
WAITMS 5
Cls
Lcd A
Return

در برنامه بالا ما به وسیله دو میکروسوییچ که به پایه های b.0 و b.1 وصل هستند یک متغییر رو زیاد می کنیم و هر وقت که دوست داشتیم صفرش می کنیم میکروسوییچی که به پایه B.0 وسل هستش برای زیاد کردن متغییر هستش و به کمک این میکروسوییچ می تونیم از صفر تا 225 رو به کمک میکروسوییچ زیاد کنیم میکروسوییچی که به پایه B.1 وصل می شه برای این هستش که ما در هر جایی که از برنامه باشیم بتوانیم متغییر رو صفر کنیم
جالبی این برنامه این هستش که ما به دلیل این که برنامه رو توی حافظه EEPROM میریزیم اگه یک وقتی تغذیه میکروکنترلر رو قطع کنیم و مجددا وصل کنیم و دوباره میکروسوییچی که برای زباد کردن متغییر هستش رو تحریک کنیم متغییر از اخرین عددی که قبلا زیاد شده بوده شروع می کنه به زیاد شدن
1- همین تیکه رو یک بار دیگه بگو
2- فرض کن که با میکرو سوییچ متغییر رو زیاد کردی و رسوندی به عدد مثلا 10 و روی ال سی دی نمایش دادی بعد تغذیه میکروکنترلر رو قطع کردی و بعد از چند ساعت میای دوباره تغذیه میکروکنترلر رو وصل می کنی و دوباره میکروسوییچ رو می زنی حتما فکر میکنی که از صفر دوباره شروع میکنه به زیاد کردن . باید بگم اگه اینطوری فکر می کنی اشتباه کردی چون که بازدن میکروسوییچ به دلیل اینکه این مقدار متغییر در حافظه EEPROM ذخیره شده متغییر شروع میکنه به زیاد شدن البته ازادامه کار یعنی ادامه 10 . خوب حالا شاید خواستیم که از صفر شروع کنیم برای این کار میکروسوییچی رو که به پایه B.1 وصل هستش رو فشار می دیم و دوباره مقدار متغییر می شه 0
خوب حالا بریم سر تحلیل برنامه :
میکرو میاد برنامه رو از خط اول شروع می کنه به خوندن
خط اول ما یک متغییر از نوع بایت و به اسم A تعریف کردیم
خط دوم نوشتیم Readeeprom A , 0 یه این معنی که بخوان مقدار متغییر A رو از مکان حافظه 0 EEPROM که به جای 0 هر عدد دیگری میتونی بدی . میکرو که این دستور رو میخونه می فهمه که باید مقدار متغییر A رو که قبلا ذخیره کرده بخونه خوب برای بار اول که ما چیزی رو ذخیره نکردیم .پس مقدرا متغییر A رو در وحله اول صفر در نظر می گیره
بعد میاد میوفته توی حلقه DO - LOOP و اون تو دور می زنه تا وقتی که یکی از پایه های B.0 یا B.1 ما یک بشه که این پایه ها مستقیما وصل شده به میکروسوییچ ها
فرض کن که میکروسوییچ اول که وصل شده به پایه B.0 تحریک بشه در این جا میکروکنترلر میفهمه که پایه B.0 یک شده و می ره دستور شرط رو که پرش به زیر برنامه SHOW هشتش رو اجرا می کنه و میپره میره داخل این زیر برنامه خوب حالا باید دستورات داخل این زیربرنامه رو اجرا کنه
اولین دستور داخل این زیربرنامه هتسش INCR A و میکرو هم این کار رو میکنه و یک واحد به مقدار متغییر A اضافه می کنه یعنی می شه عدد 1
دستور دوم هستش Writeeeprom A , 0 این دستور به این معنی هستش که مقدار متغییر A رو ذخیره کن داخل مکان حافضه 0 و میکرو هم این کار رو میکنه و مقدار عدد 1 رو توی این مکان از حافضظه EEPROM ذخیره میکنه . دستور بعدی داخل این زیربرنامه نوشته Waitms 5 یعنی این که یک تاخیر 5 میلی ثانیه ای ایجاد کن این تاخیر رو همیشه بعد از دستور Writeeeprom بزار چون که یک تاخیر ایجاد بشه و عملیات ذخیره سازی به درستی انجام بشه . دستور بعدی داخل این زیربرنامه نوشته Readeeprom A , 0 این دستور به این معنی هستش که بخوان مکان حافظه 0 از حافظه EEPROM دقیقه همان مکانی که مقدار متغییر A رو اونجا ذخیره کرده بودیم و میکرو هم این مکان رو می خونه و می فهمه که مقدرا متغییر A هستش 1 . دستور بعدی داخل این زیربرنامه هستش CLS که باید بدونی برای چی هستش . خط بعدی داخل این زیربرنامه نوشته LCD A
به این معنی که مقداری رو که توسط دستور Readeeprom A , 0 خوندی رو روی ال سی دی نمایش بده و میکرو هم این کار رو می کنه توجه داشته باش که هر وقت خواستی مقدار متغییری رو که قبلا ذخیره کردی رو بخونی و روی ال سی دی نمایش بدی اول باید با دستور Readeeprom
مقدار ذخیره شده رو بخونی بعد با دستور LCD مقدرا رو روی ال سی دی نمایش بدی . دستور بعدی داخل این زیربرنامه هستش RETURN به این معنی که بپر برو سر همون خطی که قبلا ازش پرش کرده بودی یعنی خط Debounce Pinb.0 , 1 , Show , Sub و دوباره توی این حلقه دور می زنه تا این که دوباره یکی از دو میکروسوییچ ها تحریک بشه و بپره بره توی زیربرنامه ای که براشون تعریف شده . فرض کن که همیجا یک دفعه دستت میخوره به سیم منبع تغذیه ای که به میکروکنترلر وصل هستش و تغذیه میکروکنترلر قطع میشه و تو دوباره تغذیه رو وصل می کنی و میکروکنترلر هم ازخط اول برنامه شروع میکنه به خوندن برنامه و دستور READEEPROM A , 0 رو می خونه و میکروکنترلر با خوندن این دستور می فهمه که باید بره مقدار متغییر A رو از مکان 0 حافظه EEPROM بخونه یعنی دقیقا همانجایی که مقدار متغییر A رو در اونجا ذخیره کرده بود . خوب ما اخرین مقداری رو که با تحریک کردن میکروسوییچ به متغییر A دادیم عدد 1 بود خوب اینجا میکرو می فهمه که ما اخرین مقداری رو که به متغییر A داده بودیم عدد 1 بوده از این به دیگه از صفر شروع نمی کنه به افزایش متغییر بلکه از ادامه عدد 1 شروع میکنه به شمردن . خوب ما یک میکروسوییچ دیگه هم داشتیم که وصل بود به پایه B.1 و این میکرو سوییچ برای این بود که مقدار متغییر ما در هر وضعیتی که بود بیاد صفرش کنه به این ترتیب که با تحریک میکروسوییچ میکروکنترلر می فهمه که پایه B.1 یک شده و باید از داخل حلقه DO - LOOP بپره بره توی زیربرنامه SHOW2 و دستورات داخل این زیربرنامه رو اجرا کنه خوب حالا داخل این زیربرنامه چی هستش الان می گم اولین دستوری که داخل زیربرنامه SHOW2 هستش A = 0 هستش که میکروکنترلر با خوندن این دستور میاد مقدار متغییر A رو صفر می کنه حالا مقدار متغییر A هر چقدر که بوده فرقی نداره و صفرش می کنه . دستور بعدی داخل این زیربرنامه هستش WAITMS 5 که میکروکنترلر با خوندن این دستور یک تاخیر 5 میلی ثانیه ای در اجرای برنامه ایجاد می کنه که این تاخیر رو همونطور که گفتم باید بعد از دستور Writeeeprom همیشه بزاری تا اطلاعاتی که می خواد ذخیره بشه به درستی ذخیره بشه . دستور بعدی داخل این زیربرنامه هست CLS که می دونی برای چی هستش . دستور بعدی هستش LCD A و میکرومیاد مقدار متغییر A رو که ما الان صفرش کردیم رو روی ال سی دی نمایش می ده یعنی عدد صفر رو نمایش می ده . دستور بعدی داخل این زیربرنامه هستش RETURN که میکرو با خوندن این دستور میاد میپره کجا همونجایی که قبلا ازش پریده داخل این زیربرنامه یعنی خط
Debounce Pinb.1 , 1 , Show2 , Sub و دوباره می یوفته داخل این حلقه DO -LOOP و روز از نو روزی از نو
1- یک سوال اگه ما مقدار متغییر رو با زدن میکروسوییچ رسوندیم به مثلا عدد 20 بعد توسط میکروسوییچ دوم اومدیم مقدار میکروسوییچ رو صفر کردیم بعد تغذیه میکروکنترلر رو قطع کردیم و دوباره وصل کردیم حالا سوال اینجاست که اخرین عددی که در حافظه EEPROM ذخیره می شه و بعد از برقراری تغذیه مجددا توسط دستور READEEPROM خونده می شه چه عددی هستش ؟
2- خوب این که خیلی راحته شما بعد از این که مقدار متغییر رو رسوندی به عدد 20 اومدی بازدن میکروسوییچ دوم مقدار متغییر رو صفر کردی پس اخرین مقداری که در این متغییر بوده و ذخیره هم شده عدد صفر هستش و با برقراری تغذیه مجدد و خوانده شدن دستور READEEPROM توسط میکروکنترلر میکروکنترلر میفهمه که مقدار متغییر هم اکنون هستش صفر . اینو یادت باشه که اخرین مقداری که به متغییر می دی توی حافظه EEPROM ذخیره میشه و فرقی نداره که چه عددی باشه.
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 (البته برای تایم سه ثانیه)



" آدمی ساخته ی افکار خویش است فردا همان خواهی شد که امروز اندیشیده ای "


وسلام

http://www.panatel.org/showthread.php?p=101209

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

صفحات جانبی

نظرسنجی

    لطفاً نظرات خود را درمورد وبلاگ با اینجانب در میان بگذارید.(iman.sariri@yahoo.com)نتایج تاکنون15000مفید و 125غیرمفید. با سپاس


  • آخرین پستها

آمار وبلاگ

  • کل بازدید :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :