PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزشی کلاس آموزش زبان c و نرم افزار کدویژن



hadi elec
27th January 2012, 12:53 PM
به نام خدا




با سلام به همه دوستان
خب با توجه به برنامه ریزی قبلی برای اموزش زبان c و نرم افزار کدویژن و برنامه نویسی AVR تصمیم به شروع اموزش گرفتیم
و در این تاپیک بصورت مرحله مرحله مطالب عنوان خواهند شد


ترتیب مطالب:
1- توضیح زبان c و بیان نکته های مربوط به برنامه نویسی
2- توضیح نرم افزار کد ویژن و نکته های مربوط به برنامه نویسی
3- توضیح طراحی پروژه و نحوه پروگرم کردن میکروکنترلر

با تشکر از همه

hadi elec
27th January 2012, 12:57 PM
از اونجایی که اگر دوستان سوالات خودشونو اینجا بپرسن نظم مطالب به هم میخوره و ممکنه سوالات پس و پیش باشن و رشته کلام پاره بشه
خواهشا تمام سوالات خود را صرفا در این تاپیک (http://www.njavan.com/forum/showthread.php?113640-سوال-و-جواب-مربوط-به-اموزش-c-و-کدویژن&p=312921#post312921) مطرح کنید تا هم سوالات در یک محل متمرکز باشند و هم سوالات شما به راهنمایی بقیه هم کمک کند



- (http://www.njavan.com/forum/showthread.php?113640-سوال-و-جواب-مربوط-به-اموزش-c-و-کدویژن&p=312921#post312921)سوال و جواب مربوط به اموزش c و کدویژن (http://www.njavan.com/forum/showthread.php?113640-سوال-و-جواب-مربوط-به-اموزش-c-و-کدویژن&p=312921#post312921)



ممنون

hadi elec
27th January 2012, 01:11 PM
مقدمه ای بر زبان c و c++

قبل ار هر مطلبی این نکته رو بگم که برای برنامه نویسی AVR و کار با کدویژن بین زبان C و C++ هیچ تفاوتی نیست

تاریخچه زبان C برای بررسی تاریخچه زبان C باید به سال 1967 بازگردیم که مارتین ریچاردز زبان BCPL را برای نوشتن نرم افزارهای سیستم عامل و کامپایلر در دانشگاه کمبریج ابداع کرد. سپس در سال 1970 کن تامپسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخه های سیستم عامل Unix در آزمایشگاههای بل استفاده کرد. زبان C در سال 1972 توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته شد و ویژگیهای جدیدی همچون نظارت بر نوع داده ها نیز به آن اضافه شد. ریچی از این زبان برای ایجاد سیستم عامل Unix استفاده کرد اما بعدها اکثر سیستم عاملهای دیگر نیز با همین زبان نوشته شدند. این زبان با سرعت بسیاری گسترش یافت و چاپ کتاب "The C Programming Language" در سال 1978 توسط کرنیگان و ریچی باعث رشد روزافزون این زبان در جهان شد.

متاسفانه استفاده گسترده این زبان در انواع کامپیوترها و سخت افزارهای مختلف باعث شد که نسخه های مختلفی از این زبان بوجود آید که با یکدیگر ناسازگار بودند. در سال 1983 انستیتوی ملی استاندارد آمریکا (ANSI) کمیته ای موسوم به X3J11 را را مامور کرد تا یک تعریف فاقد ابهام و مستقل از ماشین را از این زبان تدوین نماید. در سال 1989 این استاندارد تحت عنوان ANSI C به تصویب رسید و سپس در سال 1990، سازمان استانداردهای بین المللی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گردید.

در سالهای بعد و با ظهور روشهای برنامه نویسی شی گرا نسخه جدیدی از زبان C بنام C++ توسط بیارنه استراوستروپ در اوایل 1980 در آزمایشگاه بل توسعه یافت. در C++ علاوه بر امکانات جدیدی که به زبان C اضافه شده است، خاصیت شی گرایی را نیز به آن اضافه کرده است.

با گسترش شبکه و اینترنت، نیاز به زبانی احساس شد که برنامه های آن بتوانند برروی هر ماشین و هر سیستم عامل دلخواهی اجرا گردد. شرکت سان مایکروسیستمز در سال 1995 میلادی زبان Java را برمبنای C و C++ ایجاد کرد که هم اکنون از آن در سطح وسیعی استفاده می شود و برنامه های نوشته شده به آن برروی هر کامپیوتری که از Java پشتیبانی کند (تقریبا تمام سیستمهای شناخته شده) قابل اجرا می باشد. شرکت مایکروسافت در رقابت با شرکت سان، در سال 2002 زبان جدیدی بنام C# (سی شارپ) را ارائه داد که رقیبی برای Java بشمار می رود .

برنامه نویسی ساخت یافته در دهه 1960 میلادی توسعه نرم افزار دچار مشکلات عدیده ای شد. در آن زمان سبک خاصی برای برنامه نویسی وجود نداشت و برنامه ها بدون هیچگونه ساختار خاصی نوشته می شدند. وجود دستور پرش (goto) نیز مشکلات بسیاری را برای فهم و درک برنامه توسط افراد دیگر ایجاد می کرد، چرا که جریان اجرای برنامه مرتبا دچار تغییر جهت شده و دنبال کردن آن دشوار می گردید. لذا نوشتن برنامه ها عملی بسیار زمان بر و پرهزینه شده بود و معمولا اشکال زدایی، اعمال تغییرات و گسترش برنامه ها بسیار مشکل بود. فعالیتهای پژوهشی در این دهه باعث بوجود آمدن سبک جدیدی از برنامه نویسی بنام روش ساخت یافته گردید؛ روش منظمی که باعث ایجاد برنامه هایی کاملا واضح و خوانا گردید که اشکال زدایی و خطایابی آنها نیز بسیار ساده تر بود.

اصلی ترین نکته در این روش عدم استفاده از دستور پرش (goto) است. تحقیقات بوهم و ژاکوپینی نشان داد که می توان هر برنامه ای را بدون دستور پرش و فقط با استفاده از 3 ساختار کنترلی ترتیب، انتخاب و تکرار نوشت.

ساختار ترتیب، همان اجرای دستورات به صورت متوالی (یکی پس از دیگری) است که کلیه زبانهای برنامه نویسی در حالت عادی به همان صورت عمل می کنند.

ساختار انتخاب به برنامه نویس اجازه می دهد که براساس درستی یا نادرستی یک شرط، تصمیم بگیرد کدام مجموعه از دستورات اجرا شود.

ساختار تکرار نیز به برنامه نویسان اجازه می دهد مجموعه خاصی از دستورات را تا زمانی که شرط خاصی برقرار باشد، تکرار نماید.

هر برنامه ساختیافته از تعدادی بلوک تشکیل می شود که این بلوکها به ترتیب اجرا می شوند تا برنامه خاتمه یابد (ساختار ترتیب). هر بلوک می تواند یک دستورساده مانند خواندن، نوشتن یا تخصیص مقدار به یک متغیر باشد و یا اینکه شامل دستوراتی باشد که یکی از 3 ساختار فوق را پیاده سازی کنند. نکته مهم اینجاست که درمورد دستورات داخل هر بلوک نیز همین قوانین برقرار است و این دستورات می توانند از تعدادی بلوک به شرح فوق ایجاد شوند و تشکیل ساختارهایی مانند حلقه های تودرتو را دهند.

نکته مهم اینجاست که طبق قوانین فوق یک حلقه تکرار یا بطور کامل داخل حلقه تکرار دیگر است و یا بطور کامل خارج آن قرار می گیرد و هیچگاه حلقه های متداخل نخواهیم داشت.

از جمله اولین تلاشها در زمینه ساخت زبانهای برنامه نویسی ساختیافته، زبان پاسکال بود که توسط پروفسور نیکلاس ویرث در سال 1971 برای آموزش برنامه نویسی ساختیافته در محیطهای آموزشی ساخته شد و بسرعت در دانشگاهها رواج یافت. اما بدلیل نداشتن بسیاری از ویژگیهای مورد نیاز مراکز صنعتی و تجاری در بیرون دانشگاهها موفقیتی نیافت.

کمی بعد زبان C ارائه گردید که علاوه بر دارا بودن ویژگیهای برنامه نویسی ساختیافته بدلیل سرعت و کارایی بالا مقبولیتی همه گیر یافت و هم اکنون سالهاست که بعنوان بزرگترین زبان برنامه نویسی دنیا شناخته شده است.


خب تا اینجا این مقدمه فکر میکنم کافی باشه

hadi elec
27th January 2012, 02:06 PM
خب تا اینجا با ماهیت و دلیل به وجود اومدن زبان C اشنا شدید
اما قبل از اینکه شروع به گفتن نکته ها و دستورات برنامه لازمه کمی در مورد نوع برنامه نویسی و ایده پردازی صجبت کنیم

ببینید دوستان وقتی که میخوایم برنامه نویسی کنیم و برنامه ای برای پروژه ای بنویسیم مثلا میخواهیم برنامه ای برای چشمک زدن یه led بنویسیم
اول باید بدونیم که از چه دستوراتی و با چه شرایطی میخوایم استفاده کنیم
و اینکه مهم تر اینه که چه اتفاقاتی برای اجر و به انجام رسیدن برنامه میخواد بیوفته
مثلا برای همون چشمک زدن led اول led باید روشن بشه و مدتی روشن بمونه و بعد خاموش بشه و مدتی خاموش بمونه تا دوباره روشن بشه
این اتفاق رو در غالب فلو چارت بصورت الگوریتمی مینویسیم و ترتیب اجرای برنامه رو بررسی میکنیم و اگر ایرادی توش ندیدیم شروع میکنیم به معادل سازی برنامه با دستورات برنامه نویسی و فرمول نویسی
فولچارت هم قوانین خاص خود را دارد ولی در کل مطلب مهمی به حساب نمیاد
و صرفا برای اینکه نکات برنامه نویسی رو تفهیم کنیم ازش استفاده میکنیم

برای تبدیل همین برنامه ای که در بالا بصورت فارسی عنوان شد به فرمول زبان c نیاز به دونستن بعضی مطالب ساده هست
اول اینکه برنامه رو در غالب یک تابع باید بنویسیم
برای توضیح تابع میتونم این مثال ساده رو بزنم که وقتی میخوایم مقاله ای بنویسیم همونطور که تمام مطالب پشت سر هم نوشته نمیشن و پاراگراف بندی میکنیم تابع هم تقریبا همچین حکمی رو داره
ما یک تابع اصلی داریم به اسم:
}()main
{
در واقع محدوده دستورات داخلی تابع با {} مشخص میشود و دستورات تابع دستوراتی به حساب میایند که درون اکولاد نوشته میشن
و نوع تابع رو داخل پرانتز مینوسیم
وقتی چیزی نوشته نمیشود به این معنی میباشد که تابع قرار نیست نتیجه محاسبات خود را به تابع دیگری منتقل کند و اصطلاحا مقداری را بر نمیگرداند
پس تمام دستورات داخل این تابع اصلی قرار میگیرد
اما هنوز تا کامل شدن برنامه زمان زیادی مانده است

hadi elec
27th January 2012, 02:37 PM
اما قبل از نوشتن تابع اصلی ما نیاز داریم که متغیر هایی که قراره باهاشون کار کنیم رو معرفی کنیم تا کامپایلر اونا رو بشناسه و باتونه تغییرات لازم رو روشنو انجام بده
ما چند نوع متغیر داریم که در نوع و اندازه نکاتی دارن
در تصویر زیر جدول بندی متغیر ها و اندازشونو رو میبینید

http://www.uc-njavan.ir/images/bgxsgh4vw99ek97wvzq.jpg
به عنوان مثال:
;int x
bit y;
در تعاریف بالا متغیر بدون مقدار اولیه تعریف شده است

int x=2;
bit y=1;
در متغیر های بالا مقداری برای متغیر ها تعریف شده است که در اولین خطی که از متغیر در برنامه استفاده میشود با این مقدار متغیر وارد کار میشود

hadi elec
27th January 2012, 02:59 PM
خب باز هم برای نوشتن یه برنامه یه کار دو کار مونده
اولیش دونشتن فایلهای کتابخونه ای هست
دومیشم اشنایی با دستورات

برای هر نوع محاسبه ای یه فابل کتابخونه ای تعریف میکنن که تمام فرمول هاو الگوریتم های محاسبه رو توی خودش داره و ما با دونستن مشخصات فایل و نیاز خودمون اون رو اول برنامه فراخوانی میکنیم
مثلا برای انجام محاسبات ریاضی در حد سینوس و کسینوس و غیره باید حتما فایل math.h رو اول برنامه فراخوان کنیم
و اینطوری هم باید نوشتن< include<math.h# درواقع این دستورات کتابخونه ای اولین دستوراتی هستند که باید بنویسیم
بعد تعریف متغیر و بعد ایجاد تابع اصلی نوشتن دستورات
#include<math.h>
int x;
main()
{
mahale neveshtane dasturate mohasebati
}

دوستان فراموش نکنید ما فعلا در حال مطالعه دستورات هستیم و هنوز در مورد منطق برنامه نویسی صحبت نکردیم
فعلا شما نمیتونید با این اطلاعات برنامه نویسی کنید

hadi elec
30th January 2012, 09:15 PM
خب ما تا اینجا با تقریبا 70 درصد نکات مربوط به شروع برنامه نویسی اشنا شدیم
قبل از ادامه دو تا نکته باید بگم
1- حجم مطالب مربوط به زبانc خیلی زیاده در صورتی که شاید برای کار با avr تنها به 10 درصد این مطالب نیاز باشه
بنابر این ما توی این اموزش بنا رو روی کاربرد زبان c روی avr گذاشتیم و صرفا در همون حد اموزش داده میشه
ما از زبان c برای کار با avr فقط به این اطلاعات نیاز داریم
انواع متغیر ها و محدوده هاشون و نوع مقدار دهیشون- انواع دستورات شرطی و حلقه ها و نوع و محل استفادشون- و نکته خیلی مهمتر : نوع تابع نویسی و فراخوانی توابع


2- نحوه اجرای یک برنامه توی محیط ویندوز و با cpu با نحوه اجرای یک برنامه تو میکروکنترلر فرق داره


پس این دو نکته رو به خاطر بسپارید
اول یه توضیح مختصری درباره نکته دوم میگم و بعد میرم سراغ ادامه کار چون از اینجا به بعد باید به منطق اجرای برنامه تو میکروکنترلر مسلط باشیم خوب به این مطالب دقت کنید

وقتی شما یه برنامه رو توی محیط ویندوز مینویسید و به کامپایلر دستور run میدید برنامه با سرعت و فرکانس کاری cpu شروع به کار میکنه
این موضوع توی میکروکنترلر با فرکانس کتری میکرو کنترلر میشه که اون فرکانس رو هم با انتخاب کریستال (قطعه نوسان ساز و تولید کننده کلاک پالس میکرو) مناسب تعیین میکنیم
فرکانس کاری میکر.کنترلر های avr بین 0 تا 16 مگاهرتز هست

معمولا توی محیط کامپیوتر برنامه تا زمانی اجرا میشه که ما میخواهیم و تعیین میکنیم ولی توی میکرو برنامه به هیچ عنوان نباید قفل کنه و یا از اجرا شدن بیوفته
و معمولا مدت زمان طولانی باید در حالتrun باشه
شما فرض کنید که یک برنامه چشمک زن ساده نوشتید این برنامه شاید حتی به مدت چند سال روی یه برد قرار باشه اجرا بشه پس ما باید جوری برنامه رو بنویسیم که صرفا بصورت کنترل شده متوقف بشه
برای همین منظور ما تمام برنامه ها رو توی یه حلقه بینهایت (حلقه ای که هیچ وقت شرطش نقض نمیشود و دائما درست است) مینویسیم تا همیشه در حال اجرا بمونه
اینکه دستور این شرط چیه باشه برای کمی بعد تر که به بحث زبان c برگشتیم

همیشه یادتون باشه وقتی یه برنامه میخواد run بشه کامپایلر یک بار بصورت سریع و کلی برنامه رو میخونه تا تعداد و مقدار متغیر ها رو متوجه بشه
و بعد از آن بصورت خط به خط شروع به خواند و اجرای برنامه میکنه و اگر روی یه خط گیر کنه تا زمانی که اونو اجرا نکنه و یا شرط محقق نشه همونجا میمونه و به خط بعد نمیره
بنابراین باید توی نوشتن شرطها و بخصوص حلقه ها خیلی دفت کنید

کد دستور حلقه بی نهایت رو هم الان دربارش صحبت میکنیم و ادامه دستورات باشه برای پست بعدی
یکی از حلقه های ساده و معروف و پر کاربرد حلقه while هست
و بصورت زیر نوشته میشه
}()while


{

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

برای این که این حلقه به یه حلقه بی نهایت تبدیل بشه باید شرطش همیشه درست باشه و هیچوقت نقض نشه
خب برای اینکار یه راه حل ساده هست
}(1)while
{

به همین سادگی
الان این حلقه تا ابد میتونه بدون هیچ مشکلی کار کنه

hadi elec
30th January 2012, 09:48 PM
خب با توجه به اطلاعات گفته شده تا اینجا
یه برنامه خیلی ساده مینویسیم و تحلیلش میکنیم



#include<delay.h>
#include<mega16.h>
;int x
viod main()
{
while()
{
x=1;
delay_ms(1000);
x=0;
delay_ms(1000);
q
}}




خب اول دو تا فایل کتابخونه ای معرفی کردیم یکی مربوط به میکرو atmrga16 هست و اون یکی هم مربوط به تاخیر زمانی هست(delay)
بعد یه متغیر از نوع اینتیجر تعریف میکنیم
و بعد تابع اصلی برنامه باز میشه
یه نکته درباره اکولاد ها یادتون باشه که تعداد باز شدن و بسته شدن ها باید برابر باشه
وقتی تابعی شروع میشه اکولادشو هم باز میکنیم
بعد یه حلقه بی نهایت شروع میشه
و به متغیر مقدار یک میدیم
توی خط بعدی یه تاخیر 1000 میلی ثانیه ای(یک ثانیه ای) تعریف میکنیم
و دوباره بعدش مقدار صفر رو به متغیر میدیم
و باز هم بعدش همون تاخیر رو اعمال میکنیم
و بعد برنامه تموم میشه
البته کد ها تموم میشه وگرنه این برنامه بعد از اجرای تاخیر دوم به خط بعد از خود دستور while میپره و این کار بی نهایت بار انجام میشه
همون طور که میبینیدبه تعداد همون دو اکولاد باز شده دو اکولاد رو میبندیم
تا اینجا اگر سوالی هست بپرسید البته توی قسمت سوال و جواب

hadi elec
31st January 2012, 10:38 PM
خب دوستان بعد ز توضیحات اجمالی درباره نحوه اجرای برنامه و منطق برنامه به بخش مهم برنامه نویسی میرسیم
در واقع خوب یاد گرفتن دستورات خیلی خیلی مهم هست
این دستورات حکم ابزار کار رو دارن براتون

اولین و پر کاربرد ترین دستور دستوره if هست
و بصورت زیر نوشته میشه
}(شرط)if

{


و نحوه اجرا به این صورت هست که در صورتی که شرط داخل پرانتز درست بود دستورات داخل اکولاد شروع به اجرا شدن میکنن و در صورتی که شرط داخل پرانتز نقض شد برنامه به اولین خط بعد از اکولاد ها میپره و دستورات اونجا اجرا میشه

نکته جالب اینه که چون اینجا این فقط یه شرط هست برای اجرای دستورات فقط یک بار درستی شرط بررسی میشه
از اونحایی که ما این if رو داریم توی یه حلقه بی نهایت مینویسیم که توی اون دستورات خط به خط بررسی میشن
اگر شرط درست باشه دستورات داخل اکولاد if اجرا میشن و برنامه ادامه پیدا میکنه تا زمانی که دوباره به اول شرط برسه و دوباره بخواد درستی شرط رو بررسی کنه
و اینبار اگر شرط غلط باشه برنام از بعد از اکولاد اجرا میشه و ادامه پیدا میکنه دوباره تا زمانی که دوبراه به شرط برسه برنامه

if(x>0){
x=x+1;
{

خب توی برنامه بالا وقتی برنامه به اول دستور میرسه شرط رو بررسی میکنه
اگر متغیر مقداری مثبت داشت وارد دستورات این شرط میشه که این دستور هم میگه که یک واحد به این متغیر اضافه بشه
الان ببینید چجوری یه واحد به یه متغیر اضافه میکنیم
این چیزی که نوشته شده رو با قوانین ریاضی مقایسه نکنید که هنگ میکنید
این مدل برنامه نویسیه دیگه
حال
ا اگر برنامه به اول دستورif بریسه و شرط نقض بشه دیگه این اضافه شدن یک واحدی اتفاق نمیوفته و برنامه پرش میکنه به بعد از دستور if

hadi elec
2nd February 2012, 12:23 PM
دستور while رو هم که توضیح دادم
در واقع همونجایی که نوشته شده(while(1
شما میتونید به جای 1 همون شرط خودتونو بنویسید
مثلا (r>2) ,
یا (t!=8)
اگر هم بخوایم دو تا شرط رو با هم andکنید میتونید از علامت&& بین دوتا شرط استفاده کنید (w >9 && e<7)
برای or هم میتونید از علامت || استفاده کنید

توضیح عملکرد دستور:
وقتی برنامه به دستور while میرسه شرط رو بررسی میکنه
اگر درست بود وارد حلقه میشه و تمام دستوراتی که توی اکولاد هست رو اجرا میکنه و وقتی به خط آخر رسید باز به اول میره و دوباره شرط رو بررسی میکنه
اگر درست بود دوباره به همون رویه قبلی ادامه میده این کار n بار میتونه ادامه پیدا کنه
در واقع تا جایی که شرط نقض بشه اونوقت برنامه به اولین خط بعد از بسته شدن اکولاد حلقه while میره و از اونجا شروع به اجرا میکنه
ما توی این دستور انتخابی برای تعداد دفعات اجرای دستورات حلقه نداریم
مگر اینکه با محاسباتی جوری شرط رو تعیین کنیم که فقط یه تعداد دفعه خاص دستورات اجرا بشت و در نهایت شرط نقض بشه
اما دستوری هست که دقیقا ما میتونیم تعداد دفعات خونده شدن دستورات حلقه رو تعیین کنیم

hadi elec
2nd February 2012, 12:31 PM
دستورfor
نحوه نوشتن به این صورت هست:
for(مقدار اولیه ; شرط ; گام حرکت)
}
دستورات
{

البته خط اول رو از راست به چپ بخونید چون خوب نشد بنویسم اینجوری شد
for( w=0 ; w<10 ; w++)
}
f=f+1;
}
الان فکر کنم متوجه بشید
اول به متغیر مقدار اولیه میدیم بعد میگیم که در چه صورتی کار ادامه پیدا کنه
در واقع اینجا تا زمانی که متغیر مقدارش کمتر از 10 باشه کار ادامه پیدا میکنه
و با هر بار اجاری دستورات داخل اکولاد یک واحد به متغیر w اضافه میشه
اینجا دستورمون زیاد شدن مقدار متغیر f هست به میزان 1 واحد
با این توضیحات باید متوجه شده باشید که دستورات داخل حلقه فقط و فقط 10 بار انجام میشن و بعد از اون شرط نقض شده و دیگه این حلقه اجرا نمیشه مگر اینکه جای دیگه ای از برنامه عمدا w رو 0 کنیم تا دوباره حلقه به تعداد 10 بار اجرا بشه

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

hadi elec
2nd February 2012, 04:45 PM
تا اینجا دستوراتی که در موردشون صحبت کردیم فقط یه شرط میتونستن داشته باشن و در حالت دیگه میتونن بصورت and دو تا شرظ رو بصورت همزمان بررسی کنن
اما الان در مورد دستوری صحبت میکنیم که میتونه تعدادی زیادی شرط رو بصورت or و یا and بررسی کنه
switch case(x){
case 1:

break;
case 2:

break;

{
خب این صورت دستور هست
خب اول شما اون متغیری رو که میخواین شرایطش رو بررسی کنید رو معرفی میکنید که اینجا متغیر x تعیین شده
بعد شرایط رو میگید cace 1 یعنی اگر مقدار ایکس برابر 1 شد در این صورت دستورات زیرش اجرا میشه و وقتی به دستور break میرسه برنامه میپره به بعد از اکولاد
اگر هم متغیر مقدارش 1 نشد میره کیس بعدی رو بررسی میکنه
و همین طور تا اخر
هر دستور فقط یه بار بررسی میشه و اگر هیچکدوم درست نشدن میره به بعد از اکولاد و دیگه برنامه میره تا زمانی که دوباره برنامه به اول دستور سوییچ برسه و شروط رو بررسی کنه
برای اینکه کاربر or پیدا کنه
شما دیگه نیاز نیست break رو بنویسید
و همینطور کسی ها رو میتونید پشت سر هم بنویسید
مثلا
case 3:

x=x*10;

case 4 :
x=x+8;

تو این حالت دو شرط or هستن و در صورت درست نبودن اولی برنامه نمیپره بیرون و دومی رو هم چک میکنه
محدودیت خاصی برای تعداد شروط وجود نداره
این دستور شاید برای تحلیل و تصمیم گیری درباره تعداد زیادی متغیر و یا حالتهای مختلف یه متغیر استفاده زیادی داشته باشه

خب تا الان تقریبا دستورها گفته شدن
فقط میمونه درستورات محاسباتی

hadi elec
4th February 2012, 09:33 PM
خب میرسیم به انواع عملگرها و توضیجاتشون

master_mind
4th February 2012, 10:18 PM
سلام دوست عزیز
بیشتر راجع به printf توضیح بدین چون خیلی کارایی بالایی داره

hadi elec
6th February 2012, 12:12 PM
سلام دوست عزیز
بیشتر راجع به printf توضیح بدین چون خیلی کارایی بالایی داره

خب چون ما اینجا اموزش رو برای برنامه ریزی آی سی داریم انجام میدیم
دستوراتی مثل scanf printf cin cout و امثالهم کاربردی ندارن
یعنی ورودی و خروجی ای سی رو با دستورات خاص دیگه ای بررسی میکنیم
این مطالی که گفته میشه برای استفاده توی نرم افزار code vision بیان میشه و هدف در نهایت برنامه نویسی در محیط کد ویژن هست
ممنون

hadi elec
6th February 2012, 12:52 PM
خب الان اطلاعاتمون برای برامه نویسی خوبه
خب میخوایم شروع کنیم
الان برنامه نویسی رو با همین اطلاعات موجود انجام میذیم و تنظیمات میکرو و کد ویژن رو کاری نداریم
ما اول باید برنامه نویسی یاد بگیریم بعد بریم سراغ تنظیمات

ما یه برنامه میخوایم بنویسیم که یه led با فرکانس 1 هرتز چشمک بزنه و یک led هم همواره بر خلاف led اولی عمل کنه و با اون not باشه
نظرتون چیه؟
ایده بدید تا ببینیم چنتا ایده میشه جمع کرد
برنامه رو کامل از اول تا اخر بنویسید
اینو میتونید به عنوان تمرین هم در نظر داشته باشید

hadi elec
6th February 2012, 01:00 PM
خب میرسیم به انواع عملگرها و توضیجاتشون

در مورد اون پستی که من عکس عملگر ها رو گذاشتم اینو بگم که
اونا عمگر ها هستن مثل جمع و تفریق و توان و تقسیم و ......
اونا رو بخونید و یاد بگیرید بخصوص and و or رو
اینا کلا بحث تقدم و تاخر دارن
یعنی بین علگر ها اولویت بندی هست که تو شکل ها مشخصه
اگر جایی متوجه نشدید بپرسید تا یاد بگیرید

hadi elec
6th February 2012, 09:58 PM
خب الان اطلاعاتمون برای برامه نویسی خوبه
خب میخوایم شروع کنیم
الان برنامه نویسی رو با همین اطلاعات موجود انجام میذیم و تنظیمات میکرو و کد ویژن رو کاری نداریم
ما اول باید برنامه نویسی یاد بگیریم بعد بریم سراغ تنظیمات

ما یه برنامه میخوایم بنویسیم که یه led با فرکانس 1 هرتز چشمک بزنه و یک led هم همواره بر خلاف led اولی عمل کنه و با اون not باشه
نظرتون چیه؟
ایده بدید تا ببینیم چنتا ایده میشه جمع کرد
برنامه رو کامل از اول تا اخر بنویسید
اینو میتونید به عنوان تمرین هم در نظر داشته باشید


خب ظاهرا کسی هنوز نظری نداده
من میخواستم امشب جوابو بگم ولی تا فردا شب صبر میکنم تا ببینیم کسی ایده ای برای این برنامه داره یا نه
الان با توجه به مطالب اموزش داده شده نوشتن این برنامه سخت نیست

عرفان سلیم زاده
7th February 2012, 09:06 PM
خب الان اطلاعاتمون برای برامه نویسی خوبه
خب میخوایم شروع کنیم
الان برنامه نویسی رو با همین اطلاعات موجود انجام میذیم و تنظیمات میکرو و کد ویژن رو کاری نداریم
ما اول باید برنامه نویسی یاد بگیریم بعد بریم سراغ تنظیمات

ما یه برنامه میخوایم بنویسیم که یه led با فرکانس 1 هرتز چشمک بزنه و یک led هم همواره بر خلاف led اولی عمل کنه و با اون not باشه
نظرتون چیه؟
ایده بدید تا ببینیم چنتا ایده میشه جمع کرد
برنامه رو کامل از اول تا اخر بنویسید
اینو میتونید به عنوان تمرین هم در نظر داشته باشید[nishkhand]
#include <stdio.h>
#include <delay.h>
int main()
{
while{
led=1;
delay_ms(1000);
led=0;
delay_ms(1000);
}
returno;
}

عرفان سلیم زاده
7th February 2012, 09:07 PM
[negaran] حواسم نبود اشتباه نوشتم[negaran]

hadi elec
7th February 2012, 09:13 PM
[nishkhand]
#include <stdio.h>
#include <delay.h>
int main()
{
while{
led=1;
delay_ms(1000);
led=0;
delay_ms(1000);
}
returno;
}



خب برای شروع بد نیست
فقط چنتا نکته وجود داره
1- تو برنامه ریزی ای سی فایل stdio وجود نداره
2- تابع به صورت viod نوشته میشه
3- return نداریم تو ای سی
4- از همه مهمتر اینکه شما متغیرتو تعریف نکردی
اینجا حتما برنامه ارور میده که متغیر led تعریف نشده هست
5- نکته اخر هم اینکه قرار بود دو تا led رو خلاف هم روشن و خاموش کنیم
حالا من درستش رو میگم شما اصلاح کن

hadi elec
7th February 2012, 09:29 PM
خب الان اطلاعاتمون برای برامه نویسی خوبه
خب میخوایم شروع کنیم
الان برنامه نویسی رو با همین اطلاعات موجود انجام میذیم و تنظیمات میکرو و کد ویژن رو کاری نداریم
ما اول باید برنامه نویسی یاد بگیریم بعد بریم سراغ تنظیمات

ما یه برنامه میخوایم بنویسیم که یه led با فرکانس 1 هرتز چشمک بزنه و یک led هم همواره بر خلاف led اولی عمل کنه و با اون not باشه
نظرتون چیه؟
ایده بدید تا ببینیم چنتا ایده میشه جمع کرد
برنامه رو کامل از اول تا اخر بنویسید
اینو میتونید به عنوان تمرین هم در نظر داشته باشید

این اولین نوع برنامه هست با یه متغیر کمکی
#include<mega16.h>
#include<delay.h>
bit x=0;
void main(){
while(){

led1=x;
x=!x;
led2=x;
delay_ms(1000);

{{

این دومین نوع برنامه بدون متغیر کمکی و با استفاده کمی پیچیده ای از منطق برنامه و دستورات


#include<mega16.h>
#include<delay.h>
void main(){
while(){

led1=!led1;
led2=!led1;
delay_ms(1000);

{{


خی اینم سومین نوع نوشتن هست که ساده ترین هست



#include<mega16.h>
#include<delay.h>
void main(){
while(){

led1=1;
led2=0;
delay_ms(1000);
led1=0;
led2=1
delay_ms(1000);
{{


اینجا چون led متغیر نیست و در واقع یه پورت خروجی از میکرو هست نمیشه به صورت متغیر تعریفش کرد بعدا درباره تعریف پورت به عنوان خروجی و یا ورودی صحبت میکنیم

hadi elec
7th February 2012, 09:34 PM
این برنامه ها رو از نظر تعداد خطوط با هم مقایشه کنید
فکر میکنید تو کدوم دستمون باز تره؟
شما فرض کنید این قسمت ممکنه 10 بار توی یه برنامه پیچیده تر بخواد به انواع مختلف تجرا بشه
کدوم بیشتر قابلیت تغییر داره؟
خب مسلما اولی
چون درواقع ما led هامون به وسیله یه منغیر دارن کنترل میشن نه بصورت مستقیم
در نظر داشته باشید که این متغیر میتونه خروجی یه قسمت دیگه ای از برنامه باشه
(بصورت پیش فرض ما این برنامه ها رو برای ای سی ATMEGA16 از سری میکروی های AVR نوشتیم)



اگر هم صرفا هدف روشن خاموش شدن مهم باشه برامون برنامه دومی ایده آل هست
سومی فقط جنبه اموزشی و تفهیم منطق و چگونگی عمل برنامه برای روشن و خاموش کردن LED ها داره

hadi elec
7th February 2012, 10:54 PM
تحلیل برنامه ها بصورت خط به خط:
(خیلی خیلی مهم)

برنامه اول

#include<mega16.h>

#include<delay.h>

bit x=0;

void main(){

while(){

led1=x;

x=!x;

led2=x;

delay_ms(1000
);

{{

خب اینجا ما به نرم افزار میگیم که میخوایم از at,ega16 استفاده کنیم تا خودش تنظیمات خاصی رو اتومات انجام بده

اینجا به برنامه میگیم که میخواییم از تابع تاخیری استفاده کنیم و اونو باید برامون تنظیم کنه

اینجا یه متغیری از نوع بیت و با مقدار اولیه 0 تعریف میکنیم یادتون هست که بیت فقط دو حالت داشت یا صفره یا یکه

اینجا تابع اصلی برنامه شروع میشه

اینجا یه حلقه بینهاست رو برای اجرای همواره دستورات ایجاد میکنیم

اینجا یکی از پورتهای میکرو رو که اسمشو بصورت قراردادی گذاشتیمled1 رو از نظر مقداری مساوی با متغیر x قرار میدیم یعنی اگر x یک هست اونم بشه 1 و اگر 0 هست اونم بشه 0

اینجا با استفاده از دستور not مقدار متغیر x رو not میکنیم اگر 0 بوده بشه 1 و اگر 1 بوده بشه 0 اینجا یه نکته ای هست توجه کنید چون نوع متغیر bit هست ما میتونیم از این دستور استفاده کنیم چون این متغیر دو حالت کلا میتونه داشته باشه اگر بیشتر از دو حالت میتونست داشته باشه دیگه not معنی نداشت

خب الان که مقدار متغیر x عوض شده و not شده میتونیم led2 رو با اون مقدار دهی کنیم و اینجوری مینویسیم

اینجا هم یه تاخیر یک ثانیه ای ایجاد میکنیم تا این حالت به وجود اومده یک ثانیه ثابت بشه و و ما نتیجه اتفاقات رو ببینیم بعد زا اجرای این دستور برنامه به خط بنفش قبلی میره و اونو اجرا میکنه اگر دقت کنید میبینید که مقدار متغیر الان دیگع 0 نیست و شده 1 پس الان برنامه کلا با یه مقدار دیگه شروع به کار میکنه و باز در انتهای برنامه متغیر مقدارش میشه 0 به خاطر اینکه دستورات ما انعطاف پذیری دارن و ورودیشون رو هم خودمون در اخر برنامه داریم تغییر میدیم میتونیم فقط یه تاخیر بنویسیو در صورتی که اگر به برنامه سوم ناه کنید میبینید که دو تا تاخیر وجود داره یکی برای روشن موندن ها و یکی هم برای خاموش موندن های لامپها خی ما با یه روش ساده برنامه رو خیلی خلاصه کردیم

اخر سر هم به تعداد اکولا های باز شده اکولاد میبیندیم تا مرز حلقه ها مشخص بشه

hadi elec
7th February 2012, 11:20 PM
در راستای اموزشی که داریم دو تا کتاب معرفی میکنم که خالی از لطف نیستن و واقعا به عنوان مرجعی قوی میشه بهشون نگاه کرد

اموزش avr به زبان c
نویسنده حمید بادامی نجات
انتشارات ایلار
خ انقلاب پاساژ فروزنده

اموزش میکروکنتلرهای avr
نویسنده جابر الوندی
انتشارات نص

من خودم شخصا با این دو تا کتاب یاد گرفتم
هر دوشو هم بخریدو بخونید[golrooz]

hadi elec
10th February 2012, 06:08 PM
خب تا اینجا اطلاعاتمون فکر کنم به حدی رسیده باشه که بتونیم بریم سراغ نرم افزار
از این بعد در مورد خود نرم افزار صحبت میکنیم و نکاتی که احیانا درباره برنامه نویسی اولیه جا مونده باشه رو میگیم و یواش یواش شروع به ساخت پروژه تو نرم افزار میکنیم
خب برنامه code vision avr رو میتئنید از اینجا (http://mihandownload.com/2011/03/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1Co deVisionAVR-2.05.0-Professional-2011-.php)دانلود کنید این تقریبا اخرین نسخه هست
البته تو گوگل اگر سرچ کنید سایتهای زیادی پیدا میکنید که از همشون میتونید این برنامه رو رایگان دانلود کنید
ورژن های این برنامه تفاوت زیادی با هم ندارن
در واقع هرچی میریم جلو تر امکانات برنامه بیشتر میشه که ما با توضیح مسایل اولیه مطالعه درباره امکانات اضافی رو به خودتون واگذار میکنیم کما اینکه اگر سوالی بود هم حتما جواب میدیم

وقتی برنامه رو دانلود کردید نصب کنید و حتما کارهای مربوط به لایسنس رو انجام بدید(پیچیده نیست)

کتاب ها رو هم اگر تهیه کنید خوبه

فکر کنم یه مثال دیگه برای برنامه حل کنیم بعد بریم سراغ نرم افزار بهتر باشه
خب درباره این برنامه هم فکر کنید تا من مقدمات نرم افزار رو اماده کنم

میخوایم یه برنامه بنویسیم که اگر قدار متغیر a که در واقع مقدار یکی از پورتهای ورودی هست 1 شد
اونوقت پایه portb.0 صد میکرو ثانیه 1 بشه و دوباره 0 بشه
و بعدش یک led با فرکانس 2 هرتز چشمک بزنه
و وقتی که مقدار متغیرa صفر شد
اونوقت پایه portb.1 صد میکرو ثانیه 1 بشه و دوباره صفر بشه
و بعدش همون led با فرکانس نیم هرتز چشمک بزنه

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

اصلا سخت نیست فقط کمی دقت میخواد
شما یک شرط ورودی دارید که کلا دو حالت میتونه داشته باشه
حالا ما میخوایم توی هرحالتی از ورودی دو خروجی خاص داشته باشیم
فرض کنید شما با سرعت چشمک زدن لامپ میخواید وضعیت ورودی رو بدونید خب اونوقت همچین برنامه ای براتون کاربردی میشه
و از طرفی از طریق پایه های portb.0 و portb.1 میخواهیم این اطلاعات رو به یه مدار دیگه بدیم
خب شروع کنید

عرفان سلیم زاده
10th February 2012, 06:58 PM
سلامhttp://uc-njavan.ir/images/wm23aau3m7xovpj0jyhx.gif
با صد بار ویراشhttp://uc-njavan.ir/images/cfi56afdnv2b8l93vn3.gif
خودمم نفهمیدم چی نوشتم:http://uc-njavan.ir/images/zx4js7ltv04jqeikqd.gif

be name khodahttp://uc-njavan.ir/images/cfi56afdnv2b8l93vn3.gif

#include <mega16.h>
#include <stdio.h>
#include <delay.h>
bit a;
bit b.0=0;
bit b.1=0;
bit led;
void main();{
if(a=1){
b.0=1;
delay_us(100);
b.0=0;
led=1;
delay_ms(500);
led=0;
delay_ms(500);}
if(a=0){
b.1=1;
delay_us(100);
b.1=0;
led=1;
delay_ms(2000);
led=0;
delay_ms(2000);
}}

hadi elec
10th February 2012, 07:48 PM
سلام[esteghbal]
با صد بار ویراش[nishkhand]
خودمم نفهمیدم چی نوشتم:[golrooz]

be name khoda[nishkhand]

#include <mega16.h>
#include <stdio.h>
#include <delay.h>
bit a;
bit b.0=0;
bit b.1=0;
bit led;
void main();{
if(a=1){
b.0=1;
delay_us(100);
b.0=0;
led=1;
delay_ms(500);
led=0;
delay_ms(500);}
if(a=0){
b.1=1;
delay_us(100);
b.1=0;
led=1;
delay_ms(2000);
led=0;
delay_ms(2000);
}}



خب خوبه
استعدادشو داری
ولی چنتا نکته::::::::::::
ما اصلا همچین دستور برای ic نداریم تو برنامه قبلی هم بهت گفته بودیم کلا اینو حذف کن
متغیر بیت برای زمانیه که میدونیم متغیرمون فقط دوحالت پیدا میکنه دقت کردی ؟ متغیر
پایه های ورودی و خروجی متغیر حساب نمیشن و اینجوری تعریف نمیشن

و اما برنامه....

خب ما اینا وقتی که ورودیمون تغییر میکنه باید دو تا عمل انجام بدیم
هم تغییر 100 میکرو ثانیه ایه یه پورت
و هم چشمک زدن یه پورت دیگه

خب م چجوری باید اینکارو بکنیم؟
بینید وقتی ما یه دستوری رو که فقط یه بار میخواد انجام بشه میخوایم انجام بدیم کار راحته
ولی بعد از اون یه دستور دیگه ای باید بصورت مداوم انجام بشه
ما این تداوم رو چجوری ایجاد کنیم؟؟؟؟؟


( با رنگها سعی میکنم نقاط مختلف رو تو صحبنهام به هم مربوط کنم- جمله های همرنگ به هم مربوط میشن)

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

#include<mega16.h>
#include<delay.h>
#define led PORTB.2

bit a=0;
bit b=0;

void main(){
while(1){

if ( a==1){

PORTB.0=1;
delay_us(100);
PORTB.0=0;

while(a==1){

led = b;
delay_ms(2000);
b=!b;
}
}


if(a==0){

PORTB.1=1;
delau_us(100);
PORTB.1=0;

while(a==0){

led=b;
delay_ms(500);
b=!b;
}
}

}}
payan


خب فکر کنم مشخص باشه درسته؟
بازم من خط به خط توضیح میدم چون ایجا یه دستور جدید رو هم میبینید که البته صرفا برای معرفی هست و محاسبه ای نداره
خودتون یه دور بخونید ببینید چجوریه

عرفان جان میتونی برنامه رو توضیح بدی؟
ممنون

عرفان سلیم زاده
10th February 2012, 08:07 PM
#include<mega16.h>

#include<delay.h>
#define led PORTB.2

bit a=0;
bit b=0;

void main(){
while(1){

if ( a==1){

PORTB.0=1;
delay_us(100);
PORTB.0=0;

while(a==1){

led = b;
delay_ms(2000);
b=!b;
}
}


if(a==0){

PORTB.1=1;
delau_us(100);
PORTB.1=0;

while(a==0){

led=b;
delay_ms(500);
b=!b;
}
}

}}
payan


معرفی ای سی
معرفی تاخیر زمان
ال ای دی به صورت ثابت در تمام برنامه پورت بی 2 باشه
متغییر a که فقط دو حالت هم داره 0 باشه
b هم همینطور
تابع void
یه حلقه بینهایت


خیلی سخت شد[negaran]

hadi elec
11th February 2012, 02:14 AM
[/LEFT]

معرفی ای سی
معرفی تاخیر زمان
ال ای دی به صورت ثابت در تمام برنامه پورت بی 2 باشه
متغییر a که فقط دو حالت هم داره 0 باشه
b هم همینطور
تابع void
یه حلقه بینهایت


خیلی سخت شد[negaran]

خب خوبه
خوب گفتی
اما اصلا سخت نیست





( با رنگها سعی میکنم نقاط مختلف رو تو صحبنهام به هم مربوط کنم- جمله های همرنگ به هم مربوط میشن)
#include<mega16.h>
#include<delay.h>
#define led PORTB.2

bit a=0;
bit b=0;

void main(){
while(1){

if ( a==1){

PORTB.0=1;
delay_us(100);
PORTB.0=0;

while(a==1){

led = b;
delay_ms(2000);
b=!b;
}
}


if(a==0){

PORTB.1=1;
delau_us(100);
PORTB.1=0;

while(a==0){

led=b;
delay_ms(500);
b=!b;
}
}

}}
payan


ممنون


ببین ما اینجا همونطور که گفتم کلا دو حالت یا داریم
یا ورودیمون مقدار 0 داره یا 1
پس با یه شرط این دو حالت رو از هم سوا میکنیم و شروع میکنیم به تشریح اتفاقات هر بخش
این دو بخش با هم حالت or دارن یعنی به هیچ عنوان همزمان پیش نمیان
پس تداخلی هم ندارن
حالا برای حالت اول:
خب اول باید اون پورتی رو که معرفی کرده بودیم رو 100 میکرو ثانیه ست کنیم و بعدش ریست اینم که معلومه
اما بعدش
خب اینجا ما باید یه برنامه چشمک زن بنویسیم که تا زمانی که وردی ثابت هست برنامه اجرا بشه از if نمیشه استفاده کرد چون فقط یک بار اجرا میشه و برای اجرای بعدیش بقیه خطوط رو هی بررسی میکنه
پس میایم از دستور while استفاده میکنیم که خیلی راحت بی نهایت بار(تا زمانی که شرط نقض نشده باشه) کاری رو که میخوایم انجام بده

اما چرا دستور while رو داخل دستور if نوشتیم؟
اینجا مهمه
برای این ما توی if نوشتیمش که کلا تحت کنترل دستور if باشه و اگر if اجرا نشد اون هم اجرا نشه
وقتی شرط if درست میشه برنامه واردش میشه و بعد از اجرای دستورات ست و ریست کردن 100 میکرو ثانیه ای
میره سراغ while و درستوراتشو اجرا میکنه و وقتی که شرط while نقض شد خود به خود شرطif هم نقض شده پس برنامه کلا از این در میاد و میره به بررسی شرط دوم if میپردازه
فرق این حالت با حالتی که while داخل if نباشه اینه که اینجا سرعت اجرای برنامه بیشتره

به طرز نوشته شدن اسم پورتها دقت کنید
با حروف بزرگ نوشته میشن دقیقا مثل بالا
به تعداد اکولاد ها هم توجه کنید

hadi elec
25th February 2012, 02:14 PM
خب حالا میریم سراغ نرم افزار و درست کردن پروژه تو برنامه

اول برنامه رو نصب میکنید و لایسنسشو فعال میکنید

بعد وقتی برنامه رو باز میکنید

از منوی فایل روی new کلیک کنید پنجره زیر باز میشه

http://www.uc-njavan.ir/images/x604q5an0d68wx4jo9yx.jpg (http://www.uc-njavan.ir/)

بعد با کلیک کردن روی project کلید ok رو بزنید
پیغامی باز میشه که میگه شما میخواید از برنامه کد ویزارد استفاده کنید
که این پیغام رو yes کنید

http://www.uc-njavan.ir/images/i7lkcdwfzalukzi4gblv.jpg (http://www.uc-njavan.ir/)

پیغامی میاد که شما نوع میکرو رو انتخاب میکنید که ما نوع غیر از XMEGA رو انتخاب میکنیم

http://www.uc-njavan.ir/images/ktm4yeshuc0epzc7l8b.jpg (http://www.uc-njavan.ir/)

صفحه کد ویزارد باز میشه
(این برنامه درواقع به شما کمک میکنه که با صرف وقت کمتری نوع چیپ و تنظیمات ورودی ها و خروجی ها و امکانات دیگه میکرو رو فقط با چنتا کلیک ساده انجام بدید)

http://www.uc-njavan.ir/images/4myhkeyh1jx5yhn3m8t.jpg (http://www.uc-njavan.ir/)

در قسمت اول نوشته شده chip
که این جا نوع چیپ و مقدار کلاک پالس رو تعریف میکنیم
ما atmega16 با کلاک 1 مگ رو انتخاب کردیم

http://www.uc-njavan.ir/images/6go6eyibgqdkgvrf6z1z.jpg (http://www.uc-njavan.ir/)

تو منوی کناریش نوشته شده ports
که اینجا تنظیمات مروبط به ورودی یا خروجی شدن پایه ها رو به همراه تعیین مقدار اولیه اونها انجام میدیم
دقت کنید کلا 4 حالت ممکنه وجود داشته باشه
1- پایه ورودی با مقدار اولیه 1( فعال بودن مقاومت pull up درونی)
2- پایه ورودی با مقدار اولیه 0
3- پایه خروجی با مقدار اولیه 1
4- پایه خروجی با مقدار اولیه 0

http://www.uc-njavan.ir/images/v1d7u0ekzpzdk0xx8446.jpg (http://www.uc-njavan.ir/)

من در مورد پورت A همه 4 حالت ر انجام دادم که ببینید
(برای تنظیمات ورودی و خروجی در کل هیچ محدودیتی از نظر تعداد پین های یه پورت نیست)

hadi elec
25th February 2012, 03:01 PM
خب منوی بعدی در رابطه با تنظیمات وقفه های میکرو هست
یه توضیح کوچیکی بار یوقفه میدم برای دوستانی که نمیدونن چیه
ببینید ما میتونیم دو جور میکرو رو برنامه ریزی کنیم که در ارتباط با نوع وجود خروجی رو تغییر بده

نوع اول : اینکه بگیم میکرو دائما ورودی رو بخونه تا در صورت بروز تغییری خروجی مناسب اعمال کنه
نوع دوم : اینکه بگیم هر وقت تو ورودی تغییری به وجود اومد پیغامی به مرکز میکرو برسه و میکرو رو از این تغییر اگاه کنه

خب نوع اول خیلی بهتره چون دیگه نیازی نیست میکرو دائما مشغول خوندن پایه باشه و زمان از دست بره
بنابر این برای تظیم کردن میکرو برای عمل به صورت نوع دوم، از ابزاری به نام وقفه استفاده میکنیم

که اینجا میبینید

http://www.uc-njavan.ir/images/z8hs3bd7j74mns2lkpbc.jpg (http://www.uc-njavan.ir/)

تعداد پایه هایی که میتونن به عنوان ورودی های وقفه توی میکرو atmega16 استفاده بشن 3 تا هست
به عبارت دیگه این میکرو 3 تا روال وقفه داره

int0
int1
int2

خب من الان هر 3 تا فعال کردم

اما انواع وقفه:
همونطور که این پایین میبینید 4 نوع وقفه داریم

low level : حساس به سطح صفر ------- وقتی سطح ولتاژ پایه به صفر میرسه روال وقفه اتفاق میوفته
any change : حساس به هر نوع تغییری ------ در برابر هر نوع تغییری در سطح ولتاژ روال وقفه اتفاق میوفته
falling edge : حساس به لبه پایین رونده ------ در زمان کاهش سطح ولتاژ روال وقفه اتفاق میوفته
rising edge : حساس به لبه بالا رونده ----- در زمان افزایش سطح ولتاژ روال وقفه اتفاق میوفته

http://www.uc-njavan.ir/images/ees8eya7lmy4oqefy4k.jpg (http://www.uc-njavan.ir/)

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

نکته مرگ آور: از اونجایی که هر وقفه یه پایه مشخص در میکرو داره برای تنظیم اون پایه به صورت عکلکرد وقفه وار باید حتما حتما قبلا اون بصورت ورودی و با مقدار اولیه مناسب با شرط و تنظیمات تنظیم کنید

hadi elec
25th February 2012, 03:12 PM
اما تایمر ها
خب برگه بعدی تایمر ها هستند
باز اینجا 3 تا تایمر داریم

تو قسمت clock value با انتخاب ضریب کلاک پالس تایمر رو فعال میکنیم

و با زدن تیک مربوط به overflow intrrupt تهیین میکنیم که بعد از سرریز شدن مقدار کانتر تایمر یک روال وقفه در خود میکرو اتفاق بیوفته

timer value هم مقدارش صفر هست که شما به هگز اونو میتونید مقدار دهی کنید
اون از 0 تا 255 هگر میشمره با توجه به سرعت کلاک پالس و در زمانی که 255 گذشت سر ریز میشه و وارد حلقه میشه و دستوراتی که شما نوشتید رو یک بار اجرا میکنه
شما میتونید با گذاشتن مقدار اولیه مناسب این زمان بندی رو کنترل کنید
با توجه به کلاک پالس 1 مگ من مقدار اولیه رو 37 گذاشتم که تا 255 200 تا فاصله هست
پس کل این پروسه تا اجرای وقفه 200 میکرو ثانیه طول میشکه که اگر یه شرط 5000 بار اجرا براش بذارید میتونید یه تایمر 1 ثانیه ای داشته باشید
(توضیحات اجرایی باشه باری بعد)


http://www.uc-njavan.ir/images/zxd2q5g09vqu8q1ff0e5.jpg (http://www.uc-njavan.ir/)

منوی بعدی که به درد میخوره lcd هست

با زدن تیک فعال میشه
و شما تعداد خطوط کارکتری رو برای lcd تعیین میکنید (با فرض استفاده از lcd 16*2 --تعداد خطوط 16 انتخاب شده)
و بعد پورت رو تعیین میکنید

نکته1: وقتی یه پروت رو به عنوان lcd تعیید میکنید دیگه از اون پورت استفاده دیگه ای نمیتونید بکنید
نکته 2: سعی کنید تمام پایه های lcd رو توی یه پورت تعریف کنید و منظم باشه(گرچه این امکان در ورژن های بالا فقط وجود داره)


http://www.uc-njavan.ir/images/if3t6rzr78yyrp1bggri.jpg (http://www.uc-njavan.ir/)



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

hadi elec
25th February 2012, 03:22 PM
حالا کارمون تموم شد
و میرسیم به save کردن

وارد منوی program میشیم ,و generate رو انتخاب میکنیم

http://www.uc-njavan.ir/images/9zqvg2cz1yaef0rxh2hh.jpg (http://www.uc-njavan.ir/)

اینجا 3 بار و به 3 فرمت مختلف شما باید پروژه رو سیو کنید
من پیشنهاد میکنم که هر 3 بار رو به یه اسم سیو کنید


http://www.uc-njavan.ir/images/mabshsyfo21ijqa4qh6.jpg (http://www.uc-njavan.ir/)
http://www.uc-njavan.ir/images/2cr68lm8v6sa11q4pieu.jpg (http://www.uc-njavan.ir/)
http://www.uc-njavan.ir/images/dlmdnd76dsa33klb1md0.jpg (http://www.uc-njavan.ir/)



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

http://www.uc-njavan.ir/images/79buh80iff4rinzq1.jpg (http://www.uc-njavan.ir/)


اما محل دقیق نوشتن کد ها کجاس؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یادتون هست ما قبلا درباره ایجاد یه حلقه بی نهایت صحبت میکردیم؟؟؟؟؟؟؟؟؟؟
خب خود برنامه برامون این حلقه رو ایجاد کرده و گفته که کد ها رو این جا بنویسیم

http://www.uc-njavan.ir/images/wcjce4935mmcql7aitrl.jpg (http://www.uc-njavan.ir/)


خب تا الان ما با ایجاد یه پروژه و تنظیمات اون اشنا شدیم
اما باید یه تصمیمی بگیریم برای اینکه ببینیم چه مداری میخواهیم درست کنیم
بعد جدی تر پروژه ایجاد کنیم و تنظیمات رو انجام بدیم برنامه رو بنویسیم و کامپایل کنیم و به شبیه سازی برسیم
(برای شبیه سازی از برنامه پروتئوس تو اموزش استفاده میکنیم)

hadi elec
2nd March 2012, 11:48 AM
خب الان دیگه وقتشه که یه پروژه تعریف کنیم و شروع به برنامه نویسی و ساخت و شبیه سازیش بکنیم

پروژه اینه :

یک led سبز به پورت b.0 وصل کردیم که باید دائما در طول اجرای برنامه چشمک بزنه

دو تا کلید فشاری به میکرو وصل کردیم(کدوم پایه مناسبه؟) که با زدن اونها و وقتی که مقدار پایه ورودی یک منطقی شد ( با int0 سرعت چشمک زدن لامپ سبز بیشتر بشه و با int1 سرعت چشمک زدن کم بشه)

یه دیپ سوئیچ 8 پین به پورت a وصل میکنیم که با تغییر حالت کلیدهاش پایه متناظر اون روی پورتd تغییر حالت بده (به پورت c لامپ قرمز وصل میکنیم)

خب من عکس پایه های atmega16 رو میذارم کمی روی پایه هاش فکر کنید و ایده ای برای برنامه اش پیدا کنید

توی پروتئوس هم شماتیک رو میکشم و اینجا میذارم تا کامل صورت مسئله رو متوجه بشید


ایده بدید و بگید از چه امکاناتی باید استفاده کرد؟

بانوثریا
2nd March 2012, 11:54 AM
سلام با دستورات setوresetمیتونیم این کارارو انجام بدیم باید بدونیم ledبه کدوم پورت وصل شده بعد اون پورت رو 1 و بعد یه زمان براش میذاریم بعد دوباره پایه رو صرفر میکنیم و این کار رو تو یه حلقه انجام میدیم من این کار رو رو تراشه atmeg16انجام دادم

hadi elec
2nd March 2012, 12:11 PM
سلام با دستورات setوresetمیتونیم این کارارو انجام بدیم باید بدونیم ledبه کدوم پورت وصل شده بعد اون پورت رو 1 و بعد یه زمان براش میذاریم بعد دوباره پایه رو صرفر میکنیم و این کار رو تو یه حلقه انجام میدیم من این کار رو رو تراشه atmeg16انجام دادم

خب درسته ولی کامل نیست
شما متن زرد رنگ رو چجوری اجرا میکنی؟

بانوثریا
2nd March 2012, 12:22 PM
اون موقع با دو تا برنامه کار میکردیم یکیش برنامه رو توش کامپایل می کردیم یکیش هم ای سی و ال ای دی رو می اوردیم و بعد برنامه رو به تراشه معرفی میکردیم الان اسم برنامه دقیق یادم نیست اگه خواستید میرم نگا میکنم

hadi elec
2nd March 2012, 12:23 PM
این عکس پایه های میکرو


http://www.uc-njavan.ir/images/4rtlqt7h48rtk3civow.gif (http://www.uc-njavan.ir/)



اینم شماتیک مدار
(برای راحتتر شدن مدار و برنامه نویسی قسمتی از سوال رو ویرایش کردم)

http://www.uc-njavan.ir/images/v3ppivqvh3bt2oldbzo8.jpg (http://www.uc-njavan.ir/)

hadi elec
2nd March 2012, 12:36 PM
اون موقع با دو تا برنامه کار میکردیم یکیش برنامه رو توش کامپایل می کردیم یکیش هم ای سی و ال ای دی رو می اوردیم و بعد برنامه رو به تراشه معرفی میکردیم الان اسم برنامه دقیق یادم نیست اگه خواستید میرم نگا میکنم

خب از این بگذریم

ما با یه برنامه و با استفاده از امکانات میکرو این پروژه رو طراحی میکنیم
من عکس شماتیک رو گذاشتم برای راهنماییییییی

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

پس دیگه کار باید راحت باشه

کمی فکر کنید

hadi elec
2nd March 2012, 08:49 PM
لازمه به یه نکته اشاره کنم

خب دوستان برنامه کد ویژن زمانی که یه پروژه رو سیو میکنه به چند فرمت این کارو انجام میده
حالا بعضی از این فرمتا مهمن و کاربرد دارن برامون

یه فرمت فرمت c هست که در واقع همون سورس برنامه هست که با word pad ویندوز هم باز میشه شما با تغییر محتویاتش نمیتونید برنامه رو عوض کنید

یه فرمت cof که خیلی مهمه و برای شبیه سازی از این فرمت استفاده میکنیم بخصوص تو برنامه ای مثل پروتئوس

hex این فرمت هم مثل cof میمونه ولی تو ورژن هتی جدید دیگه نرم افزار موقع سیو کردن این فرمت رو ایجاد نمیکنه


ما از این به بعد با cof کار داریم

hadi elec
25th April 2012, 03:01 PM
با سلام
دوستانی زیادی تو این مدت از من درباره معرفی کتاب اموزش avr پرسیدن
منم تصمیم گرفتم همینجا چنتا کتاب معرفی کنم که دوستان بتونن تو نمایشگاه کتاب تهیه کنن

اموزش avr به زبان c
نوشته : حمید بادامی نجات
انتشارات : ایلار


اموزش avr
نویسنده: جابر الوندی
انتشارات : نص

این دوتا کتاب اموزش کامل avr به زبان c هستند که برای یادگیری خیلی خوبن

یک کتاب دیگه هم هست که درواقع بحث اموزشی خاصی شاید نداشته باشه و بیشتر مجموعه دیتا شیت فارسی از میکرو ها هست

کتاب معروف علی کاهه (avr به زبان بیسیک) که برای کسایی که میخوان با زبان بیسیک اشنایی پیدا کنن خوبه

http://www.uc-njavan.ir/images/fmm7wb4b0p2toghpwfre_thumb.jpg (http://www.uc-njavan.ir/viewer.php?file=fmm7wb4b0p2toghpwfre.jpg)
http://www.uc-njavan.ir/images/8xyg70ewkjo5ak4gal3k_thumb.jpg (http://www.uc-njavan.ir/viewer.php?file=8xyg70ewkjo5ak4gal3k.jpg)
http://www.uc-njavan.ir/images/qd9yll01polukwxn2z3_thumb.jpg (http://www.uc-njavan.ir/viewer.php?file=qd9yll01polukwxn2z3.jpg)
http://www.uc-njavan.ir/images/e4ql8xlu5fg4m6jd2f4y_thumb.jpg (http://www.uc-njavan.ir/viewer.php?file=e4ql8xlu5fg4m6jd2f4y.jpg)

hadi elec
13th May 2012, 11:02 PM
خب الان دیگه وقتشه که یه پروژه تعریف کنیم و شروع به برنامه نویسی و ساخت و شبیه سازیش بکنیم

پروژه اینه :

یک led سبز به پورت b.0 وصل کردیم که باید دائما در طول اجرای برنامه چشمک بزنه

دو تا کلید فشاری به میکرو وصل کردیم(کدوم پایه مناسبه؟) که با زدن اونها و وقتی که مقدار پایه ورودی یک منطقی شد ( با int0 سرعت چشمک زدن لامپ سبز بیشتر بشه و با int1 سرعت چشمک زدن کم بشه)

یه دیپ سوئیچ 8 پین به پورت a وصل میکنیم که با تغییر حالت کلیدهاش پایه متناظر اون روی پورتd تغییر حالت بده (به پورت c لامپ قرمز وصل میکنیم)

خب من عکس پایه های atmega16 رو میذارم کمی روی پایه هاش فکر کنید و ایده ای برای برنامه اش پیدا کنید

توی پروتئوس هم شماتیک رو میکشم و اینجا میذارم تا کامل صورت مسئله رو متوجه بشید


ایده بدید و بگید از چه امکاناتی باید استفاده کرد؟

خب با کمی تاخیر مباحث کلاس رو ادامه میدیم

اخرین پروژه رو با مرور شروع به تشریح و طراحی میکنیم

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

برای این کار باید از وقفه های میکرو استفاده کرد
وقفه ها رو کامل توضیح داده بودیم
باز هم روالی کاملا موازی با بدنه اصلی برنامه
برای کم و زیاد شدن سرعت هم میتونیم مقدار دهی تایمر رو تغییر بدیم

این راحتترین کار هست
مقدار دهی یک پورت 8 بیتی با یه پورت 8 بیتی دیگه

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد