خانه / آموزش میکروکنترلرهای AVR / آموزش برنامه نویسی پیشرفته BASIC-تایمر کانتر 1

آموزش برنامه نویسی پیشرفته BASIC-تایمر کانتر 1

آموزش برنامه نویسی پیشرفته BASIC-تایمر کانتر 1

آموزش برنامه نویسی پیشرفته BASIC-تایمر کانتر 1

تایمر – کانتر 1

این تایمر – کانتر دارای امکاناتی دیگر مانند مد compare و مد capture و خروجی pwm می باشد.

:: پیکر بندی تایمر – کانتر 1 به عنوان تایمر

Config timer1 = timer , prescale  = 1/8/64/256/1024

این تایمر 16 بیتی بوده پس حداکثر مقدار شمارش آن تا 65535 خواهد بود.

1/8/64/256/1024 : مقادیری که می توان برای تقسیم فرکانس میکرو استفاده کرد.

با دستور بالا تایمر – کانتر 1 به عنوان یک تایمر به میکرو معرفی می شود. میزان فرکانس کار این تایمر از رابطه زیر به دست می آید:

Prescale / فرکانس کار میکرو = فرکانس تایمر

:: فعال و روشن کردن تایمر1

Enable timer 1

Start timer1

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

:: غیر فعال کردن تایمر 1

Stop timer1

از این دستور می توان در جاهای مختلف برنامه برای خاموش کردن تایمر استفاده نمود.

نکته : با خاموش کردن timer1 مقدار شمارش شده صفر نخواهد شد و با روشن کردن دوباره آن ادامه شمارش انجام خواهد شد.

:: نوشتن و خواندن تایمر

Timer = var

Var = timer1

نکته : مقدار تایمر در رجیستری به نام timer1 قرار گرفته است که می توان به این رجیستر مقدار داد تا تایمر از آن مقدار شروع به شمارش کند و یا مقدار آن را در متغیری که برای انجام عملیاتی لازم دارید بریزید. نوع متغیر var باید word باشد.

:: وقفه تایمر 1

Enable ovf0

On ovf0 lable

پرچم سریزی تایمر به نام ovf1 بوده و همانطور که گفته شد با رسیدن مقدار تایمر به عدد 65535 ( مقدار تایمر 1 برابر صفر می شود ) این پرچم 1 شده و می توان از آن به عنوان پرش به یک زیر برنامه استفاده کرد و در زیر برنامه با return بازگشت. در این دستور باید اول پرچم را فعال سازی و بعد با دستور ovf1 on در صورت یک شدن ovf1 به برچسب زیر برنامه پرش کرد.

نکته : فراموش نشود برای کار با هر وقفه ای اول باید وقفه کلی enable interrupts را فعال کرد.

مثال اول :

$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

مثال دوم :

$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 به عنوان کانتر

Config timer = counter , edge = rising / falling

با این دستور کانتر 1 پیکر بندی شده و با اعمال پالس به پایه t1 میکرو یک واحد به رجیستر counter1 اضافه می شود. این کانتر 16 بیتی بوده پس حداکثر مقدار شمارش آن تا 65535 خواهد بود ( پالس ورودی بعدی کانتر را صفر می کند )

Edge : گزینه rising برای حساس بودن پایه به لبه بالا رونده و گزینه falling برای حساس بودن پایه به لبه پایین رونده است.

:: فعال و روشن کردن کانتر 1

Start counter1

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

نکته : برای روشن و خاموش کردن کانتر در جاهای مختلف برنامه از start coutner1 استفاده نمایید.

:: غیر فعال کردن کانتر 1

Stop counter1

 از این دو دستور می توان در جاهای مختلف برنامه برای خاموش کردن کانتر استفاده نمود.

نکته : با خاموش کردن counter1 مقدار شمارش شده صفر نخواهد شد و با روشن کردن دوباره آن ادامه شمارش انجام خواهد شد.

:: نوشتن و خواندن کانتر1

Counter = var

Var = counter1

نکته : مقدار کانتر در رجیستری به نام counter1 قرار گرفته است که می توان به این رجیستر مقدار داد تا کانتر از آن مقدار شروع به شمارش کند و یا مقدار آن را در متغیری که برای انجام عملیاتی لازم دارید بریزید.متغیر var باید از نوع word باشد.

:: وقفه کانتر 1

Enable ovf1

On ovf1 lable

پرچم سریزی کانتر 1 به نام ovf1 بوده و همان طور که گفته شد با رسیدن مقدار کانتر به عدد 65535 و با ورود یک پالس دیگر ( مقدار counter1 برابر صفر می شود ) این پرچم 1 شده و می توان از آن به عنوان پرش به یک زیر برنامه استفاده کرد و در زیر برنامه با return بازگشت. در این دستور باید اول پرچم را فعال سازی و بعد با دستور on ovf1 در صورت یک شدن ovf1 به برچسب زیر برنامه پرش کرد.

نکته: فراموش نشود برای کار با هر وقفه ای اول باید وقفه کلی enable interrupts را فعال کرد.

مثال اول :

$regfile = “m8def.dat”

$crystal = 8000000

Config timer1 = counter , edge = rising

Start counter1

Dim a as byte

Counter1=0

Do

A=counter1

Loop

End

مثال دوم :

$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 به همراه مد مقایسه ای

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 در مد مقایسه ای

نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.

Start Counter1

Stop Counter1

:: پیکر بندی تایمر 1 به همراه مد مقایسه ای

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 در مد مقایسه ای

Enable timer1

Start timer1

Stop timer1

نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.

:: نوشتن و خواندن رجیسترهای مد مقایسه ای

Compare 1a / compare1 b = var

Var = compare 1 a / compare 1 b

نکته : متغیر var از نوع word است.

:: وقفه کانتر و تایمر در مد مقایسه ای

Enable oc1a

On oc1a lable1

Enable oc1b

On oc1b lable2

شما می توانید زمانی که مقدار counter1 یا timer1 با مقدار رجیسترهای مد مقایسه ای ( compare1a , b ) تطابق پیدا کردند , به صورت وقفه به یک زیر برنامه بروید و عملی را انجام دهید.

$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

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

Start counter1

Stop counter1

نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.

:: پیکر بندی تایمر 1 به همراه مد capture

Config timer1 = timer , capture edge = rising | falling , _

prescale = 1/8/64/256/1024 , noise cancel = 1/0

در این مد هم می توان از تایمر استفاده کرد و با این تفاوت که در لحظه اعمال پالس به پایه icp1 مقدار timer1 در درون رجیستر capture ریخته می شود.

:: فعال و روشن کردن و غیر فعال کردن تایمر 1 در مد capture

Enable timer 1

Start timer1

Stop timer1

نکته : به یاد داشته باشید که برای این مد هم باید از این دستورات استفاده کنید.

:: نوشتن و خواندن رجیسترهای مد capture

Capture = var

Var = capture

 با این دستور می توان مقداری را در کانتر قرار داده یا مقدار آن را در متغیری بریزید.

نکته : متغیر var از نوع word است.

:: وقفه کانتر و تایمر در مد capture

Enable icp1

On icp1 lable1

شما می توانید زمانی که توسط پالس به پایه ورودی این مد (icp) این پایه را تحریک می کنید. مقدار counter1 در رجیستر مد capture قرار داده به صورت وقفه به یک زیر برنامه بروید و عملی را انجام دهید.

Lable1 : نام برچسب مورد نظر خود

$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

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 در بیت های مختلف به صورت زیر است.

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

Pwm1a = var

Var = pwm1a

Pwm1b = var

Var = pwm1b

نکته : متغیر var از نوع byte در حالت 8 بیتی است و از نوع word در حالت 9 بیتی و 10 بیتی است.

نکته : برای فعال کردن pwm باید دستورات start timer1  و enable timer1 را حتما استفاده کنید.

$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

 موسسه خیریه حمایت از کودکان مبتلا به سرطان

 دسته اصلی : زبان برنامه نویسی BASIC

 نویسنده : electronics98

 تاریخ انتشار :

3 دیدگاه

  1. بسیار عالی و جامع من که واقعا بدردم خورد مرسی

  2. عالی بود واقعا کامل و مفید و کاملا گویامچکرم

  3. خواهش میکنم، نظر لطف شماست دوست عزیز.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

مطلب پیشنهادی

I2C-AVR

آموزش برنامه نویسی پیشرفته BASIC – ارتباط سریال I2C

آموزش برنامه نویسی پیشرفته BASIC – ارتباط سریال I2C پایه های مورد استفاده پروتکل I2C …