• ¡Welcome to Square Theme!
  • This news are in header template.
  • Please ignore this message.
مهمان عزیز خوش‌آمدید. ورود عضــویت


امتیاز موضوع:
  • 17 رای - 2.12 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Title: آموزش کامل بسکام به همراه مثال
حالت خطی
#16
فصل ششم : تایمر و کانتر
ميکرو هاي AVR نهايتا داراي سه تايمر / کانتر هستند (به جز, MEGA64 , MEGA162 MEGA128 وتعداد محدود ديگرکه 4 تايمر یا بیشتر دارند) . اين تايمر / کانتر ها به نام هاي تايمرکانتر 0 و تايمرکانتر1 و تايمرکانتر2 و تايمرکانتر 3 ، نام گذاري مي شوند . کار تايمر ها شمردن تا يک عدد خاص و کار کانتر ها شمردن يک پالس ، که به پايه مخصوص اعمال مي شود است ، از تايمر و کانتر استفاده هاي ديگري نيز مي شود ، مانند ساخت پالس PWM و ...که در ادامه آنها را معرفي مي کنيم .

اولين تايمر /کانتري که معرفي مي شود تايمر صفر است ، در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر/ کانتر 8 بيتي است ، و نهايتا ميتواند تا 8^2 (255( بشمارد .
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد . از اين منابع و قفه ميتوان وقفه سرريزي را نام برد.
4- اين تايمر/کانتر ميتواند در مد تايمر و کانتر راه اندازي شود .
5- ورودي کانتر پايه T0 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) مي باشد .


راه اندازي تايمر صفر:
تايمر صفر با دستور زير پيکر بندي مي شود:
Config Timer0 = Timer , Preacale = 1 | 8 | 64 | 256 | 1024
عدد Preacale فرکانس (دقت ) تايمر را معيين ميکند .
بعد از دستور بالا، تايمر با دستور Start Timer0 شروع به شمارش ميکند و با دستور Stop Timer0 متوقف مي شود.
تايمر پس از شمردن تا 255 سر ريز مي شود .
شما با استفاده از دستور Enable Ovf0ياEnable Timer0 ميتوانيد و قفه سرريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از
دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور Var = Timer0 ، مقدار تايمر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Timer0 = Value ، مقدار اوليه اي در تايمر قرار داد تا تايمر از آن شروع به شمارش کند .
در اين مثال ميخواهيم توسط تايمر صفر زمان 1 ثانيه بسازيم ، طبق فرمول اگر شما از کريستا ل 1 مگا هرتز ( که کمترين مقدار کريستال مورد استفاده براي AVR ميباشد (به جز کريستال ساعت )) و Preacale ، 1024 استفاده نماييد ، بيشترين زماني که ميتوانيد ايجاد کنيد برابر است با :
زمان=1000000/(256*10244)
بنابراين ما بايد از وقفه سريزي تايمر استفاده کنيم ، و در هر بار وقفه به يک متغير عددي يک واحد بيفزاييم ، هنگامي که متغيير برابر4 شد ، متغيير صفر شود و يک واحد به متغير اصلي افزوده شود . بنابراين با ضرب کردن زمان بدست امده در 4 زمان اصلي بدست ميايد که برابر با 1048 ميلي ثانيه است .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte , C As Byte
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
On Timer0 P
Start Timer0
Do
Loop
End
P:
Locate 1 , 8 : Lcd B
Incr B
If B > 3 Then : Incr C : Locate 1 , 1 : Lcd C : B = 0 : End If
return
در اين برنامه ، هنگامي که تايمر سرريز مي شود (تا 255 ميشمارد) به زير برنامه P پرش مي شود و يک واحد به متغيير B افزوده مي شود ، شرط If ميگويد که اگر مقدار متغير B برابر با 4 شد يک واحد به متغير C اضافه کن و آن را در سطر اول ، ستون اول LCD نمايش بده ، بعد متغير B را صفر کن ، از آنجا که مقدار B به 4 نريسيده (در اولين رجوع مقدار B 1 مي شود) اين شرط اجرا نمي شود .
با دستور Return به برنامه تايمر برميگردد . مقدار تايمر صفر شده و دوباره تا 255 شمرده مي شود ... و اين عمل مدام تکرار مي شود. با چند دستور ساده ميتوان از برنامه بالا يک ساعت ساخت .

راه اندازي کانتر صفر :
کانتر صفر در بسکام با دستور زير پيکربندي مي شود:
Config Timer0 = Counter , Edge = Rising / Falling
با انتخاب Edge = Rising کانتر نصبت به لبه ي بالا رونده حساس است
با انتخاب Edge = Falling کانتر نصبت لبه ي پايين رونده حساس است
(لبه هاي بالا رونده يا پايين رونده را ميشمارد (بالا رونده >صفر به يک و پايين رونده< يک به صفر))
شما همچنين ميتوانيد با استفاده از دستور Var = Counter0 ، مقدار کانتر را در يک متغير از جنس بايت قرار دهيد و يا با دستور Counter0 = Value ، مقدار اوليه اي درکانتر قرار دهيد تا کانتر از آن شروع به شمارش کند.کانتر نيز مانند تايمر پس از شمردن تا 255 سر ريز مي شود ، شما با استفاده از دستور Enable Ovf0 ميتوانيد وقفه سر ريزي کانتر را راه اندازي کنيد . در صورتي که وقفه سرريزي کانتر فعال باشد ، کانتر پس از سرريزي به برچسبي که با يکي از دستورات On Ovf0 Lable و يا On Timer0 Lable مشخص شده پرش ميکند ، باز گشت از وقفه با دستور Return انجام مي شود.
مثال :
در اين مثال کانتر صفر تعداد پالسهاي اعمالي به پايه T0 (پايه شماره 1 مگا 16 ) را ميشمارد و پس از شمردن تا مقدار 255 ، به زير برنامه وقفه ميرود ، در آنجا يک واحد به متغيير B افزوده مي شود ، متغيير B تعداد دفعات سرريزي کانتر را نشان ميدهد که ما آن را روي سطر دوم LCD به نمايش ميگذاريم ، برنامه با دستور Return از زير برنامه خارج مي شود و به حلقه اصلي برمي گردد .
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim B As Byte
Config Timer0 = Counter , Edge = Rising
Enable Interrupts
On Counter0 P
Do
Locate 1 , 1 : Lcd Counter0
Loop
End
P:
Incr B : Locate 2 , 1 : Lcd "tedad dafeat sarrizi" ; B
Return
نکته : عملکرد تايمر و کانتر از عملکرد ساير قسمت ها جدا بوده و ديگر اعمال (مانند دستورات تاخير مثل wait و...) بر عملکرد آن اثري ندارد.

تايمر / کانتر يک :
در زير مشخات اين مورد را مشاهده ميفرماييد:
1- اين تايمر کانتر 16 بيتي است ، و نهايتا ميتواند تا 16^2 (65535( بشمارد.
2- کلاک اين تايمر ميتواند تو سط نوسان ساز داخلي يا نوسان ساز خارجي يا از پايه T1 (در مگا 16 پايه شماره2 (PORTB.1) توسط پالس خارجي، تامين شود (مقدار فرکانس نوسان ساز بر عدد Preacale تقسيم مي شود).
3- تايمر / کانتر يک داراي دو خروجي مقايسه اي است که دو رجيستر OCR1A و OCR1B 3مقدار مقايسه اي را در خود جاي مي دهند و با محتواي تايمر/کانتر مقايسه مي شوند .
4- در زمان تساوي محتواي رجيستر مقايسه و محتواي تايمر/کانتر ، وضعيت پايه هاي خروجي مد مقايسه اي OC1A و OC1Bمي تواند تغيير کند.
5- تايمر / کانتر در مد Capture نيز مي تواند به کار رود . با تحريک پايه ICP مي توان محتواي تايمر/ کانتر را در رجيستر ورودي Capture(Icr1) قرار داد.
6- خروجي مقايسه کننده آنالوگ نيز مي تواند به عنوان تريگر ورودي Capture قرار گيرد.
7- اين تايمر داراي چندين منبع وقفه ميباشد که شما ميتوانيد آنها را در هر قسمت از برنامه فعال يا غير فعال کنيد. از اين منابع و قفه ميتوان ، وقفه سرريزي را نام برد.
8- اين تايمر کانتر ميتواند در مد تايمر و کانتر وPWM راه اندازي شود.
9- ورودي کانتر پايه T1 (در ميکرو مگا 16 پورت B.0 ، پايه شماره1) ميباشد و خروجي پالس PWM پايه هاي OC1A و OC1B (در ميکرو مگا 16 به ترتيب پايه هاي 18و19 (PORTD.4 و D.5)است همچنين دو پايه ي فوق ميتوانند به عنوان خروجي مد مقايسه اي تايمر مورد استفاده قرار بگيرند .

راه اندازي تايمر يک :
تايمر 1 با دستور زير پيکربندي مي شود :
Config Timer1 = Timer , Prescale = 1| 8 | 64 | 256 | 1024
عدد Preacale فرکانس تايمر را معيين ميکند .فرکانس و زماني که تايمر ميشمارد از فرمولهاي زير محاسبه ميشوند:
فرکانس = مقدار کریستال/precacle
بعد از دستور بالا، تايمر با دستور Start Timer شروع به شمارش ميکند و با دستور STOP TIMER متوقف مي شود.تايمر پس از شمردن تا 65536 (16^2) سر ريز مي شود ، شما با استفاده از دستور ENABLE OVF1ياENABLE INTRRUPTS ميتوانيد وقفه سر ريزي تايمر را راه اندازي کنيد . در صورتي که وقفه سرريزي تايمر فعال باشد ، تايمر پس از سرريزي به برچسبي که با يکي از دستورات ON OVF1 LABLE و يا ON TIMER1 LABLE مشخص شده پرش ميکند ، باز گشت از وقفه با دستور RETURN انجام مي شود.
شما همچنين ميتوانيد با استفاده از دستور VAR = TIMER1 ، مقدار تايمر را در يک متغير از جنس word قرار دهيد و يا با دستور TIMER1 = VALUE ، مقدار اوليه اي در تايمر قرار دهيد تا تايمر از آن شروع به شمارش کند.
در اين مثال ميخواهيم توسط تايمر 1 يک ساعت بسازيم ، براي اين کار ابتدا بايد يک زمان 1 ثانيه اي ايجاد کنيم طبق فرمول اگر شما از کريستا ل 4 مگا هرتز و PRESCALE ، 64 استفاده نماييد ، ميتوانيد زماني برابر با 1.04 ثانيه ايجاد کنيد ، با مقادير ديگر نيز ميتوانيد زمان هاي دقيق تر بسازيد .(بيشترين زماني که با اين تايمر ميتوانيد بسازيد برابر با 67.108864 ثانيه ميباشد)
"regfile = "m16def.dat$
crystal = 12000000$
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Dim San As Byte , Da As Byte , Saat As Byte
San = 0 : Da = 0 : Saat = 1
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Timer1
On Timer1 P
Start Timer1
Do
Locate 1 , 1 : Lcd Saat ; ":" ; Da ; ":" ; San
Loop
End
P:
Incr San
If San > 59 Then : Incr Da : San = 0 : End If
If Da > 59 Then : Incr Saat : Da = 0 : End If
If Saat > 12 Then : San = 1 : End If
Return
در برنامه بالا هنگامي که تايمر سرريز مي شود به زير برنامه p پرش مي شود در آنجا متغيير ثانيه 1 واحد افزايش مي يابد ، ....
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
  


پیام‌های این موضوع
RE: آموزش کامل بسکام به همراه مثال - توسط a.mehran - 09-26-2014، 04:23 PM

موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اصطلاحات میکرو AVR a.mehran 1 5,297 09-26-2014، 04:45 PM
آخرین ارسال: a.mehran
  مدار فاصله سنج اولتراسونیک با بسکام a.mehran 2 4,917 09-02-2014، 07:56 AM
آخرین ارسال: a.mehran
  pwm با بسکام a.mehran 0 2,997 09-01-2014، 10:02 PM
آخرین ارسال: a.mehran
  راه اندازی سون سگمنت با بسکام a.mehran 0 3,078 09-01-2014، 09:56 PM
آخرین ارسال: a.mehran

پرش به انجمن:


Browsing: 5 مهمان