برنامه نویسی به زبان C برای میکروکنترلر

  • شروع کننده موضوع
  • #1

hasangolab

کاربر حرفه‌ای
ارسال‌ها
438
امتیاز
133
شهر
قم
مدال المپیاد
ترکیبیات علیپور خوندم!
دانشگاه
Massachusetts Institute of Technology
رشته دانشگاه
Electrical Engineering
خوب می خوایم دیگه شروع کنیم. راستش باید بدونید که زبان های برنامه نویسی مختلفی برای کار با میکرو کنترلر وجود داره که راحتترینش BASIC هست منتها بیسیک خیلی سرعت کندی داره و بیشتر حافظه میکرو شما رو مصرف می کنه و چون حافظه میکرو حداکثر 128 کیلوبایت هست (atmega128 که یک آی سی smd هست و وصل کردنش روی مدار کار هر کسی نیست) پس به نظر من استفاده نکنین بهتره ولی یه زبان دیگه هم به اسم Assembly هست که خیلی سخته ولی سرعت فوق العاده بالایی داره و همچنین فضای کمی می گیره به نظر من از این هم استفاده نکنین بهتره چون خیلی خیلی سخته و اشتباه اگه بکنید به سختی مشخص میشه و در نهایت یه زبان به اسم C هست که هم سرعت خوبی داره هم فضای نسبتاً معقولی از میکروی شما رو میگیره و یاد گرفتنش راحت تر از Assembly هست بخاطر همین من این زبان رو برای آموزش استفاده کردم ولی اگه بخواین در کنارش اسمبلی هم یاد میدم.

حالا دیگه مقدمه چینی بسه بریم سر اصل مطلب!

اولین چیزی که باید بدونید قوانین نوشتنه درست مثل گرامر می مونه:
قاعده یک: هر دستور (غیر از دستورات پیش پردازنده) باید به حرف semi colon ( ; ) ختم شود.
قاعده دو: طول یک دستور نباید بیشتر از 255 حرف باشد.
قاعده سوم: دستورات پیش پردازنده باید با حرف # شروع و بدون سمی کلون ختم شوند.

البته قوانین دیگه ای هم هست که توی بخش های بعدی میگم.

قبل از اینا باید روش نوشتن اعداد رو بخونید:
اعداد به 4 شکل توی سی نوشته میشه
1- دودویی(باینری)
کد:
0b10;
2-هگزادسیمال (شانزده شانزدهی)
کد:
0x02;
3- دهدهی
کد:
2
همینطور که دیدید عدد دو رو به صورت های مختلف نوشتم برای جاهای مختلف می تونید برای راحتی بیشتر کار از روش های مختلف عدد نویسی استفاده کنید. :D

بریم سراغ اولین بخش که دستورات پیش پردازنده میشه این بخشو معمولاً آخر کتابا می گن ولی چون خیلی راحته من اول میگم.

دستور انتصاب (define):
روش استفاده
کد:
<define <name> <value#
در دستور بالا <name> اسمی که مقدار انتصاب دادیده و <value> مقدار این اسمه.مثلاً:
کد:
#define YEK 1
با نوشتن این دستور هر وقت جایی بنویسید yek انگار که نوشتید 1

دستور ضمیمه (include):
روش استفاده
کد:
<include <file#
یا
"include "file#
در دستور بالا <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
...
3-پورت ها به صورت اتصال به زمین (ورودی):
کد:
DDRA
DDRB
DDRC
DDRD
...
4-تایمر ها
کد:
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>
مرحله دوم تابع main (برنامه) را ایجاد می کنیم:
کد:
#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 بخونید.
 
  • شروع کننده موضوع
  • #2

hasangolab

کاربر حرفه‌ای
ارسال‌ها
438
امتیاز
133
شهر
قم
مدال المپیاد
ترکیبیات علیپور خوندم!
دانشگاه
Massachusetts Institute of Technology
رشته دانشگاه
Electrical Engineering
پاسخ : برنامه نویسی به زبان C برای میکروکنترلر

خوب تا حالا با متغیر ها و اساس برنامه نویسی C آشنا شدید.
برای همین میریم سراغ عملگر ها:
+: جمع
-: منها
*:ضرب
/:تقسیم
--:منهای 1
++:جمع با 1
&&: and منطقی
||: or منطقی
~: not منطقی
مثال جبری:
کد:
i=log*(gol-operator)+sonbol/2
مثال منطقی:
کد:
~((j && i) || (f && i))

اولویت عملگر ها:
کد:
*
/
&&
||
~
++
--
+
-
میریم سراغ دستور های C:

دستور (حلقه) while:
اگه از این دستور استفاده کنید تا وقتی که شرط شما (statement) برقرار باشه دستورات درون حلقه while اجرا میشه.
Syntax:
کد:
while (statement)
{
command1;
command2;
command3;
...
}
OR
while (statement)
command;
مثال:
کد:
while (1>0)
{
o=4;
{
تو مثال بالا تا وقتی که 1 بزرگتر از 0 باشه!!!! (شایدم کوچیکتر باشه!!!) متغیر o مساوی 4 خواهد بود.

حلقه for:
حلقه for نوع پیشرفته حلقه while هست. در این حلقه یک شمارنده تعداد معینی را می شمارد و وقتی که این تعداد به پایان برسد برنامه از حلقه خارج می شود.
Syntax:
کد:
for(value;statement;step)
{
command1;
command2;
command3;
...
}
OR
for(value;statement;step)
command;
مثال:
کد:
for(i=0;i>10;i++)
o++;
در مثال بالا o ده بار با یک جمع می شود.

دستور شرطی if:
اگر شرط این دستور برقرار باشد دستورات داخل آن انجام می شوند.
Syntax:
کد:
if(statement)
{
command1;
command2
command3;
...
}
OR
if(statement)
command;
مثال:
کد:
if(i==5)
o=2;
اگر i پنج بود o برابر 2 شود.

دستور شرطی switch:
این دستور همان if پیشرفته است. کار این دستور مقایسه یک متغیر با مقادیر مختلف است که در صورت تساوی متغیر با این مقادیر دستورات مربوطه اجرا می شوند.
Syntax:
کد:
switch(value)
{
case 0:
command;
break;
case 1:
command;
break;
...
{
مثال:
کد:
switch(sensor)
{
case 1:
PORTB.0=1;
break;
case 2:
PORTB.0=0;
break;
{
اگر sensor مساوی 1 بود پایه اول پورت B مساوی 1 و اگر sensor دو بود پایه اول پورت B صفر خواهد شد.
 

فاطمه م.

فاطمه م.
ارسال‌ها
633
امتیاز
4,340
نام مرکز سمپاد
فرزانگان چهاردانگه
شهر
تهران
سال فارغ التحصیلی
95
مدال المپیاد
ادبی
دانشگاه
پلی تکنیک تهران
رشته دانشگاه
علوم کامپیوتر
پاسخ : برنامه نویسی به زبان C برای میکروکنترلر

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

fateme91

کاربر جدید
ارسال‌ها
1
امتیاز
0
نام مرکز سمپاد
فرزانگان
شهر
مشهد
دانشگاه
فردوسی مشهد
رشته دانشگاه
برق
پاسخ : برنامه نویسی به زبان C برای میکروکنترلر

سلام
اگه بخوام با استفاده از دستور for تاخیر ایجاد کنم باید چیکار کنم ؟
fateme124@gmail.com
 
بالا