تبلیغات

به نام خدا

با سلام خدمت همه‌ی دوستای خوبم. امیدوارم خوب و خوش و سلامت باشید.

این جلسه قراره در ابتدا نحوه‌ی تنظیم CodeVision را برای پروگرامری كه در جلسه‌ی پیش ساختیم مطرح كنیم و بعد از اون، كمی هم آموزش زبان C را دنبال كنیم.

در جلسات پیش با بخش پروگرامر(Programmer) در CodeVision آشنا شدیم. برای استفاده از نرم افزار پروگرامر، ابتدا باید آن را با توجه به سخت‌افزاری كه برای پروگرام كردن در اختیار داریم تنظیم كنیم. برای این كار CodeVision را باز كنید و از منوی بالا گزینه‌ی "Setting" را انتخاب كنید. سپس گزینه‌ی "Programmer" را انتخاب كنید. پنجره‌ای به شكل زیر باز می‌شود.



در این پنجره باید نوع سخت افزار پروگرامری را كه در اختیار دارید را انتخاب كنید.

پروگرامری كه ما جلسه‌ی پیش آموزش دادیم همین STK200+/300 است كه معمولاً به صورت پیش فرض انتخاب شده است.

قسمت Delay Multiplier هم نیاز به تنظیم خاصی ندارد. با استفاده از این قسمت می‌توان كمی وقفه‌ در عملیات پروگرام شدن به وجود آورد كه این كار ممكن است برخی مشكلات احتمالی را در هنگام پروگرام كردن برطرف كند.

در این قسمت نیاز به تنظیم بخش دیگری نیست و پروگرامر آماده‌ی استفاده است.

تا به اینجا ما مقدمات كار با میكروكنترلر‌های خانواده‌ی AVR را یاد گرفتیم و الان می‌تونیم در حد آماتور از میكروكنترلر در مدار‌هایی كه طراحی می‌كنیم، استفاده كنیم.

اما كار با میكروكنترلر‌های AVR به همین جا ختم نمی‌شود، از اینجا به بعد ما سعی می‌كنیم مبحث میكروكنترلر را به صورت حرفه‌ای تر دنبال كنیم.

در ادامه‌ی این جلسه برمی‌گردیم به بحث برنامه نویسی در زبان C تا كمی بیشتر با این زبان آشنا شویم.

یك نكته را باید قبل از شروع بحث متذكر شوم، در میكروكنترلر، همه‌ی ورودی‌ها منطقی می‌شوند. یعنی اگر سطح ولتاژ پایه‌ی ورودی (كه مثلاً یك سنسور نوری به آن متصل شده است) بین 0 تا 2.5 ولت باشد، آی‌سی آن را 0 منطقی در نظر می‌گیرد و اگر بین 2.5 تا 5 ولت باشد، آن را 1 منطقی در نظر می‌گیرد.


ساختارهای كنترلی

در حالت عادی، دستورات داخل برنامه‌ی ما، از اولین دستور تا آخرین دستور به ترتیب اجرا می‌شوند. اما اگر بخواهیم بعضی از دستورات فقط تحت شرایط خاصی اجرا شوند یا مثلاً بخش‌های دیگری از برنامه چندین بار تكرار شوند، باید بتوانیم روند اجرای دستورات برنامه را كنترل كنیم. برای این منظور دستوراتی در زبان C وجود دارند كه به آن‌ها دستورات یا ساختار‌های كنترلی می‌گوییم.
اولین ساختار كنترلی كه با آن آشنا می‌شویم دستور if است.



if _ else:


به كمك این دستور، ما می‌توانیم برای اجرای هر بخش از برنامه شرط یا شروطی بگذاریم كه اگر این شروط برقرار نباشند، میكروكنترلربدون اجرای آن دستورات از روی آن‌ها رد شود و روند اجرای برنامه به بعد از این دستورات منتقل شود. این دستور در برنامه به شكل زیر استفاده می‌شود.

if (شرط یا شروط)

    {

        دستوراتی كه فقط اگر شروط بالا برقرار باشند اجرا می‌شوند

    }

else

    {

        دستوراتی كه فقط اگر شروط بالا برقرار نباشند اجرا می‌شوند

    }

 نكات مهم در مورد این ساختار:

1- بعد از هر كدام از دستورات در داخل if و else باید حتماً ";" گذاشته شود.

2- دقت كنید كه بعد از خود if و else نیازی به ";" نیست.

3- اگر بخواهیم چند شرط برای if بگذاریم ، به نحوی كه فقط اگر همه‌ی شروط برقرار بودند دستورات اجرا شوند، باید به شكل زیر عمل كنیم:

if (شرط1 && شرط2 && شرط3)

4- اگر بخواهیم چند شرط برای if بگذاریم ، به نحوی اگر هركدام ازشروط برقرار بودند، دستورات مربوطه اجرا شوند باید به شكل زیر عمل كنیم:

if (شرط1 || شرط2 || شرط 3 )

5- اگر بخواهیم تساوی 2 عبارت، یا یك عبارت با یك مقدار را چك كنیم به شكل زیر عمل می كنیم:

if (a == b && f == 20)

این عبارت 2 شرط دارد كه اگر متغیر a برابر با متغیر b باشد و اگر متغیر f هم برابر با مقدار 20 باشد، دستورات مربوط به if اجرا می‌شوند.

6- اگر بخواهیم مقدار خروجی مثلاً یك سنسور نوری را چك كنیم كه 1 منطقی است یا نه، به صورت زیر عمل می‌كنیم:

if ( PORTB.1== 1 )
یا
if (PORTB.1 !== 0 )

این 2 عبارت دقیقاً یك كار را انجام می‌دهند. همانطور كه می‌بینید، "==!" به معنای عدم  تساوی است.در حالت كلی "!"در این زبان به معنای نقیض است.

صفحه‌ی اصلی رباتیك

جلسه‌ی سی و سوم

 یك نكته‌ی دیگر در مورد ساختار if() و else:

الزامی برای نوشتن قسمت else نیست، یعنی می‌توان فقط if را بدون داشتن else استفاده كرد. همانطور كه می‌دانید، از else زمانی استفاده می‌كنیم كه بخواهیم در صورت نادرست بودن شروط ، دستورات مشخصی اجرا شوند(به جلسه‌ی 31 مراجعه شود)



ساختار while():

عملكرد این ساختار به این صورت است كه ما شرط یا شروطی را برای آن تعریف می‌كنیم و تا زمانیكه این شرط یا شروط برقرار باشند، دستوراتی كه تعیین می‌كنیم دائماً اجرا شوند و مكرراً تا زمانیكه شروط برقرار هستند این دستورات تكرار می‌شوند.

این ساختار به صورت زیر نوشته می‌شود.

while( شرط یا شروط )

{

دستور1 ;

دستور2 ;

دستور3 ;

}

دستورات 1 تا 3 و كلاً هر دستوری كه در قسمت مشخص شده نوشته شده باشد، مكرراً تازمانیكه شروط داخل پرانتز برقرار باشند اجرا می‌شوند.

نكات مهم در مورد این ساختار:

تمام نكاتی كه در مورد ساختار else-if در جلسه‌ی گذشته مطرح كردیم در مورد سختار while هم صادق هستند.

همانطور كه قبلاً هم گفته شد، زبان C یك زبان "Case Sensitive" است، یعنی در این زبان بین حروف بزرگ و كوچك تفاوت است. while، if، else همگی با حروف كوچك نوشته می‌شوند و اگر با حروف بزرگ نوشته شوند كار نمی‌كنند.

همانطور كه قبلاً گفته شد، دستور while(1) یك حلقه‌ی بی نهایت است و دستورات داخل آن تا زمانیكه میكروكنترلر روشن باشد مكرراً اجرا خواهند شد.

در ادامه‌ی این جلسه قصد داریم یكی از مهمترین و پركاربردترین قابلیت‌های میكروكنترلر‌ ATmega16 به نام ADC یا همان A to D را معرفی كنیم.


ADC چیست؟

ADC مخفف "Analog-Digital Converter" و به معنای مبدل آنالوگ به دیجیتال است.

اگر بخواهیم این قابلیت را به صورت ساده توصیف كنیم، یك ولت متر دیجیتال است كه بر روی پایه‌های میكروكنترلر نصب شده است و به وسیله‌ی آن می‌توان ولتاژ پایه‌های ورودی را با دقت مناسبی اندازه‌گیری كرد. همانطور كه می‌دانید ما تا به حال در هیچ‌ آی سی نمی‌توانستیم شدت ولتاژ ورودی را به دقت اندازه گیری كنیم و فقط می‌توانستیم بدانیم آیا ولتاژ ورودی بالای 2.5 ولت است یا زیر 2.5 ولت، و ورودی‌هایمان را به صورت 0 و 1 برسی می‌كردیم.(آی سی ها ورودی‌های خود را منطقی می‌كنند)

اما به كمك این قابلیتِ میكروكنترلر‌هایِ خانواده‌ی AVR، ما می‌توانیم با دقت مناسبی ولتاژ ورودی خود را بررسی كنیم.

یكی از كاربرد‌های مهم ADC می‌تواند در ربات‌های امدادگر دانش‌اموزی برای تشخیص رنگ باشد. همانطور كه می‌دانید هر رنگ، میزان مشخصی از نور را بازتاب می‌دهد و بقیه‌ را جذب می‌كند، ما با اندازه‌گیری مقدار نور بازتاب شده، میتوانیم رنگ را تشخیص دهیم. در اینجا ما برای اندازه‌گیری میزان شدت نور بازتاب شده، باید از ADC میكروكنترلر استفاده ‌كنیم تا بتوانیم ولتاژ خروجی سنسور نوری خود را به دقت اندازه‌گیری كنیم.

ADC یكی از مهمترین و پر كاربردترین قابلیت‌های میكروكنترلر‌های خانواده‌ی AVR است كه به تدریج با كاربرد‌های فراوان آن در بخش‌های مختلف آشنا خواهید شد.

در این جلسه ما نحوه‌ی انجام تنظیمات اولیه‌ی CodeWizard برای راه‌اندازی ADC را آموزش می‌دهیم.

ابتدا CodeWizard را باز كرده و در آن، لبه‌ی ADC را انتخاب می‌كنیم، و در لبه‌ی ADC، گزینه‌ی "ADC Enabled" را تیك می‌زنیم و سپس مانند شكل زیر تنظیمات را انجام می‌دهید :


همانطور كه می‌بینید، دومین قسمتی كه تیك زده شده "Use 8 bits" است.در ادامه در مورد دلیل این كار توضیح داده شده است.

همانطور كه گفته شد، وظیفه‌ی ADC، اندازه گیری ولتاژی است كه بر روی پایه‌ی ورودی قرار گرفته است. اما ADC عددی را كه مولتی متر به ما نشان می‌دهد گزارش نمی‌كند، بلكه متناسب با ولتاژ پایه‌ی ورودی، عددی را در بازه‌ی 0 تا 255 به ما گزارش می‌كند. یعنی عدد 0 را به ولتاژ 0ولت اختصاص می‌دهد، و 255 را به 5 ولت؛ و هر ولتاژی بین 0 تا 5 ولت را، متناسباً، با عددی بین 0 تا 255 گزارش می‌كند. در حقیقت برای سهولت در محاسبه، می توانید فرض كنید اندازه‌ی ولتاژ ورودی بر حسب ولت، ضربدر 51، برابرست با عددی كه ADC برای آن ولتاژ مشخص، به ما گزارش می‌كند.

به عنوان مثالی دیگر، اگر خروجی مدار یك سنسور نوری را به پایه‌ی ورودی ADC متصل كرده باشید، و خروجی مدار سنسور 2 ولت باشد،‌ADC عدد 102 را به ما گزارش می‌كند.

اگر تیكِ گزینه‌ی "Use 8 bits" را برداریم، بازه‌ی ما به 0 تا 1024، گشترش پیدا خواهد كرد و در حقیقت دقت اندازه‌گیری ما 4 برابر خواهد شد. یعنی 5 ولت ما، به جای 255، با عدد 1024 گزارش خواهد شد، و ولتاژهای بین 0 و 5 ولت نیز متناسباً با عددی بین 0 تا 1024 گزارش خواهند شد. اما در كار‌های ما نیازی به این دقت بالا نیست و معمولاً "Use 8 bits" را تیك می‌زنیم تا بازه‌ی ما بین 0 تا 255 باشد.

درباره‌ی تنظیمات ADC مطالب زیادی وجود دارد كه ما از مطرح كردن تمام آن‌ها در این بخش می‌پرهیزیم، دوستانی كه علاقه‌مند هستند، می‌توانند از طریق كتاب‌های مرجع و دیگر مراجع موجود، مطلب را پی بگیرند، اما در همین حدی كه مطالب در اینجا مطرح می‌شوند، برای كار ما تقریباً كافیست و الزامی در مطالعه‌ی منابع جانبی نیست.

در جلسه‌ی آینده در مورد نحوه‌ی دریافت این عددی كه قرار است ADC به ما گزارش دهد توضیح خواهیم داد.

تا جلسه‌ی آینده خدا نگه دار