- شروع کننده موضوع
- #1
hasangolab
کاربر حرفهای
- ارسالها
- 438
- امتیاز
- 133
- شهر
- قم
- مدال المپیاد
- ترکیبیات علیپور خوندم!
- دانشگاه
- Massachusetts Institute of Technology
- رشته دانشگاه
- Electrical Engineering
خوب می خوایم دیگه شروع کنیم. راستش باید بدونید که زبان های برنامه نویسی مختلفی برای کار با میکرو کنترلر وجود داره که راحتترینش BASIC هست منتها بیسیک خیلی سرعت کندی داره و بیشتر حافظه میکرو شما رو مصرف می کنه و چون حافظه میکرو حداکثر 128 کیلوبایت هست (atmega128 که یک آی سی smd هست و وصل کردنش روی مدار کار هر کسی نیست) پس به نظر من استفاده نکنین بهتره ولی یه زبان دیگه هم به اسم Assembly هست که خیلی سخته ولی سرعت فوق العاده بالایی داره و همچنین فضای کمی می گیره به نظر من از این هم استفاده نکنین بهتره چون خیلی خیلی سخته و اشتباه اگه بکنید به سختی مشخص میشه و در نهایت یه زبان به اسم C هست که هم سرعت خوبی داره هم فضای نسبتاً معقولی از میکروی شما رو میگیره و یاد گرفتنش راحت تر از Assembly هست بخاطر همین من این زبان رو برای آموزش استفاده کردم ولی اگه بخواین در کنارش اسمبلی هم یاد میدم.
حالا دیگه مقدمه چینی بسه بریم سر اصل مطلب!
اولین چیزی که باید بدونید قوانین نوشتنه درست مثل گرامر می مونه:
قاعده یک: هر دستور (غیر از دستورات پیش پردازنده) باید به حرف semi colon ( ; ) ختم شود.
قاعده دو: طول یک دستور نباید بیشتر از 255 حرف باشد.
قاعده سوم: دستورات پیش پردازنده باید با حرف # شروع و بدون سمی کلون ختم شوند.
البته قوانین دیگه ای هم هست که توی بخش های بعدی میگم.
قبل از اینا باید روش نوشتن اعداد رو بخونید:
اعداد به 4 شکل توی سی نوشته میشه
1- دودویی(باینری)
2-هگزادسیمال (شانزده شانزدهی)
3- دهدهی
همینطور که دیدید عدد دو رو به صورت های مختلف نوشتم برای جاهای مختلف می تونید برای راحتی بیشتر کار از روش های مختلف عدد نویسی استفاده کنید.
بریم سراغ اولین بخش که دستورات پیش پردازنده میشه این بخشو معمولاً آخر کتابا می گن ولی چون خیلی راحته من اول میگم.
دستور انتصاب (define):
روش استفاده
در دستور بالا <name> اسمی که مقدار انتصاب دادیده و <value> مقدار این اسمه.مثلاً:
با نوشتن این دستور هر وقت جایی بنویسید yek انگار که نوشتید 1
دستور ضمیمه (include):
روش استفاده
در دستور بالا <file> مسیر یا نام ضمیمه فایل هست. این دستور همیشه استفاده میشه چون برای استفاده از توابع با فایلی که شامل توابع میشه رو با کمک این دستور به برنامه تون ضمیمه کنید.
مثال:
خوب حالا بریم سراغ ساختار برنامه
یه سیستمی مثل زیر باید توی برنامه تون اجرا بشه به همین ترتیب
مثلاً:
خوب حالا اینا به کنار بریم سراغ منابع سیستمی توی CodeVision و همچنین WinAVR منابع سیستمی اینجوری تنظیم شده اند.
1- پورت های میکرو به صورت نوشتنی (یک پورت میکرو رو براتون تغییر میده)
2- پورت های میکرو به صورت خواندنی (یک پورت میکرو رو می تونید بخونید)
3-پورت ها به صورت اتصال به زمین (ورودی):
4-تایمر ها
تذکرات مهم:
1- به نسبت میکرو تعداد منابع تغییر میکند مثلاً برای میکروی tiny13 فقط پورت B رو دارید ولی برای mega2560 شما 9 تا پورت دارید که به ترتیب حروف الفبای انگلیسی تا I نوشته میشن.
2- برای استفاده از منابع سیستم اینکار را می توان به صورت بیتی انجام داد یعنی فقط یک بیت را تغییر داد مثلاً با تغییر PORTB.2 سومین پایه پورت B تغییر می کند.
3- بعضی از منابع سیستمی فقط خواندنی هستند.
4- اولین بیت یک منبع سیستمی بیت صفر است نه یک مثلاً PORTB.0
خوب اگه اینا رو خوب یاد گرفتید حالا باید با متغیر ها آشنا شید. متغیر در واقع بخشی از حافظه EEPROM میکرو شماست که برای شما یه مقدار خاص رو نگه میداره و هروقت که بخواین قابل تغییره. برای کار با متغیر ها اول باید با انواع اون آشنا بشید.
خوب حالا که با انواع متغیر ها آشنا شدید میتونید با اضافه کردن کلمه unsigned به هرکدوم از اونا مقدار جای داخل اونا رو دوبرابر کنید ولی دیگه شما اعداد منفی رو ندارید.
مثلاً بانوشتن:
شما از 0 تا 256 رو می تونید داخل متغیر بنویسید.
نحوه ایجاد و انتصاب متغیر:
دستور ایجاد:
دستور انتصاب:
مثال:
ایجاد و انتصاب:
ایجاد:
انتصاب:
تذکرات مهم:
1- حتماً از نوع مناسب برای کار با متغیر ها استفاده کنید.
2- حتماً متغیر ها را در اول برنامه تعریف کنید (جای مشخص شده در نمودار بالا)
3- توجه کنید که استفاده از متغیر های بزرگ سرعت کار شما را پایین تر می آورد.
روش استفاده از توابع:
ساختار:
مثال:
حالا که اینها رو یاد گرفتید بریم اولین برنامه مون (چراغ چشمک زن) رو بنویسیم:
مرحله اول: ابتدا کتابخانه هایی رو که می خوایم به برنامه اضافه می کنیم(که شامل کتابخانه میکرو و کتابخانه تأخیر می شود.):
مرحله دوم تابع main (برنامه) را ایجاد می کنیم:
مرحله سوم دستورات رو می نویسیم:
خوب حالا ما چی کار کردیم:
گفتیم که اول اولین پایه پورت B رو مساوی 1 قرار دادیم بعد یه تأخیر ایجاد کردیم(تابع delay_ms تأخیر ایجاد می کنه و ما گفتیم 500 میلی ثانیه یعنی نیم ثانیه ایجاد کنه) تا بشه خاموش و روشن شدن LED رو دید بعد از تأخیر گفتیم که دوباره پایه رو 0 کنه تا چراغ خاموش بشه در اینحالت حدوداً LED (برای استفاده از لامپ حبابی باید از ترانزیستور و مقاومت کمک بگیرید.) هر نیم ثانیه یک بار چشمک می زنه!
برای اینکه نتیجه کار رو ببینید بهتره برنامه رو روی یک میکروی mega32 پروگرام کنید. نحوه بستن کامل پروگرامر رو می تونید از موضوع ساخت پروگرامر STK200/300 بخونید.
حالا دیگه مقدمه چینی بسه بریم سر اصل مطلب!
اولین چیزی که باید بدونید قوانین نوشتنه درست مثل گرامر می مونه:
قاعده یک: هر دستور (غیر از دستورات پیش پردازنده) باید به حرف semi colon ( ; ) ختم شود.
قاعده دو: طول یک دستور نباید بیشتر از 255 حرف باشد.
قاعده سوم: دستورات پیش پردازنده باید با حرف # شروع و بدون سمی کلون ختم شوند.
البته قوانین دیگه ای هم هست که توی بخش های بعدی میگم.
قبل از اینا باید روش نوشتن اعداد رو بخونید:
اعداد به 4 شکل توی سی نوشته میشه
1- دودویی(باینری)
کد:
0b10;
کد:
0x02;
کد:
2
بریم سراغ اولین بخش که دستورات پیش پردازنده میشه این بخشو معمولاً آخر کتابا می گن ولی چون خیلی راحته من اول میگم.
دستور انتصاب (define):
روش استفاده
کد:
<define <name> <value#
کد:
#define YEK 1
دستور ضمیمه (include):
روش استفاده
کد:
<include <file#
یا
"include "file#
مثال:
کد:
<include <delay.h#
خوب حالا بریم سراغ ساختار برنامه
یه سیستمی مثل زیر باید توی برنامه تون اجرا بشه به همین ترتیب
کد:
Header Files
Functions
Global Variables
main ()
{
Internal Variables
Code
}
Functions
کد:
#include <mega32.h>
void main (void)
{
;PORTB=0xFF
}
خوب حالا اینا به کنار بریم سراغ منابع سیستمی توی CodeVision و همچنین WinAVR منابع سیستمی اینجوری تنظیم شده اند.
1- پورت های میکرو به صورت نوشتنی (یک پورت میکرو رو براتون تغییر میده)
کد:
PORTA
PORTB
PORTC
PORTD
...
2- پورت های میکرو به صورت خواندنی (یک پورت میکرو رو می تونید بخونید)
کد:
PINA
PINB
PINC
PIND
...
کد:
DDRA
DDRB
DDRC
DDRD
...
کد:
TCCR0
TCNT0
TIFR0
TCCR1
...
تذکرات مهم:
1- به نسبت میکرو تعداد منابع تغییر میکند مثلاً برای میکروی tiny13 فقط پورت B رو دارید ولی برای mega2560 شما 9 تا پورت دارید که به ترتیب حروف الفبای انگلیسی تا I نوشته میشن.
2- برای استفاده از منابع سیستم اینکار را می توان به صورت بیتی انجام داد یعنی فقط یک بیت را تغییر داد مثلاً با تغییر PORTB.2 سومین پایه پورت B تغییر می کند.
3- بعضی از منابع سیستمی فقط خواندنی هستند.
4- اولین بیت یک منبع سیستمی بیت صفر است نه یک مثلاً PORTB.0
خوب اگه اینا رو خوب یاد گرفتید حالا باید با متغیر ها آشنا شید. متغیر در واقع بخشی از حافظه EEPROM میکرو شماست که برای شما یه مقدار خاص رو نگه میداره و هروقت که بخواین قابل تغییره. برای کار با متغیر ها اول باید با انواع اون آشنا بشید.
نام متغیر | نوع متغیر |
bit | ساده ترین نوع متغیر که کمترین حجم را اشغال کرده و فقط مقدار صفر یا یک را نگه میدارد. |
int | ساده ترین متغیر عددی که میتواند اعداد -128 تا 128 را درون خود نگه داری کند. |
long | نوع پیشرفته تر int که شامل اعداد -32768 تا 32768 نیز میشود. |
float | نوع پیشرفته تر متغیر long که قابلیت نگه داری اعشار تا 8 رقم را نیز دارد. |
double | بزرگترین و پر حجم ترین نوع متغیر که قابلیت نگه داری اعداد 16 رقمی با 16 اعشار را دارد. |
خوب حالا که با انواع متغیر ها آشنا شدید میتونید با اضافه کردن کلمه unsigned به هرکدوم از اونا مقدار جای داخل اونا رو دوبرابر کنید ولی دیگه شما اعداد منفی رو ندارید.
مثلاً بانوشتن:
کد:
unsigned int
شما از 0 تا 256 رو می تونید داخل متغیر بنویسید.
نحوه ایجاد و انتصاب متغیر:
دستور ایجاد:
کد:
<kind> <name>(=<value>)
دستور انتصاب:
کد:
<name>=<value>
مثال:
ایجاد و انتصاب:
کد:
unsigned int ali=20;
کد:
unsigned int ali;
کد:
ali=40;
تذکرات مهم:
1- حتماً از نوع مناسب برای کار با متغیر ها استفاده کنید.
2- حتماً متغیر ها را در اول برنامه تعریف کنید (جای مشخص شده در نمودار بالا)
3- توجه کنید که استفاده از متغیر های بزرگ سرعت کار شما را پایین تر می آورد.
روش استفاده از توابع:
ساختار:
کد:
function(value1,value2,value3,...);
کد:
delay_ms(200);
حالا که اینها رو یاد گرفتید بریم اولین برنامه مون (چراغ چشمک زن) رو بنویسیم:
مرحله اول: ابتدا کتابخانه هایی رو که می خوایم به برنامه اضافه می کنیم(که شامل کتابخانه میکرو و کتابخانه تأخیر می شود.):
کد:
#include <mega32.h>
#include <delay.h>
کد:
#include <mega32.h>
#include <delay.h>
void main(void)
}
{
کد:
#include <mega32.h>
#include <delay.h>
void main(void)
}
PORTB.0=1;
delay_ms(500);
PORTB.0=0;
{
گفتیم که اول اولین پایه پورت B رو مساوی 1 قرار دادیم بعد یه تأخیر ایجاد کردیم(تابع delay_ms تأخیر ایجاد می کنه و ما گفتیم 500 میلی ثانیه یعنی نیم ثانیه ایجاد کنه) تا بشه خاموش و روشن شدن LED رو دید بعد از تأخیر گفتیم که دوباره پایه رو 0 کنه تا چراغ خاموش بشه در اینحالت حدوداً LED (برای استفاده از لامپ حبابی باید از ترانزیستور و مقاومت کمک بگیرید.) هر نیم ثانیه یک بار چشمک می زنه!
برای اینکه نتیجه کار رو ببینید بهتره برنامه رو روی یک میکروی mega32 پروگرام کنید. نحوه بستن کامل پروگرامر رو می تونید از موضوع ساخت پروگرامر STK200/300 بخونید.