پنج شنبه 26 تیر 1399 | Thursday 16 th of July 2020 صفحه اصلی گروه الکترونیکی کامپیوتر
پیکربندی و امکانات نرم افزارCodeVision و توابع بکار رفته

برای استفاده از هر میکرو AVRباید ابتدا راه اندازی های اولیه ان صورت گیرد.AVR ها توانایی های متعددی دارند که وقفه های خارجی ,تایمرها,کانال های مبدل انالوگ به دیجیتال,مقایسه کننده انالوگ,مولد موج PWM و... از جمله ان هاست.در نرم افزار Code Vision ابزار بسیار سودمندی به نام Code Wizard برای راه اندازی اولیه تراشه های AVRتعبیه شده است.این ابزار به شما این امکان را می دهد که با چند کلیک ساده روی موس  تراشه مورد نظر خود را پیکر بندی کنید.پس از پیکربندی توسط Code Wizard یک پروژه جدید ایجاد می شود که در ان کد های لازم برای پیکربندی امکانات تراشه به طور خودکار ایجاد شده اند و شما تنها کافی است کد های لازم برای مدیریت برنامه را بنویسید.

توابع تبدیل BCD

برای تبدیل  اعداد BCD و یا باینری به یکدیگر دو تابع وجود دارد که در فایل سرایند bcd.h  قرار دارند و مشخصات ان به صورت زیر است:

Unsigned char bcd2bin (unsigned char n):

یک عدد BCD را به باینری تبدیل می کند.

Unsigned char bin2bcd (unsigned char n):

عدد باینری  nرا به یک عدد BCD تبدیل می کند.nباید عددی بین 0 تا 99 باشد.

توابع تبدیل کد گری(Gray)

توابع Gray در فایل سرایند gray .h  گنجانده شده و شامل 6 تابع به شرح زیر است:

Unsigned char gray2binc (unsigned char n):

Unsigned char gray2bin (unsigned int n):

Unsigned char gray2bin1 (unsigned long int n):

عدد نوع Gray را به معادل باینری خود تبدبل می کند.

Unsigned char bin2grayc (unsigned char n):

Unsigned char bin2gray (unsigned int n):

Unsigned char bin2gray1 (unsigned long int n):

عدد nرا به معادل خود از نوع گری تبدیل می کند.

توابع تاخیر

توابع تاخیر در سرایند delay.hقرار دارند و برای تاخیر های میلی ثانیه ای  و میکروثانیه ای  به کار می روند و به شرح زیرند:

Void delay _us (unsigned char n):

به اندازه n  میکروثانیه تاخیر ایجاد می کند.nباید یک عدد ثابت باشد.

Void delay _ms (unsigned int n):

به اندازه تقریبی nمیلی ثانیه تاخیر ایجاد می کند و هر یک میلی ثانیه به طور خودکار  تایمر watchdogرا Reset می کند تا از Resetشدن تراشه جلوگیری شود.

تایمرها و شمارنده ها

AVRها عمدتا 1یا 2 یا 3 تایمر دارند.که تایمر 0 همیشه 8 بیتی است و تایمر 1 همیشه 16 بیتی است.قابلیت های این تایمرها با هم متفاوت است.در این قسمت به معرفی تایمرهای خانواده AVRمی پردازیم.

تایمر 0 : این تایمر 8 بیتی بوده  و پالس ساعت خود را از مولد پالس تراشه که می تواند نوسان ساز داخلی تراشه یا یک کریستال خارجی متصل به تراشه باشد دریافت می کند.فرکانس این پالس قبل از رسیدن به تایمر ,بسته به تنظیمات تراشه,می تواند از یک تقسیم کننده فرکانس موجود در تراشه عبور کند و مقدار ان کمتر شود.یک پالس خارجی نیز می تواند نقش مولد پالس ساعت این تایمر را بازی کند,که در این صورت از تایمر به عنوان یک شمارنده(counter)استفاده می شود. مقدار تایمر در ثبات TCNT0ذخیره می شود.همچنین این تایمر می تواند به صورت وقفه فعال گردد.برای راه اندازی تایمر برنامه Code Wizard را اجرا کرده و به صفحه Timersبروید وTimer 0را انتخاب کنید.

قسمت Clock Source

این قسمت منبع پالس ساعت(clock) تایمر را مشخص می کند که شامل گزینه های زیر است:

System Clock: فرکانسپالس ساعت تایمر برابر فرکانس تراشه است.

To Pin Falling Edge:تایمر در نقش یک شمارنده پالس ساعت خود را در لبه پایین رونده پایهT0 تراشه دریافت می کند.

To Pin Rising Edge: تایمر در نقش یک شمارنده پالس ساعت خود را در لبه بالا رونده پایه T0 تراشه دریافت می کند.

Clock Value: در صورتی که تایمر پالس ساعت خود را از مولد پالس ساعت میکروکنترلر دریافت کند این قسمت در دسترس است.گزینه اول این قسمت Timer 0 Stoppedمی باشد که به معنی خاموش بودن تایمر است.سایر گزینه ها به ترتیب تقسیمی از فرکانس سیستم با ضرایب 1/1024, 1/256 , 1/64,1/8,1می باشد.

توضیح این که تنظیمات این قسمت از طریق سه بیت اول ثبات TCCR0 انجام می شود که به شرح زیر است:

 

CS00

CS01

CS02

stop

0

0

0

ck

1

0

0

Ck/8

0

1

0

Ck/64

1

1

0

Ck/256

0

0

1

Ck/1024

1

0

1

To Falling

0

1

1

To Rising

1

1

1

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

TCCR0=0;

دستور زیر نیز تایمر را با 1/8فرکانس سیستم روشن می کند:

TCCRO=2;

اگر تایمر پالس ساعت خود را از پایه T0دریافت کند انکاه به صورت شمارنده کار خواهد کرد یعنی تعداد پالس های  وارد شده می شمارد.چون نمونه برداری از پالس های ورودی با فرکانس سیستم همزمان می شود نباید فرکانس پایهT0از فرکانس سیتم بیشتر شود.

برنامه زیر تایمر را با فرکانس تراشه راه اندازی کرده و هرگاه مقدار تایمر به 0x0fبرسد مقدار درگاه Aرا یکی افزایش می دهد(قسمت های دیگر برنامه درج نشده است)

TCCR0=Ox01;                                  //Timer start with system clock

TCNT0=0x00;

While (1) {

                 If (TCNTO==0x0f)

                                             {

                                                 PORTA=PORTA+1;

                                                TCNT0=0;                           //Reset timer value

                                             }

}

وقفه تایمر

منظور از راه اندازی یک تایمر به صورت وقفه این است که پس از هر بار سرریز کردن تایمر ,یک تابع یا به طور خودکار اجرا شود.منظور از سرریز کردن این است که تایمر به اخرین عدد قابل شمارش خود رسیده باشد و مجددا مقدار ان صفر شود.در صورت بروز یک وقفه برنامه از رفتن به دستور بعد خودداری کرده و برنامه جاری را به صورت معلق رها می کند و بلافاصله زیر برنامه مذکور در وقفه را اجرا می کند و پس از پایان وقفه مجددا برنامه را از دستور بعد از اخرین دستوری که اجرا شده بود ادامه می دهد.

توضیح کلی درباره وقفه ها:

فعال کردن هر وقفه از طریق یک بیت خاص صورت می گیرد و مثلا بیت دوم  ثبات TIMSK  برای فعال سازی وقفه تایمر به کار می رود.اما این کار برای استفاده از وقفه کافی نیست بلکه باید وقفه عمومی نیز فعال شود که ابن کار با دستور اسمبلی seiانجام می شود و باید به صورت زیر به کار رود:

#asm(“sei”);

دستور cli نیز وقفه عمومی را غیرفعال می کند.

نوشتن تابع وقفه همانند نوشتن یک تابع معمولی است با این تفاوت که باید ابتدای ان  از کلمه کلیدی:

Interrupt [n]

استفاده شود که nشماره متناظر وقفه است.تعریف یک تابع برای وقفه تایمر صفر برای نمونه به دو صورت زیر ممکن می باشد:

Interrupt [8] void timer0_overflow (void) {

          //Interrupt routine…

                                                                           }

Interrupt [TIM0_OVF] void timer0_ovf _ isr (void) {

        //Interrupt routine…                                                                                   }

نام تابع اختیاری است.توجه کنید که توابع وقفه پارامتر ورودی و خروجی ندارند  و باید به صورت void func(void)  تعریف شوند.

برای فعال سازی وقفه تایمر از طریق ابزار Code Wizardباید در صفحه Timers  این ابزار گزینه Overflow Interruptرا فعال کرد.با این کار در بخش وقفه برنامه کدی شبیه زیر تولید خواهد شد:

Interrupt [TIM0_OVF] void timer0_ovf_isr (void)

{

                    //Please your code here

}

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

تایمر1

این تایمر به رغم تایمر صفر 16 بیتی است و همانند ان می تواند از پایه خروجی T1یا از سیستم و یا از تقسیمی از فرکانس سیستم کلاک دریافت کند.این تایمر علاوه بر توانایی های فوق,دو خروجی مقایسه ای هم دارد که ثبات هایOCR1Aو  OCR1B مقادیر مقایسه شونده را در خود نگه می دارند. با تساوی محتوای تایمر و محتوای این ثبات ها پایه های خروجی OC1Aو OC1Bبسته به تنظیمات کاربر تغییر می کنند.این تایمر همچنین می تواند مولد موج PWM  به صورت 8 ,9 و 10 بیتی باشد. توانایی دیگر این تایمر Captureهست.در مد Captureبا تحریک پایه ICP می توان محتوای تایمر را در ثبات ICR1قرار داد.البته می توان از خروجی مقایسه کننده انالوگ نیز به عنوان تریگر ورودی Captureاستفاده کرد.

تنظیمات تایمر 1 در محیط Code Vision

در برنامه Code Visionاز منوی Tools گزینه Code Wizard AVR را اجرا کنید.وارد صفحه Timersشده و برگه Timer1را انتخاب کنید.گزینه های این صفحه به شرح زیر است:

Clock source: همانند انچه در تایمر صفر گفته شد,منبع پالس ساعت را مشخص می کند که می تواند تقسیمی از فرکانس تراشه و یا پایه خارجی باشد.

Clock value: در صورتی که تایمر از تراشه کلاک دریافت کند,مقادیر موجود برای فرکانس های پالس ساعت را مشخص می کند.

Mode: حالت یا مد کاری تایمر (یا وظیفه ان) را مشخص می کند که شامل حالت های زیر است:

Normal Top=FFFH: تایمر به صورت یک تایمر معمولی 16 بیتی کار می کند.

Correct PWM Top=00FFH: تایمر به صورت مولد موج PWM8بیتی کار می کند.

Correct PWM Top=01FFH:تایمر به صورت مولد موج PWM9بیتی کار می کند.

Correct PWM Top=03FF: تایمر به صورت مولد موج PWM10بیتی کار می کند.

CTC Top=OCR1A: تایمر در حالت معمولی کار می کند و حداکثر تا مقدار موجود در ثبات OCR1Aرا می شمارد و سپس صفر می شود.

 OUTA,OUTB: اگر تایمر در حالت Normalیا CTCکار کند این خروجی ها متناسب با مد مقایسه ای تغییر خواهند کرد و شامل مقادیرDiscon(قطع) ,Toggle(معکوس کردن) ,Clear(صفر کردن) و Set(یک کردن) می باشد.اگر تایمر در مد PWMکار کند این خروجی ها به صورت Discon(قطع),Non Inv(غیر معکوس) و Inverted(معکوس) برنامه ریزی می شود.

Input Capt:برای تنظیمات ورودی captureبه کار می رود و شامل گزینه های NoiseCancelو Rising Edge می باشد.

Interrupt On:وقفه های تایمر را فعال می کند.تایمر 1 شامل وقفه های  سرریزی(OverFlow) ,Capture,مقایسه گر A(Compare A) و مقایسه گر B(Compare B) می باشد.

Value:مقدار اولیه تایمر را در خود نگه می دارد.

Comp A:مقدار ثبات مقایسه ای OCR1Aرا در خود نگه می دارد.

Comp B: مقدار ثبات مقایسه ای OCR1Bرا در خود نگه می دارد.

تایمر 1 در حالت PWM

در مدولاسیون عرض پالس پالس هایی تولید می شود که دامنه ثابت و عرض متغیری دارند.مقدار عرض پالس وابسته به عددی است که در یک ثبات نگه داری می شود.تایمر یک دارای دو خروجی PWMدر پایه های OC1Aو OC1Bمی باشد.ثبات های OCR1Aو OCR1Bمقادیر لازم برای تنظیم عرض پالس را نگه می دارند.روش کار تایمر در مد PWMبدین صورت است که از 0 شروع به افزایش می کند تا به مقدار ثبات موجود در OCR1Aبرسد.انگاه مقدار پایه خروجی OC1Aرا بر حسب تنظیمات 0 یا 1 می کند و کماکان به شمارش صعودی ادامه می دهد تا به مقدار ماکزیمم خود برسد.سپس شمارش معکوس می شود تا دوباره با مقدار موجود در ثبات OCR1Aبرابر شود و پایه خروجی OC1Aبسته به تنظیمات مجددا 0 یا 1 خواهد شد.پس از ان تایمر به شمارش معکوس ادامه خواهد داد تا به 0 برسد.سپس دوباره شمارش صعودی اغاز می شود و این روال ادامه پیدا می کند.اصولا مدولاسیون PWMبه دو نوع Inverted(معکوس) و Non Inverted(غیر معکوس) تقسیم می شود.در مدولاسیون نوع Invertedتا زمانی که عدد تایمر از عدد مقایسه شونده کمتر باشد خروجی 0 و در غیر این صورت خروجی 1 می شود حال انکه در نوع Non Invertedاوضاع برعکس است.

تایمر 1 در حالت مقایسه گر

در این حالت تایمر کار شمارش عادی را انجام می دهد و مقدار تایمر همواره با دو ثبات مقایسه  OCR1A و OCR1B مقایسه می شود و زمانی که عمل تساوی رخ دهد پایه های خروجی OC1Aو OC1Bبسته به تنظیمات کاربر تغییر می کند.مقایسه گر تایمر یک وقفه نیاز دارد که در صورت بروز تساوی برانگیخته شود.تایمر پس از رسیدن به مقدار تساوی و بسته به تعریف کاربر می تواند resetشده و به شمارش خود ادامه دهد.

در تب Timer1 از صفحه Timers برنامه CodeWizard باید گزینه Mode را در یکی از دو حالت زیر تنظیم کرد:

Normal top=0ffh:در این حالت تایمر شمارش عادی خود را دارد و پس از رخ دادن تساوی به کار خود ادامه می دهد.

CTC Top=OCR1A: درر این حالت تایمر انقدر به شمارش خود ادامه می دهد تا تساوی با ثبات رخ دهد.سپس resetشده و دوباره شروع به شمارش می کند.

گزینه های OUTAو OUTBتنظیمات خروجی پایه های OC1Aو OC1Bرا در صورت بروز تساوی برعهده دارند که به 4 شکل زیر تنظیم می شود:

Discon:در این حالت بروز تساوی هیچ تاثیری در خروجی های مقایسه گر ندارد در واقع مقایسه گر غیر فعال است.

Toggle:  خروجی مقایسه گر(OC1A,OC1B) در صورت تساوی هرچه باشد برعکس می شود.

Clear: خروجی مقایسه گر در صورت تساوی 0 می شود.

Set: خروجی مقایسه گر در صورت تساوی 1 می شود.

برای فعال سازی وقفه مقایسه گر باید در قسمت Interrupt On  هر یک از گزینه های Compare B Matchیا Compare A Matchرا تیک زد.

مقادیر مورد نیاز در قسمت  Comp A,Bدرج می شوند.اگر بخواهید از طریق کدنویسی این مقادیر را تغییر دهید باید مستقیما روی ثبات های OCR1Aو OCR1Bبنویسید.

اگر وقفه مقایسه گر را فعال کرده باشید پس از اجرای CodeWizard روتین وقفه اماده ای به شکل زیر خواهید داشت:

// timer 1 output compare a interrupt services routine

Interrupt [TIM1_COMPA] void timer1_compa_isr (void)

{

     //please your code here

Compatability by:
آخرین به روز رسانی سایت: سه شنبه, 22 اسفند 1391 - 00:26