آموزش میکروکنترولر AVR از ابتدا تا پیشرفته

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

مطالب برایتان مفید بود

عالی و ساده بود،ادامه دهید
26
79%
خوب و قابل فهم بود،ادامه دهید
7
21%
ساده و قابل فهم نبود.
0
بدون راي
تکراری و سخت بود.
0
بدون راي
 
مجموع رای گیری: 33

Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
با سلام


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

برنامه نویسی ما در این تاپیک،بر اساس نرم افزار بسیار خوب کدویژن می باشد! کدویژن در واقع همان برنامه نویسی C می باشد که برای کارهایی ما بهینه شده،اما چرا کدویژن!؟

کدویژن دارایه امکانات متنوعی می باشد،که ما به کمک انها می توانیم برنامه نویسی راحتر و ساده تری انجام دهیم! ضمن اینکه در عین ساده تر بودن،می توانیم کارها پیشرفته تری انجام دهیم ! کدویژن همه میکروکنترولرهای سری Tiny و Mega و Xmega را پشتبانی می کند!

اما ویژگی ها کد ویژن

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

دیدن کد اسمبلی!
تصویر
یکی از قابلیت ها جالب کدویژن که ان را حرفه ی کرده است،دیدن کدهای اسمبلی نوشته شده،توسط ما می باشد. به عبارت ساده تر،وقتی ما کدهایی خود را به زبان C می نویسیم،می توانم همان کدهای نوشته شده خودمان را به زبان اسمبلی ببینیم و در صورت نیاز ان را تغییر بدهیم.

دیدن میزان حافظه ها استفاده شده(Sram و Flash و eeprom و ..)

وقتی که ما برنامه خود را می نویسیم،می توانیم به راحتی ببینیم که چه میزان برنامه نوشته شده توسط ما از فضاهای مثل رم و اس رم و فلش و ای ای پی رام میکروکنترولر استفاده می کند ...
تصویر
وقتی ما در کدویژن برنامه خود را ذخیر می کنیم،سیستم میزان استفاده شدن حافظه را به ما میدهد.
تصویر
در صفحه ای جداگانه می توانیم با جزییات بیشتر میزان حافظه استفاده شده را ببینیم.
  افزار کدویژن امکانات بیشتری نیز دارد،که انشالله به مرور به ان اشنا خواهید   به [External Link Removed for Guests]ادرس بروید و اخرین نسخه کدویژن را دانلود و طبق اموزش نصب کنید.  در پست بعدی مبحث متغیرها شروع میشود انشالله  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
با سلام


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

ساختار کدها در برنامه نویسی (کدویژن)

همین طوری نمی شود،ما مجموعه از کدها را بنویسیم،و میکرو انها را انجام دهد! برای اینکه برنامه ها بهترین بازدهی را داشته باشند،باید طبق اصول گفته شده(توسط سازنده نرم افزار) ما برنامه را بنویسیم

ساختار برنامه نویسی کدویژه
تصویر
=============
Please Login or Register to see this code

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

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

فایل ها سرامد یا پیش پردازندها

میکروکنترولر ابتدا فایل ها سرامد را می خواند و تنظیمات خود را براساس ان اعمال می کند.
اولین فایل سرآمد باید کتابخانه میکروکنترولر ما باشد. به عنوان مثال اگر ما از میکروکنترولر Atmega8 استفاده کنیم،باید ان را به مانند شکل زیر بنویسیم

<include <mega8.h#

نرم افزار کدویژن برای همه میکروکنترولر یک کتابخانه مخصوص دارد،که به کمک ان می توانیم همه واحدها میکرو رو مقداری و تنظیم اولیه کنیم.(*لازم به ذکر است اگر فایل معرفی میکروکنترولر مورد نظر را درست انتخاب نکنیم،میکرو مورد نظر کار نخواهد کرد!)

وقتی که ما فایل سرامدی ،به مانند <include <mega8.h# وارد کردیم،مجموعه کدهای زیر بر روی میکروکنترولر اعمال و قرار می گیرد..(که حاوی کدهایی مقدار دهی سخت افزار و واحدهای میکروکنترولر ATMEGA8 می باشد)
Please Login or Register to see this code Please Login or Register to see this code

اما به غیر فایل سرامد معرفی میکروکنترولر. ما فایل سرامد و کتابخانه های دیگر نیاز داریم که برای کار کردن با میکروکنترولر بسیار عالی و مفید می باشند(به عنوان مثال کتابخانه برای انجام محاسبات ریاضی! یا متغیر ها و ... ! ) کتابخانه دست ما را برای انجام کارها بسیار باز می گذارند،که انشالله در اینده با ان اشنا خواهیم شد.(چون مبحث زیادی دارد)

لازم به ذکر است همه فایل ها سرآمد و کتابخانه با include# معرفی میشوند. و بازهم این نکته قید می کنم،میکروکنترولر قبل از هر چیز،کدهایی فایل ها سرآمد را بر روی خود اعمال و لود می کند(یعنی با هر بار ریستارت یا خاموش شدن و ..!)

تعریف شناسه ها یا ثواب ها!

ما یک سری شناسه ها داریم برای راحتی کار و توسعه کارها و برنامه نویسی بهتر! فرض کنید، می خواهیم با PORTC.0 دستوری بدهیم. اما اگر بخواهیم دائم نام پایه مربوط را بنویسیم،شاید چندان خوب نباشد(از لحاظ ذهنی و اشتباهات فردی!)،ضمن اینکه بعضی وقت ممکن است،در 10 تا 20 خط برنامه نویسی ،ما از PORTC.0 استفاده کنیم،اما ناگاهان متوجه بشویم! ما از پایه PORTC.1 داریم استفاده می کنیم،ان وقت باید برگردیم و کلیه PORTC.0 را که نوشته ایم به PORTC.1 را تغییر بدهیم که وقت ما را زیاد می گیرد. راه ساده تر این است که ان را در ابتدا کار تحت یک نام خاص در بیاوریم،تا در صورت نیاز ان را تغییر سراسری بدهیم
Please Login or Register to see this code حال بجایی اینکه در برنامه بگویم PORTC.0 فلان دستور را انجام بده! می گویم clock ،کار مد نظر را انجام بده...(clock در واقع همان PORTC.0 می باشد) و می توانیم به راحتی هر وقت خواستیم پایه مربوطه را تغییر بدهیم .
نکته قابل ذکر،اجباری در استفاده از شناسه ها در برنامه ها نیست،و می توانید از انها استفاده نکنید
همه شناسه ها به define# معرفی میشوند .

*لازم به ذکر است،ما می توانیم در شناسه به غیر معرفی پایه ها IO و .. یک عدد و یا نام هم قرار دهیم

اما متغیرها..

ادامه دارد...
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام


متغیرها

اما یکی از اصلی ترین و پایه ترین مسائل در علوم برنامه نویسی همین متغیرها هستن! متغیرها در واقع جسم های بی روحی هستن،که ما طی مکانیزم خودمان انها را فعال و طرح ریزی می کنیم!

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

به عنوان مثال می خواهیم دو عدد را جمع کنیم.

اگر در محیط برنامه نویسی اینطور بنویسیم

24*25
!
نتیجه باید به کجا و چطور انتقال پیدا کند؟!!!

اما اگر یک متغیر x و z را به برنامه معرفی کنیم و به X مقدار 24 را بدهیم و به z مقدار 25 را بدهیم ، انگاه بهتر خواهد شد،به عنوان مثال !

z=x*z

یعنی مقدار x که عدد 24 می باشد را ضربدر مقدار z که 25 می باشد کن! و بعد نتیجه را در متغییر z قرار بده..

چه چیزی می توان درون متغیرها قرار داد؟!

درون متغیر ها می توان،اعداد و حروف،کدها (هگز،دسیمال،باینری،اسکی) قرار داد . بطور کلی می توان درون متغیرها همه چیز قرار داد، و ما به تک تک این کدها و اعداد و .. که درون متغیرها می ریزیم نیاز داریم .

متغیر چطور تعریف میشوند؟!

یکی از تفاوت ها معماری ریسک و CISE در این است که ما می توانیم اندازه متغیرهایمان را خودمان تایین کنیم، در واقع می توانیم بگویم متغیر تک بیتی باشد،یا متغیر 8 بیتی باشد یا 16 بیتی باشد، اعداد (منفی) تا (مثبت) را از یک میزان خاص بگیرید،یا که اصلا اعداد منفی را نگیرید و از 0 به بعد محاسبه کند.اعداد اعشاری را بگیرید یا که نگیرید و ...(منظور از بگیرد،یعنی قبول کند،یا که درون خودش قرار بدهد یا ندهد)

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

به عنوان مثال فرض کنید،ما در یک از برنامه هایمان،نیازه به یک متغیر داریم،که نهایت عددش بالاتر از 30 تا 40 نمی رود! برای این منظور اگر از یک متغیر 32 بیتی استفاده کنیم! منابع زیادی رو بی خودی برای این کار اختصاص داده ایم.


نحویه تعریف کردن متغیر در برنامه


این لیست کامل متغیرهای پشتبانی شده کدویژن:

تصویر
  در کدیژن هر وقت بخواهیم یک متغیر تعریف کنیم،باید قبلش نوع متغیر بعد نام متغیر را انتخاب کنیم .   
  چارچوب تعریف یک متغیر: ابتدا نوع متغیر+نام متغیر+ مقدار متغیر.   عنوان مثال می خواهیم یک متغیر 8 بیتی از نوع char استفاده کنیم . باید ان را اینطور تعرف   
  ;char Xmen=20   بالا ابتدا نوع متغیر که از نوع char بود تعریف کردیم( char شامل اعداد -128 تا 127 می باشد) سپس برای متغیرمان نامی را تعریف کردیم (که ما Xmen را انتخاب کردیم) سپس مقدار 20 را به ان دادیم(یا که ریختیم یا دادیم) ، پس در برنامه هرجا که Xmen نوشته شود، برنامه ما آن را عدد 20 فرض می داند (یعنی مقداری که در ان قرار دارد)  ! این علامت ; باید همیشه بعد از اتمام دستور یا تعریف قرار داده شود،اگر قرار داده نشود!سیستم نمی تواند متوجه بشود که خط دستوری تمام شده یا که خیر. پس همیشه بعد از پایان هر خط دستوری علامت ; گذاشته میشود   یک موضوع فرعی  "تعریف نام در متغیر به چه شکل می باشد!"   در متغیر می تواند هر چیزی باشد، به غیر از دستور! یعنی شما نمی توانید خود char که یک دستور شناخته شده توسط کدویژن است را به عنوان نام قرار دهید! اما می توانید z و x یا هر نامی حتا جمله ی را به عنوان متغیر قرار دهید به عنوان مثال:  =  =  =  =salam_  -disk=  =  =   و...   دست ما برای انتخاب نام متغیر حسابی باز است، به غیر از نکته ی که در ابتدا گفته شده،نکته مهم دیگری وجود، سیستم بین حروف کوچک و بزرگ تفاوت قائل میشود! به این نکته دقت کنید! یعنی اگر شما تایپ کنید Z و یک متغیر دیگر با حروف گوچک z بنویسید، این دو متغیر کاملا باهم دیگر متفاوت می باشند.  چرا هشت بیتی ها شامل 256 عدد هستن!   زمانی که نوع متغیر ها را دیدید به این نکته رسیدید که همه هشت بیتی ها 256 عدد می باشند!    بخاطره داشته باشید در اینصفحه ان را توضیح دادیم.هشت بیت جمعا می تواند 256 حالت مختلف را به وجود اورد، که به کمک این همین مسئله،می توان 256 عدد را شمرد ( حالا از -128 تا 127 و یا 0تا 255 )   اگر متغیر 16 بیتی باشد 65536 حالت مختلف که می توان 65536 را شمارش کرد (در حالت منفی از -32768 تا 32767 را شمارش کرد و در حالت غیر منفی از 0 تا 65535 )   اگر متغیر 32 بیتی باشد 4,294,967,296 حالت مختلف که می توان 4,294,967,296 را شمارش کرد و...  
  این متغیرها که همگی اعداد را می شمارند!پس حروف را چطور متوجه میشوند؟!   ها همگی با یک شماره خاص خواند میشوند،جدول زیر را  
تصویر
  که می ببینید،برای همه حروف یک عدد خاص در نظر گرفته شده است. به جدول بالا،جدول کدهای اسکی Acii گفته میشود .    اسکلی مجموع حروف،کارکتر و اعداد هستن،که ما می توانیم انها را بر روی LCD ها نمایش دهیم یا که جاهایی که نیاز است به زبان صحبت کنیم،استفاده می کنیم .    برای هر کارکتر اسکی، یک مقدار HEX (هگز) و DEC (دسیمال) وجود دارد. دسیمال در واقع همان اعداد هستن که ما تا به الان انها را توضیح دادیم . انشالله در اینده هگز و دسیمال و .. را بیشتر توضیح خواهیم داد   
  مبحث متغیرها هنوز تمام نشده.. انشالله ادامه خواهد داشت.  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام

ادامه مبحث متغیرها.
تصویر
متغیر از نوع bit

این نوع متغیر تنها 1 بیتی می باشد و می تواند عدد 0 و یا 1 را در ان قرار داد.

به عنوان مثال

;bit x=1

در برنامه ها معمولا بعضی جاها نیاز است فقط از یک 0 و 1 استفاده کنیم،استفاده از متغیر bit فضایی بسیار کمتری را نسبت به سایر متغیرها اشغال می کند.

متغیر از نوع bool

این نوع متغیر،از نوع 8 بیتی می باشد، اما! به مانند bit دو عدد 0 و 1 را پشتبانی می کند !
شخصا از این متغیر تابحال استفاده نکردم !
مقدار متغیرهای bool باید یا false (به معنی 0) یا true (به معنی 1 ) باشد.
به عنوان مثال
;bool x=true
به کمک این متغیر می توان در برنامه ها استفاده کرد

متغیر signed char و char

این دو متغیر به مانند هم هستن! تفاوتی نمی کند،که در برنامه بنویسید char و یا signed char ( *که پیشنهاد میشود برای راحتی کار همان char را بنویسید)
این متغیر 8 بیتی می باشد و اعداد -128 تا 127 را پشتبانی می کند و می شناسد.
به عنوان مثال

;char x=125
یا
;signed char x=125

لازم به ذکر است متغیر char جزو معروف ترین و پر استفاده ترین نوع متغیرهای کدویژن می باشد! (به دلیل کم حجم بودن و کمتر اشغال کردن فضا ها و راحتی کار و ...)


متغیر unsigned char

این متغیر از نوع هشت بیتی می باشد، و از اعداد 0 تا 255 عدد را پشتبانی می کند (به مانند char ساده می ماند،با این تفاوت که اعداد منفی را شناسایی نمی کند)

به عنوان مثال

;unsigned char x=254

لازم به ذکر است این متغیر به مانند char جزو پرکاربردترین و معروف ترین متغیرهای کدویژن می باشد.

متغیر signed int و int

این دو متغیر به مانند هم هستن،و تفاوت نمی کند که در برنامه بنویسید int یا signed int ، این متغیر 16 بیتی می باشد و اعداد -32768 تا 32767 را پشتبانی می کند

به عنوان مثال

;int x=9670
یا
;signed int x=9670

برای مواقع که می خواهیم اعداد بیشتری استفاده کنیم،یا که می خواهیم کارهایی با دقت بیشتر انجام دهیم یا که به هر دلیلی نیاز به یک متغیر با سایز بالا داریم از int استفاده می کنیم

متغیر unsigned int

این متغیر نیز 16 بیتی می باشد و اعداد 0 تا 65535 را پشتبانی می کند .

به عنوان مثال

;unsigned int x=30000

متغیرهای سری int و unsigned int هم معمولا بعد از char جزو متغیرهای پر استفاده در کدویژن می باشد.

متغیر long int و signed long int

این دو متغیر 32 بیتی می باشد!و به مانند هم هستن. این متغیرها، اعداد 2,147,483,648- تا 2,147,483,647 را پشتبانی می کند (یعنی حدود 4 میلیار عدد!)

به عنوان مثال


;long int x=40000000

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

متغیر unsigned long int

این متغیر 32 بیتی می باشد، و اعداد 0 تا 4,294,967,296 را پشتبانی می کند

به عنوان مثال

;unsigned long int x=80000000

متغیر float

این متغیر 32 بیتی می باشد! اما تفاوت اصلی این متغیر با دیگر متغیرها در قبول کردن اعشار می باشد! این متغیر می تواند اعداد اشاره را قبول کند،کاری که دیگر متغیر ها نمی توانند انجام دهند !
float می تواند طیف وسیعی از اعداد اعشاری به همراه مثبت و منفی بودن را قابل کند .
*در جدول بالا می تواند اعداد پشتبانی شده توسط float را ببینید
به عنوان مثال
;float x=345.789
*متغیر double هم به مانند float می باشد .

مثال ها زده شده در این تاپیک،تایپ شده در کدویژن
(همانجور که می ببینید،دستورها همیشه پررنگ تر می باشند)
تصویر
(*لازم به ذکر است در تصویر بالا x برای همه متغیرها تعریف شده! این کار در واقعیت امکان پذیر نیست،چون نمی توان یک نام متغیر را بیش از یک بار استفاده کرد)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام


ادامه مبحث...

فرض کنید،می خواهید دو یا سه متغیر را برای برنامه تعریف کنید. می توانید به روش زیر عمل کنید

;unsigned char a=0
;unsigned char b=0
;unsigned char c=0

اما یک راه ساده تری هم می باشد!انها را اینطور تعریف می کنیم:

;unsigned char a=0,b=0 ,c=0

در واقع در روش بالا فقط با گذاشتن علامت , سه متغیر جداگانه تعریف کرده اید، و سیستم به خوبی متوجه میشود که شما سه متغیر جداگانه تعریف کرده اید!

متغیرها به دو صورت در برنامه تعریف میشوند!

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

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

*فعلا مبحث متعیر کلی و محلی تا همین داشته باشید،تا بعد از اشنایی با مباحث دیگر،به این مبحث بهتر پرداخته شود


متغیر ها در چه حافظه ذخیر میشوند؟!

شاید این سوال بسیار مهم در ذهن خطور کرده باشد،این متغیرها که حاویی،اطلاعات هستن،در چه حافظه ی ذخیره میشوند؟!

این متغیرها در سه حافظه میکروکنترولر از قبیل Sram و eeprom و flash قابلیت دارن که ذخیر بشوند!

در وضعیت عادی،وقتی که ما متغیری تعریف می کنیم ،به مانند انواع متغیرهایی که تا بحال تعریف کرده ایم،همه انها در حافظه موقت SRAM میکروکنترولر بارگذاری میشوند.!

این متغیرها به نوعی چرک نویس هستن! یعنی ما دائم می خواهیم مقدار درونشان را تغییر بدهیم، و نیاز به سرعت بالا نیز داریم . پس بهترین گزینه حافظه Sram می باشد ! (حافظه که محدودیتی در زمینه نوشتن و خواندن ندارد)

برای درک بهتر، تصور کنید،می خواهید مقدار دماسنجی را دائم بخوانید،و ان را درون یک متغیر برزید، دما هم متغیر می باشد و دائم در حال کم و زیاد شدن می باشد، اگر بخواهیم متغیر خودمان را در حافظه ها با محدودیت نوشتن و خواندن بارگزاری کنیم. از عمر حافظه میکرو کم میشود!
(اما این همه ماجرا نیست، در بعضی پروژها و کارها نیاز است دائم در حد میکرو ثانیه! اطلاعات جدید بارگزاری شود ، انهم با سرعت بالا! )

بطور کلی حافظه Sram میکروکنترولر بهترین گزینه برای تعریف متغیرهایست که ما نیاز داریم مقدارشان را دائم تغییر بدهیم و اخرین تغییرات ان را بررسی کنیم و ...

همانجور که در بالا هم اشاره شد،وقتی که یک متغیر به روش های که در گذشته اشاره شد ساخته شود،به صورت پیش فرض در حافظه sram میکرو تعریف میشوند

به عنوان مثال

;unsigned char x=0

تعریف متغیر در حافظه EEPROM

برای تعریف متغیر در حافظه EEPROM باید دقت کرد، چون حافظه دارای سقف نوشتن و خواندن می باشد. ضمن اینکه این حافظه نسبت به sram کند می باشد.

معمولا زمانی یک متغیر در حافظه eeprom تعریف میشود که ما می خواهیم یک اطاعات خاص را ذخیره کنیم. به عنوان مثال می خواهیم،رمز یا پسوردی را ذخیره کنیم،یا که می خواهیم مقدار دمای را ذخیره کنیم،یا می خواهیم تنظیمات خاصی را ذخیر سازی کنیم .

نحویه تعریف یک متغیر در حافظه eeprom

;eeprom unsigned char temp=0

کار کردن با حافظه eeprom نیاز به یک تاخیر نیز دارد. که انشالله اگر فرصت شد در مباحث عملی و مثال ها در اینده با ان شنا خواهید شد .

تعریف متغیر در حافظه FLASH

در حافظه فلش نیز می توانید اطلاعات خود را ذخیر کنید،به مانند eeprom باید برای مواقع خاص استفاده میشود،از حافظه فلش بیشتر برای اطلاعات ثابت استفاده میشود.

معمولا از حافظه فلش برای جاهایی که نیاز به تغییرات دارد استفاده نمی شود، و معمولا یک سری اطلاعات که ما در برنامه ها نیاز داریم،توسط متغیرهای flash تعریف می کنیم،سپس در حین برنامه این متغیرها را می خوانیم ( و تغییری در ان نمی دهیم)

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

نحویه تعریف کردن متغیر فلش

;flash unsigned char text=0


*نکته در رابطه با حافظه فلش و ای ای پی رام، این دو متغیر را همیشه به صورت کلی تعریف کنید و محلی ان را تعریف نکنید (گرچه نرم افزار کدویژن اجازه ی محلی تعریف کردن هم نمی دهد!)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام


بحث در رابطه با متغیرها هنوز تمام نشده است! ولی بهتر است به بحث اصلی خود برگردیم و در اینده با متغیرها بیشتر اشنا شویم.

ادامه مبحث ساختار برنامه در کدویژن
تصویر
  فایل ها سرآمد و شناسه ها و متغیرها را توضیح دادیم ، اکنون به تابع فرعی می   تابع فرعی!   در اکثر نرم افزار ها برنامه نویسی نیاز به قسمتی داریم که کدهای مد نظر خودمان را درون ان قرار دهیم و به نوعی کارهایی مهم مان را به کمک ان انجام دهیم ..   از ان قسمت های که کدها برنامه را درون خودش قرار میدهد، تابع فرعی می باشد. همانجور که از نامش پیداست فرعی است و اصلی نیست! در واقع تابع فرعی، کمک دست تابع اصلی می باشد و ما برای جلوگیری از سنگین شدن تابع اصلی،از تابع فرعی استفاده می کنیم ...   فرعی همیشه قبل از تابع اصلی تعریف میشود و همیشه باید نام ان در تابع اصلی ذکر شود،وگرنه نرم افزار حذف میشود (همانجور که در تصویر بالا می ببینید تابع چک در تابع اصلی تعریف شده است)   در انتخاب نام تابع فرعی مختار هستیم و می توانیم هر نامی را که خواستیم انتخاب کنیم   به عنوان مثال   ;()void   ;()void   ;()void   ....  دقت کنید تابع باید حتما اینطور باشد 
Please Login or Register to see this code

یعنی ابتدا کلمه void قید میشود،سپس نام تابع ،سپس دو پرانتز () (که البته می توان بین این دو پرانتز چندین متغیر تعریف کرد که فعلا به ان نمی پردازیم) سپس با پرانتز } تابع باز میشود و شما باید کدهایی خودتان را بنویسید سپس با { ان را می بندیم ..

برای فراخوانی تابع فرعی در تابع اصلی باید آن را اینطور بنویسیم ;()check

اما تابع اصلی

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

فرم تابع اصلی
Please Login or Register to see this code

میکروکنترولر بعد از ورود به تابع اصلی از ابتدا شروع به خواندن کدها می کند تا به حلقه while می رسید.(در اینده حلقه while و دستورات کدویژن را توضیح خواهیم دادم) و در انجا باقی می ماند.

تابع اصلی، از همه قسمت های برنامه مهم تر می باشد و بیشتر کارهایی ما در محور این تاپیک اتفاق می افتد. * تابع اصلی را نمی توان تغییر نام داد و باید حتما با نام main باشد

پایان بحث ساختار برنامه نویسی در کدویژن..
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Novice Poster
Novice Poster
پست: 60
تاریخ عضویت: پنج‌شنبه 22 بهمن 1394, 9:03 pm
سپاس‌های ارسالی: 158 بار
سپاس‌های دریافتی: 27 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط javad_2010 »

سلام :-x
خسته نباشید
دیگه درسو ادامه نمیدید؟؟؟
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خدا
با سلام

باید ببخشید.اینترنت قطع بود و دسترسی محدود ..


حلقه ها در کدنویسی چه جایگاهی دارن؟!

ما در برنامه نویسی دو نوع چرخه پرکاربرد و پر استفاده داریم . اما به چه دلیل باید از چرخه ها استفاده کنیم؟!

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

برای این منظور ما از چرخه while یا نوع با محدودیت دار for استفاده می کنیم . ما به کمک این حلقه ها ،پردازش سی پی یو رو متمرکز بر دستورات خود می کنیم ، اما شاید سوال بپرسید،که پرداش کدها توسط میکروکنترولر به چه شکل می باشد که ما باید ان را متمرکز کنیم


* میکروکنترولر از اولین خط دستوری شروع به خواندن می کند،تا که وارد تابع اصلی برنامه می شود،در انجا وقتی که ما حلقه while تعریف کرده باشیم،به درون حلقه می افتد و تا زمانی که ما شرایط خروج از حلقه را ایجاد نکنیم، پردازش سی پی یو دائم از دستورات بالا حلقه تا پایین حلقه را بررسی و پردازش می کند .


(while(1
}

....
...
...
...
...
...
...
{


ادامه دارد..
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام

ساختار حلقه while

حلقه while از سه قسمت تشکیل شده است


ابتدا نام ان باید نوشته شود، سپس درون ( ) باید شرط حلقه نوشته شود سپس همه دستورات باید بین دو { } قرار بگیرن.

اما شرط حلقه while

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

به عنوان مثال:

(while(1
}


{

در دستور بالا حلقه تا همیشه ادامه پیدا خواهد کرد.

به طور کلی،حلقه while یکی از اصلی ترین حلقه های می باشد که در اکثرا قریب به اتفاق برنامه ها به کار می رود. ما باید همیشه از این حلقه در تابع اصلی استفاده کنید، حتا اگر کاری با ان نداشته باشیم! (باید ان را به صورت خالی تعریف کنیم (این نکته را همیشه به خاطر داشته باشید))

*می توان درون حلقه،حلقه دیگری تعریف کرد! از این بابت مشکلی نمی باشد،(فقط نباید طوری باشد که نظم برنامه بهم برزید)

مبحث حلقه ها تا همین جا باشد،تا ابتدا مبحث بزرگ شرط ها و عملگرهاو .. شروع کنیم.(انشالله)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خداوند بخشنده و مهربان
باسلام


عملگرها

در برنامه نویسی کدویژن مجموعه از عملگرها رو داریم که به کمک انها می توانیم کارهای منطقی و محاسباتی را انجام دهیم . این عملگرها رو ما باید به خوبی یاد بگیریم و انها را در برنامه ها به کار ببندیم .

[HIGHLIGHT=#00b050]ابتدا .. 
عملگرها ریاضی(منها،تفسیم،جمع،ضرب)

عملگرهای ریاضی در برنامه نویسی کارهای ما را بسیار ساده تر می کنند و به کمک انها می توانیم محاسباتمان را راحتر انجام دهیم .

-- عملگر ++(افزایش یک واحد)
وقتی که در برنامه از دو علامت ++ استفاده کنیم، 1 واحد،متغیر ما افزایش پیدا می کند
به عنوان مثال :
Please Login or Register to see this code

در برنامه بالا،ابتدا یک متغیر از نوع 8 بیتی (شامل عدد 0 تا 255) به نام i تعریف می کنیم ،سپس برنامه به درون حلقه می افتد ، چون در کنار متغیر i علامت ++ گذاشته شده است،هربار که حلقه به ابتدا برگردد، یک واحد به متغیر i افزوده میشود
یعنی بار اول،که به ++i مقدار i از 0 به 1 میرسد،سپس حلقه باز تکرار میشود و باز به ++i می رسد و i از 1 به 2 افزایش پیدا می کند و باز همین روند ادمه پیدا می کند....
[HIGHLIGHT=#76923c]پس هرگاه علامت ++ را در کنار متغیر نوشیم و برنامه به ان خط برنامه نویسی برسد، متغیر ما را یک واحد افزایش میدهد. 

--عملگر -- (کاهش یک واحد)
اما عملگر دیگری وجود دارد که عکس عملگر قبلی می باشد،یعنی بجایی انکه یک واحد افزایش دهد! یک واحد کاهش می دهد
به عنوان مثال
Please Login or Register to see this code
در مثال بالا متغیر i با مقدار عدد 10 تعریف می شود. سپس به درون حلقه می افتد، سپس حلقه در هربار تکرار یک واحد از مقدار متغیر کم می کند
یعنی بار اول عدد 10 را به 9 و در بار دوم مقدار 9 رو به 8 و در بار سوم مقدار 8 را به 7 و ..... (و همینجور تا به مقدار صفر برسد)
[HIGHLIGHT=#00b050]پس وقتی برنامه،در خط برنامه نویسی ،به متغیری با علامت -- برسد،مقدار ان را یک واحد کاهش می دهد. 

عملگر - (منفی)
[HIGHLIGHT=#5f497a]ما به کمک عملگر منفی - می توانیم اعدادمان را منفی کنیم.
 به عنوان مثال
Please Login or Register to see this code
همانجور که در مثال بالا می ببینید یک متغیر 8 بیتی از نوع char( [HIGHLIGHT=#0070c0]یعنی -128 تا 127 ) به نام i با مقدار 10- تعریف شده است.

عملگر * (ضرب)
[HIGHLIGHT=#ff0000]به کمک عملگرضرب می توان چندین متغیر را باهم دیگر ضرب کرد. 
به عنوان مثال

Please Login or Register to see this code
در مثال بالا سه متغیر تعریف کرده ایم ، i با مقدار 5 و x به مقدار 10 و z به مقدار 0 .. سپس در خط بعدی x (که مقدارش 10 می باشد) را ضربدر i (با مقدار 5) کرده ایم و نتیجه را درون متغیر z ر یخته ایم . (که جواب عدد 50 میشود)
* تفاوتی نمی کند که x را ضربدر i کنید یا که i را ضربدر x کنید
z=x*i
z=i*x
در دو صورت نتیجه یکی می باشد (به مانند ضرب واقعی ..)
اما ما می توانیم نتیجه را درون خود متغیرها بریزیم! یعنی بجایی تعریف سه متغیر([HIGHLIGHT=#4f81bd]دو متغیر برای گرفتن اعداد و یکی هم برای نتیجه )دو متغیر تعریف کنیم و نتیجه را در یکی از دو متغیر قرار دهیم !
به عنوان مثال

Please Login or Register to see this code
در مثال بالا دو متغیر x و i به مانند قبل تعریف شده ولی z را حذف کرده ایم . سپس در خط بعدی ابتدا x را ضربدر i می کنیم ، سپس نتیجه را درون x می ریزیم .(یعنی در نهایت عدد 50 به درون x ریخته میشود .)
اما گاهی وقت ها نیاز میشود عدد دستی خودمان وارد کنیم،بازهم مشکلی نیست!
به عنوان مثال
Please Login or Register to see this code
در مثال بالا متغیر i به مقدار 5 معرفی شده است،سپس عدد 25 ضربدر i میشود و نتیجه درون i ریخته میشود (یعنی در نهایت عدد 125 به درون i ریخته میشود)
می توان اصلا هیچ متغیری برای ضرب کردن تعریف نکرد! به عنوان مثال:
i=25*5
بازهم مشکلی نیست و مقدار این ضرب به درون متغیر i ریخته میشود

عملگر/ (تقسیم،خارج قسمت)
[HIGHLIGHT=#ffc000]به کمک عملگر / می توان تقسیم خارج قسمت انجام داد.
 به عنوان مثال :
Please Login or Register to see this code
در مثال بالا دو متغیر x , i با مقدار 5 و 10 معرفی میشود ، سپس در خط بعد x تقسیم بر i می شود ،سپس نتیجه درون x ریخته میشود (که عدد 2 میشود)
*دقت کنید که اگر x و i را جابجا بگذارید نوع تقسیم متفاوت می باشد(به مانند محاسبات ریاضی)
یعنی اگر
x=x/i (که میشود 2)
x=i/x ( که میشود 0.5)
تقسیم هم به مانند ضرب حالت مختلف را قبول می کند، چه دو متغیر را مستقیم تقسیم کنید،یا که دو عدد را مستقیم بنویسید و نتیجه را به درون یک متغیر بریزید و دیگر حالت که قبلا گفته شد.

عملگر تقسیم % (باقی مانده)
[HIGHLIGHT=#e36c09]به کمک عملگر% می توان عملیات تقسیم باقی مانده انجام داد 
به عنوان مثال :
Please Login or Register to see this code
در مثال بالا وقتی که مقدار x و i با هم تقسیم (باقی مانده) شوند، مقدارشان به درون x ریخته میشود (که جواب عدد 0 میشود)
تقسیم باقی ماند هم به مانند ضرب و تقسیم خارج قسمت می توان در حالت های مختلف نوشت .
عملگر - (تفریق)
[HIGHLIGHT=#4f6128]به کمک این علمگرد می توان عملیات تفریق را انجام داد 
به عنوان مثال
Please Login or Register to see this code
در مثال بالا x بر i تفریق میشود و نتیجه درون x ریخته میشود (که نتیجه بالا عدد 40 میشود)
* دقت کنید که تفریق هم به مانند تقسیم با جابجا کردن متغیر عملگرهایش متفاوت میشود
x=x-i (نتیجه عدد 40 )
x=i-x(نتیجه عدد -40 )
تفریق هم مثل ضرب و تقسیم و.. می توان به حالت های مختلف که قبلا ذکر شد،برنامه نویسی کرد

عملگر+ (جمع)
[HIGHLIGHT=#00b050]به کمک این عملگر می توانید عملیات جمع را انجام داد  
به عنوان مثال
Please Login or Register to see this code
در مثال بالا مقدار x و i باهم جمع میشود و در مقدار x ریخته میشود (که نتیجه عد 60 میشود)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.
با عرض پوزش،دیگر در انجمن حضور ندارم،که به پیام ها پاسخ بدم.
Novice Poster
Novice Poster
پست: 60
تاریخ عضویت: پنج‌شنبه 22 بهمن 1394, 9:03 pm
سپاس‌های ارسالی: 158 بار
سپاس‌های دریافتی: 27 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط javad_2010 »

سلام
همچنان مشتاق ادامه مباحثیم
:D
Colonel II
Colonel II
نمایه کاربر
پست: 7545
تاریخ عضویت: سه‌شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9280 بار
سپاس‌های دریافتی: 22099 بار

Re: آموزش میکروکنترولر AVR از ابتدا تا پیشرفته(+فهرست)

پست توسط sinaset »

بنام خدا
با سلام

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

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

* حتما برنامه پرتئوس و یا همان شبیه ساز را بر روی سیستم خود نصب کنید،نبود چنین نرم افزار مفیدی روند اموزشی را بسیار بسیار سخت می کند.
*مباحث که تا به امروز گفته شد را از دوباره بخوانید و مرور کنید و سعی کنید از کتاب های که گفته شده هم الگوبرداری کنید
*همیشه سعی کنید اصول و منطق مباحث الکترونیک را کامل درک کنید،اینطور مطلب به حافظه طولانی مدت شما سپرده میشود و اگر هم از یاد بردید،با کوچیکتر اشاره ای از دوباره مباحث را به یاد خواهید آورد (حتا بهتر از قبل!)
*همیشه با کمترین مطلب که یاد گرفتید،سعی کنید خودتان نیز به ان چیزی اضافه کنید و از خلاقیت خودتان،به ان اضافه کنید.

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

بازگشت به “آموزش و مثال‌ها AVR”