تایمر کانتر 1
این تایمر – کانتر دارای امکاناتی دیگر مانند مد compare و مد capture و خروجی pwm می باشد.
پیکر بندی تایمر کانتر 1 به عنوان تایمر در زبان بیسیک BASIC
1 |
Config timer1 = timer , prescale = 1/8/64/256/1024 |
این تایمر 16 بیتی بوده پس حداکثر مقدار شمارش آن تا 65535 خواهد بود.
1/8/64/256/1024 : مقادیری که می توان برای تقسیم فرکانس میکرو استفاده کرد.
با دستور بالا تایمر – کانتر 1 به عنوان یک تایمر به میکرو معرفی می شود. میزان فرکانس کار این تایمر از رابطه زیر به دست می آید:
1 |
فرکانس کار میکرو = فرکانس تایمر /Prescale |
فعال و روشن کردن تایمر کانتر 1 در زبان بیسیک BASIC
1 2 3 |
Enable timer 1 Start timer1 |
در هنگام برنامه نویسی این دو دستور را حتما با هم به کار برید تا میکرو تایمر را روشن کند.
غیر فعال کردن تایمر کانتر 1 در زبان بیسیک BASIC
1 |
Stop timer1 |
از این دستور می توان در جاهای مختلف برنامه برای خاموش کردن تایمر استفاده نمود.
نکته : با خاموش کردن timer1 مقدار شمارش شده صفر نخواهد شد و با روشن کردن دوباره آن ادامه شمارش انجام خواهد شد.
نوشتن و خواندن تایمر کانتر 1 در زبان بیسیک BASIC
1 2 3 |
Timer = var Var = timer1 |
نکته : مقدار تایمر در رجیستری به نام timer1 قرار گرفته است که می توان به این رجیستر مقدار داد تا تایمر از آن مقدار شروع به شمارش کند و یا مقدار آن را در متغیری که برای انجام عملیاتی لازم دارید بریزید. نوع متغیر var باید word باشد.
وقفه تایمر کانتر 1 در زبان بیسیک BASIC
1 2 3 |
Enable ovf0 On ovf0 lable |
پرچم سریزی تایمر به نام ovf1 بوده و همانطور که گفته شد با رسیدن مقدار تایمر به عدد 65535 ( مقدار تایمر 1 برابر صفر می شود ) این پرچم 1 شده و می توان از آن به عنوان پرش به یک زیر برنامه استفاده کرد و در زیر برنامه با return بازگشت. در این دستور باید اول پرچم را فعال سازی و بعد با دستور ovf1 on در صورت یک شدن ovf1 به برچسب زیر برنامه پرش کرد.
نکته : فراموش نشود برای کار با هر وقفه ای اول باید وقفه کلی enable interrupts را فعال کرد.
مثال اول :
1 2 3 4 5 6 7 8 9 10 11 12 |
$regfile = “m32def.dat” $crystal = 16000000 Config timer1 = timer , prescale =64 , f.timer = 64 / 16000000 s Enable timer1 Start timer1 Dim a as word Timer1=0 Do A=timer , ever 4us — A incr timer1 Loop End |
مثال دوم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$regfile = “m32def.dat” $crystal = 16000000 Config timer1= timer , prescale =64 , f.timer = 64 / 16000000 s Enable interrupts On ovfi ali Enable timer1 Enable ovf1 Start timer1 Dim a as word Timer1 = 535 Do A=timer1 , ever 4us ——- A incr timer1 Loop End Ali: Timer1=535 Return |
نکته: در مثال بالا تایمر هر بار تا مقدار 65000 شمرده و با هر بار سریز شدن به زیر برنامه رفته و مقدار اولیه 535 را می گیرد تا دوباره تا 65000 بشمارد. چون فرکانس کار تایمر در هر 4us یک واحد اضافه می شود پس تایمر در هر 65000*4us یعنی هر 260ms سرریز می شود.
پیکر بندی تایمر کانتر 1 به عنوان کانتر در زبان بیسیک BASIC
1 |
Config timer = counter , edge = rising / falling |
با این دستور کانتر 1 پیکر بندی شده و با اعمال پالس به پایه t1 میکرو یک واحد به رجیستر counter1 اضافه می شود. این کانتر 16 بیتی بوده پس حداکثر مقدار شمارش آن تا 65535 خواهد بود ( پالس ورودی بعدی کانتر را صفر می کند )
Edge : گزینه rising برای حساس بودن پایه به لبه بالا رونده و گزینه falling برای حساس بودن پایه به لبه پایین رونده است.
فعال و روشن کردن تایمر کانتر 1 در زبان بیسیک BASIC
1 |
Start counter1 |
این دو دستور را حتما با هم به کار برید تا میکرو کانتر را روشن کند.
نکته : برای روشن و خاموش کردن کانتر در جاهای مختلف برنامه از start coutner1 استفاده نمایید.
غیر فعال کردن تایمر کانتر 1 در زبان بیسیک BASIC
1 |
Stop counter1 |
از این دو دستور می توان در جاهای مختلف برنامه برای خاموش کردن کانتر استفاده نمود.
نکته : با خاموش کردن counter1 مقدار شمارش شده صفر نخواهد شد و با روشن کردن دوباره آن ادامه شمارش انجام خواهد شد.
نوشتن و خواندن تایمر کانتر 1 در زبان بیسیک BASIC
1 2 3 |
Counter = var Var = counter1 |
نکته : مقدار کانتر در رجیستری به نام counter1 قرار گرفته است که می توان به این رجیستر مقدار داد تا کانتر از آن مقدار شروع به شمارش کند و یا مقدار آن را در متغیری که برای انجام عملیاتی لازم دارید بریزید.متغیر var باید از نوع word باشد.
وقفه تایمر کانتر 1 در زبان بیسیک BASIC
1 2 3 |
Enable ovf1 On ovf1 lable |
پرچم سریزی کانتر 1 به نام ovf1 بوده و همان طور که گفته شد با رسیدن مقدار کانتر به عدد 65535 و با ورود یک پالس دیگر ( مقدار counter1 برابر صفر می شود ) این پرچم 1 شده و می توان از آن به عنوان پرش به یک زیر برنامه استفاده کرد و در زیر برنامه با return بازگشت. در این دستور باید اول پرچم را فعال سازی و بعد با دستور on ovf1 در صورت یک شدن ovf1 به برچسب زیر برنامه پرش کرد.
نکته: فراموش نشود برای کار با هر وقفه ای اول باید وقفه کلی enable interrupts را فعال کرد.
مثال اول :
1 2 3 4 5 6 7 8 9 10 11 |
$regfile = “m8def.dat” $crystal = 8000000 Config timer1 = counter , edge = rising Start counter1 Dim a as byte Counter1=0 Do A=counter1 Loop End |
مثال دوم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$regfile = “m8def.dat “ $crystal= 8000000 Config timer1 = counter , edge = rising Enable interrupts On ovf1 ali3 Enable ovf1 Start counter1 Dim a as byte Do Loop End Ali3: Incr a Return |
پیکر بندی کانتر 1 به همراه مد مقایسه ای در زبان بیسیک BASIC
1 2 3 4 5 |
Config timer1 = counter , edge = rising / falling Clear timer = 1/0 , prescale = 1/8/64/256/1024 ,_ Compare a = clear / set / toggle / disconnect , _ Compare b =/ set / toggle / disconnect |
نکته : اگر نوشتن دستور در یک خط مقدور نبود با علامت _ به خط بعد بروید.
با کانتر 1 که آشنا شده اید. با ورودی پالس به پایه t1 و نوع اعمالی که با edge قابل تنظیم است, کانتر شروع ب شمارش می کند. این تایمر قابلیتی دارد که با رسیدن مقدار کانتر به عددی دلخواه که در درون رجیستر های دو بایتی compare1a و compare1 b می توان قرار داد خروجی دو پایه oc1a و oc 1b را به دلخواه تغییر وضعیت داد.
Edge : گزینه rising برای حساس بودن پایه به لبه بالا رونده و گزینه falling برای حساس بودن پایه t1 به لبه پایین رونده
Clear timer : مقدار 1 برای زمانی که بخواهید محتوای کانتر 1 در زمان تطابق و برابری با رجیسترها, پاک شود.
Comparea , b : در این قسمت گزینه هایی را در اختیار دارید که می توان عکس العمل خروجی های oc1a و oc1b در زمان تطابق را تغییر داد و clear برای صفر شدن در زمان تطابق و گزینه set برای یک شدن و toggle برای معکوس شدن و disconnect برای قطع شدن این پایه ها در زمان تطابق می تواند باشند.
فعال و روشن کردن و غیر فعال کردن کانتر 1 در مد مقایسه ای
نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.
1 2 3 |
Start Counter1 Stop Counter1 |
پیکر بندی تایمر 1 به همراه مد مقایسه ای در زبان بیسیک BASIC
1 2 3 4 |
Config timer1 = timer , prescale = 1/8/64/256/1024 , _ Compare a = clear /set/toggle/disconnect , _ Compare b = clear /set/toggle/disconnect |
تایمر را هم می توان در این مد استفاده کرد و کاملا شبیه به حالت استفاده از کانتر می باشد و تنها در این حالت مقدار درون timer1 با رجیستر b , compare1 a مقایسه می شود.
فعال و روشن کردن و غیر فعال کردن تایمر 1 در مد مقایسه ای
1 2 3 4 |
Enable timer1 Start timer1 Stop timer1 |
نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.
نوشتن و خواندن رجیسترهای مد مقایسه ای در زبان بیسیک BASIC
1 2 3 |
Compare 1a / compare1 b = var Var = compare 1 a / compare 1 b |
نکته : متغیر var از نوع word است.
وقفه کانتر و تایمر در مد مقایسه ای در زبان بیسیک BASIC
1 2 3 4 5 |
Enable oc1a On oc1a lable1 Enable oc1b On oc1b lable2 |
شما می توانید زمانی که مقدار counter1 یا timer1 با مقدار رجیسترهای مد مقایسه ای ( compare1a , b ) تطابق پیدا کردند , به صورت وقفه به یک زیر برنامه بروید و عملی را انجام دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$regfile = "m16def.dat " $crystal = 12000000 Config timer1 = counter , edge = rising ,clear timer = 1 ,prescale =1 ,compare a = set ,compare b = set Enable interrupts On oc1a ali3 On ocib ali4 Enable oc1a Enable oc1b Start counter1 Dim a as byte Compar1a = 100 Compar1b= 200 Do Loop End Ali3: Incr a Return Ali4: Dcer a Return |
پیکر بندی کانتر 1 به همراه مد capture
1 2 3 4 |
Config timer1 = counter , edge = rising | falling, _ capture edge = rising | falling, prescale = 1|8|64|256|1024, _ noise cancel = 1|0 |
با کانتر 1 که آشنا شده اید. با ورودی پالس به پایه t1 و نوع اعمالی که با edge قابل تنظیم است , کانتر شروع به شمارش می کند. حال در این مد می توان با دادن پالسی به پایه icp1 ( قابل تنظیم برای لبه بالارونده یا پایین رونده )
مقدار counter1 را درون رجیستر این مد به نام capture قرار داد.
Noise cancel : در حالت 1 عملیات نویز گیری انجام می شود. به این صورت که نسبت به پارازیت هایی که روی پایه icp1 قرار می گیرد میکرو عکس العملی از خود نشان نمی دهد و نیز نادیده گرفته می شود.
فعال و روشن کردن و غیر فعال کردن کانتر 1 در مد capture
1 2 3 |
Start counter1 Stop counter1 |
نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.
پیکر بندی تایمر 1 به همراه مد capture
1 2 3 |
Config timer1 = timer , capture edge = rising | falling , _ prescale = 1/8/64/256/1024 , noise cancel = 1/0 |
در این مد هم می توان از تایمر استفاده کرد و با این تفاوت که در لحظه اعمال پالس به پایه icp1 مقدار timer1 در درون رجیستر capture ریخته می شود.
فعال و روشن کردن و غیر فعال کردن تایمر 1 در مد capture
1 2 3 4 |
Enable timer 1 Start timer1 Stop timer1 |
نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.
نوشتن و خواندن رجیسترهای مد capture
1 2 3 |
Capture = var Var = capture |
با این دستور می توان مقداری را در کانتر قرار داده یا مقدار آن را در متغیری بریزید.
نکته : متغیر var از نوع word است.
وقفه کانتر و تایمر در مد capture
1 2 3 |
Enable icp1 On icp1 lable1 |
شما می توانید زمانی که توسط پالس به پایه ورودی این مد (icp) این پایه را تحریک می کنید. مقدار counter1 در رجیستر مد capture قرار داده به صورت وقفه به یک زیر برنامه بروید و عملی را انجام دهید.
Lable1 : نام برچسب مورد نظر خود
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$regfile = "m16def.dat" $crystal=8000000 Config timer1 = timer, prescale = 1 , capture edge = falling Enable interrupts On icp1 ali3 Enable timer1 Enable icp1 Start timer1 Dim a as byte Do Loop End Ali3: Incr a Return |
پیکر بندی تایمر – کانتر 1 در مد pwm
1 2 3 4 |
Config timer1= pwm = 8/ 9 10 , prescale = 1/8/64/256/1024 , _ Compare a pwm = clear up / clear down / disconnect , _ Compare b pwm = clear up / clear down / disconnect |
در مورد مدولاسیون پهنای پالس یا همان pwm در فصل یک بحث شده است. شما بوسیله یک تایمر کانتر می توانید این سیگنال را در خروجی ایجاد کنید و مقدار ان را در هر لحظه در کنترل خود داشته باشید. از مهم ترین کاربردهای این مد و این سیگنال در کنترل سرعت موتورهای dc می باشد. چون در موتورها نمی توان با کاهش ولتاژ و یا جریان سرعت را کاهش داد و این کاهش باعث افت توان موتور خواهد شد از این رو توسط مدولاسیون پهنای پالس می توان زمان روشن و خاموش بودن یک موتور را تحت کنترل در آورد.البته این روش هم باعث افت توان می شود ولی نسبت به حالت ها دیگر از مزیت های کنترلی بیشتری برخوردار است. در فصل فصل بعد بیشتر با کاربردهای pwm آشنا خواهید شد.
تایمر – کانتر 1 دارای دو خروجی PWM است که پایه های OC1A و OC1B هستند. دو رجیستر برای قرار گیری مقدار PWM خروجی وجود دارد که به نام های PWM1A و PWM1B هستند. که می توان از این دو رجیستر خواند و یا در آنها نوشت.
PWM = 8/9/10 : این مد می تواند به صورت 8 یا 9 یا 10 بیتی پیکر بندی شود. فرکانس کار Pwm در بیت های مختلف به صورت زیر است.
1 2 3 4 |
f.pwm = f.osc / ( 510 * prescale ) ---------- A pwm = 8 bit f.pwm = f.osc / ( 1022 * prescale ) -------- A pwm = 9 bit f.pwm = f.osc / ( 2046 * prescale ) -------- A pwm = 10 bit |
نکته : f.osc فرکانس کار میکروکنترلر می باشد.
Compare a/b pwm = این گزینه ها نوع تغیرات سیگنال pwm را مشخص می کند که در حالت clear up در حالتی که رجیستر pwm بیشترین مقدار خود را دارد به همان نسبت خروجی بیشترین پهنای خود ( موج dc ) را خواهد داشت و بلعکس
حالت clear down در حالتی که رجیستر pwm بیشترین مقدار خود را دارد به همان نسبت خروجی کمترین پهنای خود ( صفر ولت ) را خواهد داشت و بلعکس.
حالت dicconnect خروجی آن مد قطع می شود.
نوشتن و خواندن رجیستر های مد pwm
1 2 3 4 5 |
Pwm1a = var Var = pwm1a Pwm1b = var Var = pwm1b |
نکته : متغیر var از نوع byte در حالت 8 بیتی است و از نوع word در حالت 9 بیتی و 10 بیتی است.
نکته : برای فعال کردن pwm باید دستورات start timer1 و enable timer1 را حتما استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$regfaile = "m16def.dat" $crystal = 8000000 Config timer1 = pwm , pwm = 8 , prescale = 1 Enable timer1 Start timer1 Dim a as byte A = 255 Pwm1a = 0 Pwm1b=0 Do Incr a Pwm1b=a Loop End |
بسیار عالی و جامع من که واقعا بدردم خورد مرسی
عالی بود واقعا کامل و مفید و کاملا گویامچکرم
خواهش میکنم، نظر لطف شماست دوست عزیز.