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

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

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

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

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

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

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

پست توسط sinaset » چهار شنبه 20 مرداد 1395, 4:47 pm

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

برخره بعد از مدت ها قصد داریم،پروژه ساده ی را شروع کنیم.همیشه در اکثر آموزش ها،از پروژه چشمک زن Led برای شروع کار با میکروکنترولر استفاده میشود،ما نیز همین کار را می کنیم،اما کمی متفاوت تر !

[HIGHLIGHT=#f79646]مراحل آموزش پروژه یا طرح چشمک زن LED را به چهار قسمت تقسیم می کنیم : 

1-برنامه نویسی و توضیحات
2-اجرا بر روی شبیه ساز پرتئوس و توضیحات
4- پروگرام کردن کدها بر روی میکروکنترولر و آزمایش عملی مدار.
(به امید خدا)


[HIGHLIGHT=#00b050]ابتدا برنامه نویسی 

طرح اصلی برای چشمک زدن LED ها این است که: می خواهیم،LED در 1 ثانیه روشن شود،سپس در 1 ثانیه بعدی،خاموش شود، و این روند برای همیشه ادامه پیدا کند !

برای این منظور پایه ها یا پایه که LED به میکروکنترولر اتصال دارد را 1 ثانیه 0 و 1 ثانیه 1 کنیم !

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

نحویه ساخت یک صفحه (خام) برای آغاز پروژه در کدویژن.


به محل نصب نرم افزار کدویژن بروید و وارد پوشه BIN بشوید،سپس بر روی نرم افزار کدویژن کلیک کنید (cvavr.exe) (یا بر روی منو Start ویندوز کلیک کنید و تایپ کنید codevisionAvr تا فایل اجرای نمایش داده شود)
 تصویر 
بعد از انکه نرم افزار اجرا شد،بر روی گزینه File کلیک کنید،در همان گزینه اول روی گزینه new کلیک کنید،بعد از باز شدن زیر شاخه ها،برروی گزینه Project کلیک کنید.
 تصویر 
گزینه بالا ظاهر میشود و از شما،می پرسد،آیا می خواهید پروژه جدیدی بسازید،که شما بر روی گزینه yes کلیک کنید.
 تصویر 
بعد از کلیک بر روی گزینه yes پنجره بالا باز می شود،که از شما می خواهد،سری میکروکنترولر خود را انتخاب کنید،چون ما از سری xmega استفاده نمی کنیم و اکثر با atmega و attiny و .. استفاده می کنیم،همان گزینه اول را انتخاب می کنیم و OK را می زنیم .
 تصویر 
خوش آمدید،صفحه بالا،ابزار کدویزارد معروف می باشد! ابزاری که بعدها با آن کارهای زیادی خواهید داشت،! فرکانس و نوع میکروکنترولر را به مانند تصویر بالا انتخاب کنید،سپس...
 تصویر 
برای ذخیر سازی و آغاز پروژ خود، ابتدا از منوی بالا گزینه program را باز کنید،و سپس Generate Save And Exit را انتخاب کنید.
 تصویر 
در پنجره جدید باز شده،نامی برای فایل برنامه نویسی انتخاب کنید
 تصویر 
در پنجره جدید باز شده،نامی برای پروژه خود انتخاب کنید(برای هماهنگی بهتراست همه را یک نام انتخاب کنید)
 تصویر 
در پنجره جدید باز شده،نامی برای (یک فایل لازم،برای پروژه ) انتخاب کنید(برای هماهنگی بهتراست همه را یک نام انتخاب کنید)

اکنون پروژه جدید اغاز شده،و شما می توانید اغاز به برنامه نویسی کنید.!
اما چون ما می خواهیم خودمان برنامه مد نظرمان را بنویسیم،لطفا در صفحه اصلی برنامه کلیک کنید،و همه کدهای درون صفحه را حذف کنید (بر روی صفحه کلیک کدها،کلیک کنید،سپس کلید کنترول + A و بعد Delete) بعد از حذف کدها،برای ذخیر کردن اخرین تغییرات،باید صفحه را سیو کنید،برای این منظور کلید ترکیبی شیفت+ F9 را بزنید،تا اخرین تغییرات Save و ذخیری سازی .


ادامه دارد..

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » چهار شنبه 20 مرداد 1395, 5:33 pm

اما در ادامه و آغاز مبحث برنامه نویسی LEd چشمک زن.

ما باید پورت های میکروکنترولر را خاموش و روشن کنید. توصیه می کنیم،**|برای یادگیری بهتر،یک بار دیگر به اینصفحه برگشته و توضیحات مربوط به پورت ها و نحویه فعال و غیر فعال کردن انها را بخوانید.|**

[HIGHLIGHT=#76923c]خوب اکنون که ان صفحه را مطالعه کردید،به آموزش ها ادامه بدهید.!
 
پس پورت های میکروکنترولر به کمک DDR نحویه خروجی یا ورودی بودن انها مشخص میشود و بعد از ان(در صورتی که ورودی پایه میکروکنترولر را تعریف کرده باشیم) به کمک PIN دو حالت برای پایه میکروکنترولر تعریف می کنیم .(و در صورتی که پایه میکروکنترولر را خروجی تعریف کرده باشیم) به کمک PORT حالت پایه میکروکنترولر کنترولر را تعریف می کنیم.

در این پروژه،چون ما می خواهیم وضعیت پایه میکروکنترولر را 0 و 1 کنیم، پس نیاز داریم،ولتاژی از پایه میکروکنترولر به سمت LED بفرستیم! پس ما باید وضعیت DDR را خروجی تعریف کنیم! (چون قصد داریم ولتاژ را بفرستیم،در صورتی که می خواستیم،ولتاژ یا سیگنال دریافت کنیم،باید DDR را در وضعیت ورودی قرار میدادیم)

خوب برنامه نویسی را آغاز می کنیم.

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

پس ما کتابخانه میکروکنترولر را تعریف می کنیم:

کد: انتخاب همه

#include <mega8.h>     //را معرفي مي کنيم ATMEGA8 ابتدا کتابخانه ميکروکنترولر 


چون ما می خواهیم تاخیر در پروژه خود ایجاد کنیم،از کتابخانه موجود در کدویژن استفاده می کنیم(کتابخانه که گذشته نیز ان را معرفی کرده ایم)
نام این کتابخانه delay می باشدو کارش نیز ایجاد تاخیر یا مکث می باشد(و دقیقا بدرد جاهایی مثل طرح ما می خورد)

پس ان را اینطور معرفی می کنیم

کد: انتخاب همه

#include <delay.h>     //سپس از کتابخانه اماده تاخير،براي ايجاد تاخير در چشمک زدن استفاده ميکنيم


خوب اکنون دیگر باید یک تابع اصلی را معرفی کنیم،که بدین شکل ان را معرفی می کنیم

کد: انتخاب همه

void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي


حال دیگر همه چیز اماده است،ما باید برنامه خود را اغاز کنیم، ابتدا قبل از هر چیز، خروجی بودن پایه مد نظر ما را مشخص می کنیم (ما در این پروژه پایه های پورت B میکروکنترولر Atmega8 را برای استفاده انتخاب کرده ایم )

مقدار DDRB (که B معرفی پایه ها پورت B می باشد) را به 0xff می باشد را مقدار دهی می کنیم([HIGHLIGHT=#e36c09] 0xff به هگز می باشد، که اگر بخواهیم ان را به باینری ترجمه کنیم می شود 11111111 هر کدام از این 1 ها، مربوط به یک پایه پورت B می باشد و 1 یعنی ان پایه را در وضعیت خروجی قرار بده )
(هگز،دسیمال،باینری را در اینده بیشتر توضیح خواهیم داد)

کد: انتخاب همه

DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند

ما می توانیم، مقدار DDRB را بجایی هگز به باینری بنویسیم(وبرای برنامه نیز تفاوتی ندارد!) DDRB=0b11111111 (اما برای خلاصه تر شدن و راحتی کار ان را به هگز نوشته ایم)

خوب حال DDRB را در وضیعت خروجی قرار داده ایم،اکنون می خواهیم بار اول PROTB خاموش باشد (تا بعد کارهای مد نظرمان را انجام دهیم) پس ان را در وضعیت 0 قرار میدهیم(که وقتی 0 میشود،پول آپنیز فعال میشود،)

کد: انتخاب همه

PORTB=0x00;   //در وضعيت اول،پايه را 0 مي کنيم و پول آپ را نيز فعال مي کنيم


،چون می خواهیم،LED دائم در حال چشمک زدن باشد،پس باید برنامه چشمک زدن را در حلقه بی نهایت while بنویسیم

کد: انتخاب همه

while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه 
    {  //while آغاز چرخه 
   


ابتدا می خواهیم PORTB کامل، روشن شود،برای این منظور ان رو اینطور مقدار دهی می کنیم

کد: انتخاب همه

    PORTB=0xFF;   //ابتدا پورت بي را بطور کامل روشن مي کنيم

با دستور بالا،همه PORTB فعال و VCC میشوند و LED روشن میشوند،اما ما نیاز داریم،مقداری بر روی این دستور مکث کنیم، برای این منظور،از دستور تاخیر زیر استفاده می کنیم

کد: انتخاب همه

    delay_ms(1000);  //سپس به کمک تابع تاخير،1000 ميلي ثانيه دستور صبر،به سي پي يو ميدهيم 

وقتی میکروکنترولر به دستور بالا می رسد، 1 ثانیه صبر می کند (عدد 1000 نوشته شده در delay_ms به میلی ثانیه می باشد)

سپس می خواهیم،از دوباره PORTB صفر شود،و 1 ثانیه نیز صبر کند،برای این منظور

کد: انتخاب همه

    PORTB=0x00;   //بعد از تمام شدن دستور تاخير،اين دستور خوانده ميشود،و تمام پورت بي خاموش ميشود
    delay_ms(1000);  //سپس براي تاخير و صبر کردن بر روي دستور بالا،500 ميلي ثانيه تاخير ايجاد مي کنيم


میکروکنترولر بعد از خواندن دو دستور بالا،ابتدا پورت B را خاموش می کند و سپس 1 ثانیه صبر می کند!
در پایان چون در حلقه دستوری دیگری نیز وجود ندارد،حلقه به ابتدا بر می گردد و دستورات را نیز از دوباره انجام میدهد ( و این کار را نیز تا بی نهایت انجام می دهد !)
بدین شکل چشمک زن LED ساخته میشود
(*دقت کنید بعد از پایان دو خط دستوری بالا پرانتز تابع اصلی و حلقه while را نیز ببندید)

کد: انتخاب همه

    }  //while انتهايي چرخه  
   
}  //پرانتز انتها کدهايي تابع اصلي


کل کدهایی برنامه:

کد: انتخاب همه

/*******************************************************
Project : learn-1
Date    : 1395.5.18
Author  :  sinaset
centralclubs.com
-->چشمک زن بسيار ساده با ميکروکنترولر<--
ATMEGA8:ميکروکنترولر مورد استفاده
1MHZ:فرکانس کاري ميکروکنترولر
*******************************************************/
#include <mega8.h>     //را معرفي مي کنيم ATMEGA8 ابتدا کتابخانه ميکروکنترولر
#include <delay.h>     //سپس از کتابخانه اماده تاخير،براي ايجاد تاخير در چشمک زدن استفاده ميکنيم
void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي
/*
ابتدا در تابع اصلي،که هميشه ميکروکنترولر بعد از خواندن فايل ها سرامد و
کتابخانه ،شروع به خواندنش مي کند،وضعيت پايه هايي ميکروکنترولر ها را مشخص مي کنيم
*/
DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند
PORTB=0x00;   //در وضعيت اول،پايه را 0 مي کنيم و پول آپ را نيز فعال مي کنيم
while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه
    {  //while آغاز چرخه    
   
    PORTB=0xFF;   //ابتدا پورت بي را بطور کامل روشن مي کنيم
    delay_ms(1000); //سپس به کمک تابع تاخير،1000 ميلي ثانيه دستور صبر،به سي پي يو ميدهيم
   
    PORTB=0x00;   //بعد از تمام شدن دستور تاخير،اين دستور خوانده ميشود،و تمام پورت بي خاموش ميشود
    delay_ms(1000);  //سپس براي تاخير و صبر کردن بر روي دستور بالا،1000 ميلي ثانيه تاخير ايجاد مي کنيم

       //چون ديگر دستوري وجود ندارد و حلقه نيز بي نهايت مي باشد،چرخه به ابتدا بر مي گردد و دستورات را نو اجرا مي کند   

    }  //while انتهايي چرخه 
   
}  //پرانتز انتها کدهايي تابع اصلي

تصویر از کدهایی برنامه،در برنامه:
 تصویر ادامه دارد..

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » شنبه 13 شهریور 1395, 9:56 am

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

ادامه..
اجرایی برنامه چشمک زن برروی پرتئوس

اما در ادامه،قصد داریم،برنامه ساده نوشته شده را برروی پرتئوس اجرا کنیم!

مختصری در رابطه با پایه ها در مدار(که البته در پست قبل نیز توضیح داده شده و در گذشته نیز توضیحات اراده شده بود)

میکروکنترولر ما ATMEGA8 می باشد. پایه شماره 7 " VCC" میکروکنترولر به +5 رگولاتور وصل میشود
و پایه شماره 8 میکرو به " GND" میکروکنترولر به منفی یا زمین مدار باید اتصال پیدا کند (همانجور که در گذشته نیز گفتیم،بین این دو پایه 7 و 8 یک خازن 104 نیز برای جلوگیری از ورود نویز! قرار دهید.)
پایه شماره،پایه REST میکروکنترولر می باشد،که در صورتی که نخواهیم از ان استفاده کنیم،باید به VCC ان را اتصال دهیم(چون ممکن است،نویز ها باعث ریست شدن میکروکنترولر شوند)

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

خوب اکنون دیگر همه چیز آماده است، و می خواهیم مدار را ازمایش کنیم ... پس شبیه ساز را اجرا می کنیم..!
 تصویر 
خوب شبیه ساز را اجرا کردیم،همانجور که در تصویر بالا می ببینید،شبیه وارد تابع main شده است (همیشه در اعمال شبیه سازی،شبیه برای راحت کار،بجایی شروع از خط اول ! خواندن فایل ها سرامد و متغیرها و ... از تابع اصلی یعنی main شروع به فعالیت می کند!این نکته را همیشه مد نظر داشته باشید)
همانجور که می ببینید،دستور اولی که نوشته را در حال خواندن می باشد،یعنی DDRB=0xFF .. (پس همه پورت B برابر با خروجی قرار گرفتن ! )
خوب اکنون وقت اش است،به شبیه ساز بگویم،دستور بعدی را بخوان و اعمال کن! پس..
 تصویر 
دستور بعدی دستور PROTB=0x00 می باشد. که پورت های B را در وضعیت 0 قرار می دهد (یعنی مقاومت pulldown را روشن میکند،) همانجور که در تصویر بالا می ببینید،رنگ پورت به رنگ آبی تغییر وضیعت دادن!(به معنی اینکه پایه ها مربوط خروجی شده اند و در حال حاضر در وضعیت pulldown می باشند)

خوب حال که دیگر وضعیت پورت ها مشخص شده،شبیه ساز را یک بار دیگر اجرا می کنیم،تا این دفعه وارد حلقه شده و دستورات درون حلقه را اجرا کند!
 تصویر 
خوب اکنون میکرو وارد حلقه while شده و دستور PROTB=0xFF را می خواند! برای اینکه این دستور را اعمال کند،باید،یک بار دیگر شبیه ساز را اجرا کنیم،تا تغییرات را اعمال کند!
 تصویر   اکنون می ببینید، همه پورت های B در وضعیت خروجی قرار گرفته (به رنگ قرمز رنگ) و LED روشن شده است!(دستور 500 میلی ثانیه تاخیر نیز اجرا و رد شده است) و اکنون به دستور PORTB=0x00 رسیده است. و باید یک خط دیگر شبیه ساز را اجرا کنیم،تا پورت بی از دوباره در وضعیت pulldown یا همان 0 قرار گیرد.   که می ببینید،پورت های B همگی خاموش شدن و LED نیز خاموش شده است و 500 ثانیه تاخیر نیز اعمال شده است . و بدین ترتیب،دیگر خط های برنامه تمام شده است! اما چون برنامه در حلقه while بی پایان است، برنامه درون حلقه while برای همیشه اجرا میشود،و به شکل زیر همیشه در حال خاموش و روشن کردن پورت ها خود می باشد ..  تصویر  ادامه دارد...  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » چهار شنبه 24 شهریور 1395, 12:35 pm

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


ادامه بحث
پروگرام کردن برنامه بر روی میکروکنترولر.

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

بعد از ان ،فایل برنامه آموزش را نیز [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] دانلود کنید،سپس از حالت زیپ خارج کنید.

حال نرم افزار پروگرام کنند،میکروکنترولر یعنی progisp را از روی دسکتاپ اجرا کنید.سپس بر روی گزینه LOAD FLASH کلیک کنید،تا فایل برنامه نوشته شده،به نرم افزار پروگرام معرفی  تصویر *فایل که نرم افزار Progisp نیاز دارد،به پسوند Hex می باشد،که معمولا بعد از سیو کردن برنامه نوشته شده توسط کدویژن در آدرس Debug\Exe پوشه برنامه قرار داده میشود .. پس ما نیز به همین ادرس میرویم و فایل Hex برنامه را ،به progisp معرفی می کنیم. تصویر  فایل به درستی به برنامه معرفی شده باشد!متن زیر که همراه به ادرس فایل می باشد،در پایین نرم افزار نمایش داده میشود.! تصویر 



خوب اکنون همه چیز آمادست،حال وقت ان است،میکروکنترولر را درون پروگرام قرار دهیم و به نرم افزار معرفی کنیم! به مانند تصویر زیر (و آموزش ها که قبلا ذکر شده بود) میکروکنترولر را قرار دهید و جامپر ذکر شده را قرار دهید
*میکروکنترولرهای شرکت Atmel معمولا به صورت دیفالت به فرکانس 1 مگاهرتز کار می کنند،بنابراین باید جامپر ذکر شده در تصویر را قرار دهید،تا پروگرام بدانند باید با فرکانس 1 مگاهرتز با میکروکنترولر ارتباط برقرار کند. تصویر  Usb ها را وصل کنید و پروگرام را به کامپیوتر وصل کنید. سپس منوی قسمت select chip را باز کنید و میکروکنترولر atmega8a را انتخاب کنید. تصویر  اگر پروگرام به درستی به کامپیوتر ارتباط برقرار کرده باشد و همچنین میکروکنترولر بدرستی بر روی پروگرام قرار گرفته باشد! با زدن گزینه RD، پایین نرم افزار، متن زیر نمایش داده میشود! تصویر  دیگر همه چیز آماده می باشد،و باید اطلاعات را بر روی میکروکنترولر قرار بگیرد! برای این بر روی گزینه Auto کلیک کنید. تصویر    تصویر 
اگر پیام بالا ظاهر شد،یعنی با موفقیت اطلاعات بر روی میکروکنترولر قرار گرفته شده. اکنون باید مدار را بر روی بردبرد امتحان کنید،تا نتیجه کار خودتان را ببینید. تصویر 
پایان مبحث مثال LED چشمک زن.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » شنبه 10 مهر 1395, 11:02 am

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

اما در ادامه،بهتراست مثال LED را باز تر کنیم تا بدین طریق با پورت ها بیشتر آشنایی پیدا کنیم.
[HIGHLIGHT=#e36c09]
 [HIGHLIGHT=#e36c09]چشمک زدن به ترتیب 8 LED  

اما در مثالی دیگر قصد داریم به کمک همه پایه های پورت بی میکروکنترولر Atmega8 تعداد 8 LED را به [HIGHLIGHT=#ffc000]ترتیب   کنیم! (یعنی دقیقا به تعداد همه پایه های پورت B)

برای این کار از عملگر شیفت ریجستر استفاده می کنیم (که در گذشته در این قسمت آن را توضیح دادیم)

برای این کار کافیست،ابتدا مقدار اولیه PORTB را برابر با یک قرار می دهیم،سپس ان را به سمت چپ ،هر 500 میلی ثانیه یک بار 1 درجه شیفت دهیم .

 تصویر 
[HIGHLIGHT=#00b0f0]کل کدهایی برنامه:
 

کد: انتخاب همه

/*******************************************************
Project : learn-2
Date    : 1395.7.10
Author  :  sinaset
centralclubs.com

--> روشن کردن 8 ال اي دي به ترتيب پشت سرهم<--

ATMEGA8:ميکروکنترولر مورد استفاده
1MHZ:فرکانس کاري ميکروکنترولر
*******************************************************/

#include <mega8.h>     //را معرفي مي کنيم ATMEGA8 ابتدا کتابخانه ميکروکنترولر
#include <delay.h>     //سپس از کتابخانه اماده تاخير،براي ايجاد تاخير در چشمک زدن استفاده ميکنيم
unsigned char i;

void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي



/*
ابتدا در تابع اصلي،که هميشه ميکروکنترولر بعد از خواندن فايل ها سرامد و
کتابخانه ،شروع به خواندنش مي کند،وضعيت پايه هايي ميکروکنترولر ها را مشخص مي کنيم
*/

DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند
PORTB=0x00;   //قرار مي دهيمGNDهمه پورت در وضعيت صفر يا همان


while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه
    {  //while آغاز چرخه   

     PORTB=0x01;  //ابتدا پورت شماره 1 را روشن مي کنيم
     /*
      بجايي دستور بالا مي توانيد بنويسيد
      PORTB.0=1;
      دلايل روشن کردن پورت 1 اين است،بايد يک مقدار را شيف دهيم
      اگر اين مقدار صفر باشد ديگر به کمک دستور زير نمي توانيم مقداري را شيفت دهيم
      چون مقدار پورت بي همگي صفر مي باشد.
    
     */
            
     for(i=0;i<8;i++) //چون تعداد پايه هاي پورت بي 8 عدد مي باشد،مقدار چرخه فور را 8 قرار مي دهيم
     {
     delay_ms(500);   //ابتدا يک تاخير 500 ميلي ثانيه   
     PORTB<<=1;    //سپس پورت بي 1 عدد شيفت پيدا مي کنيد
    
     }
     /*
     در مثال بالا مقدار ابتدايي پورت بي
     PORTB= 00000001
     مي باشد،که بعد از هربار شيفت به وضعيت زير تغيير پيدا مي کند
     بار دوم    PORTB 00000010
     بار سوم    PORTB 00000100
     بار چهارم  PORTB 00001000
     بار پنجم   PORTB 00010000
      بار ششم   PORTB 00100000
      بار هفتم  PORTB 01000000
      بار هشتم  PORTB 10000000
      سپس از حلقه فور خارج ميشود،و بعد به ابتدا حلقه بر مي گردد و با دستور   
      PORTB=0x01;
      مي رسد و مقدارش
      PORTB= 00000001
      ميشود و از دوباره همان کارها تکرار ميشود
      */

    }  //while انتهايي چرخه 
   
}  //پرانتز انتها کدهايي تابع اصلي


همانجور که در بالا می ببینید، در حلقه while مقدار پورت بی را 1 قرار می دهیم تا مقدار کل پورت بی بشود PORTB= 00000001 . سپس وارد یک حلقه for میشود و 8 بار تکرار میشود. در این 8 بار هر دفعه یک بار 500 میلی ثانیه برنامه توقف میشود،سپس مقدار ریجستر PORTB یک درجه شیفت به چپ پیدا می کند.
[HIGHLIGHT=#f79646]بدین ترتیب LED ها پشت سرهم روشن و خاموش میشوند . 


*| [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و کدها |*

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » چهار شنبه 14 مهر 1395, 11:16 am

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

اما در ادامه..

همانجور که در مثال گذاشته دیدید،زمان شیفت دادن پورت ها،پورت ها به ترتیب روشن و خاموش میشدن،شاید یک سوال مهم برای همه پیش اماده باشد،چرا بجایی شیفت دادن، مقدار PORTB را یکی یکی افزایش نمی دادیم؟!

در مثال بالا قصد داشتیم، پورت ها را یکی یکی روشن کنیم، و اگر قرار بود،مقدار پورت B را یکی یکی افزایش دهیم،ان وقت LED ها یکی یکی روشن نمی شدن،بلکه به حالت BCD روشن میشدن.! که برای درک این مسئله و خیلی مسائل دیگر در اینده بهتر روش ها مقدار دهی به صورت هگز ،هگزادسیمال،باینری را بدانید.

مبحث مبنا های هگز،دسیمال،باینری

[HIGHLIGHT=#e36c09]باینری Binary یا Bin  

باینری که همان مسئله ی است که در گذشته نیز ان را توضیح داده ایم! همیشه به صورت 8 بیت یا 16 بیت یا نهایت 32 بیت نوشته میشوند.(بسته به تعریف متغیر ما در برنامه) و مقداری برای بیت های ان،یا 0 یا 1 می باشد!

باینری به این ترتیب شروع می شوند و مقدارش افزایش پیدا می کند:
(هشت بیتی)

00000000 اول
00000001 دوم
00000010 سوم
00000011 چهارم
00000100 پنجم
00000101 ششم
00000110 هفتم
00000111 هشتم
00001000 نهم
00001001 دهم
00001010 یازده ام
00001011 دوازده ام
00001110 سیزده ام
00001101 چهارده ام
00001110 پانزده ام
00001111 شانزده ام

همانجور که در بالا می ببینید، 4 بیت اول (سمت راست) در شانزده حالت مختلف به ترتیب شمارش شدن ( این 4 بیت دیگر بیش از این حالت ندارد! (فرمول محاسبه 2 به توان 4 ، یا به عبارتی ساده تر 2 چهاربار ضربدر خودش !) )
اما این 16 حالت،اخر کار شمارش یک متغیر 8 بیتی نیست! بلکه یک متغییر 8 بیتی می تواند تا 256 حالت مختلف دیگر شمارش باینری خود را ادامه دهد ! که در ادامه می ببینید:

کد: انتخاب همه


16= 00010000
17= 00010001
18= 00010010
19= 00010011
20= 00010100
21= 00010101
22= 00010110
23= 00010111
24= 00011000
25= 00011001
26= 00011010
27= 00011011
28= 00011100
29= 00011101
30= 00011110
31= 00011111
32= 00100000
33= 00100001
34= 00100010
35= 00100011
36= 00100100
37= 00100101
38= 00100110
39= 00100111
40= 00101000
41= 00101001
42= 00101010
43= 00101011
44= 00101100
45= 00101101
46= 00101110
47= 00101111
48= 00110000
49= 00110001
50= 00110010
51= 00110011
52= 00110100
53= 00110101
54= 00110110
55= 00110111
56= 00111000
57= 00111001
58= 00111010
59= 00111011
60= 00111100
61= 00111101
62= 00111110
63= 00111111
64= 01000000
65= 01000001
66= 01000010
67= 01000011
68= 01000100
69= 01000101
70= 01000110
71= 01000111
72= 01001000
73= 01001001
74= 01001010
75= 01001011
76= 01001100
77= 01001101
78= 01001110
79= 01001111
80= 01010000
81= 01010001
82= 01010010
83= 01010011
84= 01010100
85= 01010101
86= 01010110
87= 01010111
88= 01011000
89= 01011001
90= 01011010
91= 01011011
92= 01011100
93= 01011101
94= 01011110
95= 01011111
96= 01100000
97= 01100001
98= 01100010
99= 01100011
100= 01100100
101= 01100101
102= 01100110
103= 01100111
104= 01101000
105= 01101001
106= 01101010
107= 01101011
108= 01101100
109= 01101101
110= 01101110
111= 01101111
112= 01110000
113= 01110001
114= 01110010
115= 01110011
116= 01110100
117= 01110101
118= 01110110
119= 01110111
120= 01111000
121= 01111001
122= 01111010
123= 01111011
124= 01111100
125= 01111101
126= 01111110
127= 01111111
128= 10000000
129= 10000001
130= 10000010
131= 10000011
132= 10000100
133= 10000101
134= 10000110
135= 10000111
136= 10001000
137= 10001001
138= 10001010
139= 10001011
140= 10001100
141= 10001101
142= 10001110
143= 10001111
144= 10010000
145= 10010001
146= 10010010
147= 10010011
148= 10010100
149= 10010101
150= 10010110
151= 10010111
152= 10011000
153= 10011001
154= 10011010
155= 10011011
156= 10011100
157= 10011101
158= 10011110
159= 10011111
160= 10100000
161= 10100001
162= 10100010
163= 10100011
164= 10100100
165= 10100101
166= 10100110
167= 10100111
168= 10101000
169= 10101001
170= 10101010
171= 10101011
172= 10101100
173= 10101101
174= 10101110
175= 10101111
176= 10110000
177= 10110001
178= 10110010
179= 10110011
180= 10110100
181= 10110101
182= 10110110
183= 10110111
184= 10111000
185= 10111001
186= 10111010
187= 10111011
188= 10111100
189= 10111101
190= 10111110
191= 10111111
192= 11000000
193= 11000001
194= 11000010
195= 11000011
196= 11000100
197= 11000101
198= 11000110
199= 11000111
200= 11001000
201= 11001001
202= 11001010
203= 11001011
204= 11001100
205= 11001101
206= 11001110
207= 11001111
208= 11010000
209= 11010001
210= 11010010
211= 11010011
212= 11010100
213= 11010101
214= 11010110
215= 11010111
216= 11011000
217= 11011001
218= 11011010
219= 11011011
220= 11011100
221= 11011101
222= 11011110
223= 11011111
224= 11100000
225= 11100001
226= 11100010
227= 11100011
228= 11100100
229= 11100101
230= 11100110
231= 11100111
232= 11101000
233= 11101001
234= 11101010
235= 11101011
236= 11101100
237= 11101101
238= 11101110
239= 11101111
240= 11110000
241= 11110001
242= 11110010
243= 11110011
244= 11110100
245= 11110101
246= 11110110
247= 11110111
248= 11111000
249= 11111001
250= 11111010
251= 11111011
252= 11111100
253= 11111101
254= 11111110

255= 11111111

در بالا ما از حالت هفده ام تا دویصد پنجاه شش حالت مختلف باینری را به ترتیب شمارش کردم! و برای یک متغیر هشت بیتی بیش از 256 حالت مختلف وجود ندارد! (0 تا 255 که جمعا میشود 256 حالت ) (2 به توان 8 یعنی 2 هشت بار ضربدر خودش !)

به این روش شمارش باینری BCD گفته میشود !

حال اگر ما بخواهیم در برنامه ها خود مقدار متغییری را به باینری! مقداری دهی کنیم،باید ابتدا 0b را جلویی ان بنویسیم،سپس هشت بیت مد نظرمان را جلویش چیدمان کنیم .

بدین صورت :


;unsigned char B=0b00000001

0b به برنامه می گوید،می خواهیم مقدار دهی متغیر را به روش باینری انجام دهیم!
مقداری به روش باینری برای جاهایی که نیاز است،مقدار متغیرها را شیفت دهیم و یا زمانی که می خواهیم پورت را مقدار دهی کنیم یا کارهای از این دست،بیشتر مورد استفاده قرار می گیرد.

برای درک بیشتر موضوع شمارش به روش باینری،بهترست [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مثال را دانلود کنید،سپس فایل پرتئوس را اجرا کنید و خروجی ها را ببینید
[HIGHLIGHT=#0070c0]
 
[HIGHLIGHT=#0070c0]مقداری دهی دسیمال DECIMAL یا DEC  ([HIGHLIGHT=#00b050]که البته نام کاملش نیز هگزا دسیمال نیز می باشد Hex Decmial  )

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

اگر به شمارش باینری در چند خط بالاتر بروید، کنار هر مقدار باینری،یک عدد نوشته شده، ان عدد ها،مقدارها دسیمال معادل باینری می باشد!

فرض کنید مقداری باینری یک متغیر 0b00000001 ،ان وقت مقدار دسیمال ان چقدر می باشد ؟! مقداری دسیمال آن 1 می باشد !
حال فرض کنید مقداری باینری یک متغیر 0b00000010 ،ان وقت مقدار دسیمال ان چقدر می باشد ؟! مقداری دسیمال آن 2 می باشد !
حال فرض کنید مقداری باینری یک متغیر 0b11111111 ،ان وقت مقدار دسیمال ان چقدر می باشد ؟! مقداری دسیمال آن 255 می باشد !

جدول معادل باینری به دسیمال (گرچه در بالا نیز ان را قرار داده بودیم!)

کد: انتخاب همه

Learn_Counter Binary
Site:centralclubs.com
DECMAIL:0 BINARY:00000000
DECMAIL:1 BINARY:00000001
DECMAIL:2 BINARY:00000010
DECMAIL:3 BINARY:00000011
DECMAIL:4 BINARY:00000100
DECMAIL:5 BINARY:00000101
DECMAIL:6 BINARY:00000110
DECMAIL:7 BINARY:00000111
DECMAIL:8 BINARY:00001000
DECMAIL:9 BINARY:00001001
DECMAIL:10 BINARY:00001010
DECMAIL:11 BINARY:00001011
DECMAIL:12 BINARY:00001100
DECMAIL:13 BINARY:00001101
DECMAIL:14 BINARY:00001110
DECMAIL:15 BINARY:00001111
DECMAIL:16 BINARY:00010000
DECMAIL:17 BINARY:00010001
DECMAIL:18 BINARY:00010010
DECMAIL:19 BINARY:00010011
DECMAIL:20 BINARY:00010100
DECMAIL:21 BINARY:00010101
DECMAIL:22 BINARY:00010110
DECMAIL:23 BINARY:00010111
DECMAIL:24 BINARY:00011000
DECMAIL:25 BINARY:00011001
DECMAIL:26 BINARY:00011010
DECMAIL:27 BINARY:00011011
DECMAIL:28 BINARY:00011100
DECMAIL:29 BINARY:00011101
DECMAIL:30 BINARY:00011110
DECMAIL:31 BINARY:00011111
DECMAIL:32 BINARY:00100000
DECMAIL:33 BINARY:00100001
DECMAIL:34 BINARY:00100010
DECMAIL:35 BINARY:00100011
DECMAIL:36 BINARY:00100100
DECMAIL:37 BINARY:00100101
DECMAIL:38 BINARY:00100110
DECMAIL:39 BINARY:00100111
DECMAIL:40 BINARY:00101000
DECMAIL:41 BINARY:00101001
DECMAIL:42 BINARY:00101010
DECMAIL:43 BINARY:00101011
DECMAIL:44 BINARY:00101100
DECMAIL:45 BINARY:00101101
DECMAIL:46 BINARY:00101110
DECMAIL:47 BINARY:00101111
DECMAIL:48 BINARY:00110000
DECMAIL:49 BINARY:00110001
DECMAIL:50 BINARY:00110010
DECMAIL:51 BINARY:00110011
DECMAIL:52 BINARY:00110100
DECMAIL:53 BINARY:00110101
DECMAIL:54 BINARY:00110110
DECMAIL:55 BINARY:00110111
DECMAIL:56 BINARY:00111000
DECMAIL:57 BINARY:00111001
DECMAIL:58 BINARY:00111010
DECMAIL:59 BINARY:00111011
DECMAIL:60 BINARY:00111100
DECMAIL:61 BINARY:00111101
DECMAIL:62 BINARY:00111110
DECMAIL:63 BINARY:00111111
DECMAIL:64 BINARY:01000000
DECMAIL:65 BINARY:01000001
DECMAIL:66 BINARY:01000010
DECMAIL:67 BINARY:01000011
DECMAIL:68 BINARY:01000100
DECMAIL:69 BINARY:01000101
DECMAIL:70 BINARY:01000110
DECMAIL:71 BINARY:01000111
DECMAIL:72 BINARY:01001000
DECMAIL:73 BINARY:01001001
DECMAIL:74 BINARY:01001010
DECMAIL:75 BINARY:01001011
DECMAIL:76 BINARY:01001100
DECMAIL:77 BINARY:01001101
DECMAIL:78 BINARY:01001110
DECMAIL:79 BINARY:01001111
DECMAIL:80 BINARY:01010000
DECMAIL:81 BINARY:01010001
DECMAIL:82 BINARY:01010010
DECMAIL:83 BINARY:01010011
DECMAIL:84 BINARY:01010100
DECMAIL:85 BINARY:01010101
DECMAIL:86 BINARY:01010110
DECMAIL:87 BINARY:01010111
DECMAIL:88 BINARY:01011000
DECMAIL:89 BINARY:01011001
DECMAIL:90 BINARY:01011010
DECMAIL:91 BINARY:01011011
DECMAIL:92 BINARY:01011100
DECMAIL:93 BINARY:01011101
DECMAIL:94 BINARY:01011110
DECMAIL:95 BINARY:01011111
DECMAIL:96 BINARY:01100000
DECMAIL:97 BINARY:01100001
DECMAIL:98 BINARY:01100010
DECMAIL:99 BINARY:01100011
DECMAIL:100 BINARY:01100100
DECMAIL:101 BINARY:01100101
DECMAIL:102 BINARY:01100110
DECMAIL:103 BINARY:01100111
DECMAIL:104 BINARY:01101000
DECMAIL:105 BINARY:01101001
DECMAIL:106 BINARY:01101010
DECMAIL:107 BINARY:01101011
DECMAIL:108 BINARY:01101100
DECMAIL:109 BINARY:01101101
DECMAIL:110 BINARY:01101110
DECMAIL:111 BINARY:01101111
DECMAIL:112 BINARY:01110000
DECMAIL:113 BINARY:01110001
DECMAIL:114 BINARY:01110010
DECMAIL:115 BINARY:01110011
DECMAIL:116 BINARY:01110100
DECMAIL:117 BINARY:01110101
DECMAIL:118 BINARY:01110110
DECMAIL:119 BINARY:01110111
DECMAIL:120 BINARY:01111000
DECMAIL:121 BINARY:01111001
DECMAIL:122 BINARY:01111010
DECMAIL:123 BINARY:01111011
DECMAIL:124 BINARY:01111100
DECMAIL:125 BINARY:01111101
DECMAIL:126 BINARY:01111110
DECMAIL:127 BINARY:01111111
DECMAIL:128 BINARY:10000000
DECMAIL:129 BINARY:10000001
DECMAIL:130 BINARY:10000010
DECMAIL:131 BINARY:10000011
DECMAIL:132 BINARY:10000100
DECMAIL:133 BINARY:10000101
DECMAIL:134 BINARY:10000110
DECMAIL:135 BINARY:10000111
DECMAIL:136 BINARY:10001000
DECMAIL:137 BINARY:10001001
DECMAIL:138 BINARY:10001010
DECMAIL:139 BINARY:10001011
DECMAIL:140 BINARY:10001100
DECMAIL:141 BINARY:10001101
DECMAIL:142 BINARY:10001110
DECMAIL:143 BINARY:10001111
DECMAIL:144 BINARY:10010000
DECMAIL:145 BINARY:10010001
DECMAIL:146 BINARY:10010010
DECMAIL:147 BINARY:10010011
DECMAIL:148 BINARY:10010100
DECMAIL:149 BINARY:10010101
DECMAIL:150 BINARY:10010110
DECMAIL:151 BINARY:10010111
DECMAIL:152 BINARY:10011000
DECMAIL:153 BINARY:10011001
DECMAIL:154 BINARY:10011010
DECMAIL:155 BINARY:10011011
DECMAIL:156 BINARY:10011100
DECMAIL:157 BINARY:10011101
DECMAIL:158 BINARY:10011110
DECMAIL:159 BINARY:10011111
DECMAIL:160 BINARY:10100000
DECMAIL:161 BINARY:10100001
DECMAIL:162 BINARY:10100010
DECMAIL:163 BINARY:10100011
DECMAIL:164 BINARY:10100100
DECMAIL:165 BINARY:10100101
DECMAIL:166 BINARY:10100110
DECMAIL:167 BINARY:10100111
DECMAIL:168 BINARY:10101000
DECMAIL:169 BINARY:10101001
DECMAIL:170 BINARY:10101010
DECMAIL:171 BINARY:10101011
DECMAIL:172 BINARY:10101100
DECMAIL:173 BINARY:10101101
DECMAIL:174 BINARY:10101110
DECMAIL:175 BINARY:10101111
DECMAIL:176 BINARY:10110000
DECMAIL:177 BINARY:10110001
DECMAIL:178 BINARY:10110010
DECMAIL:179 BINARY:10110011
DECMAIL:180 BINARY:10110100
DECMAIL:181 BINARY:10110101
DECMAIL:182 BINARY:10110110
DECMAIL:183 BINARY:10110111
DECMAIL:184 BINARY:10111000
DECMAIL:185 BINARY:10111001
DECMAIL:186 BINARY:10111010
DECMAIL:187 BINARY:10111011
DECMAIL:188 BINARY:10111100
DECMAIL:189 BINARY:10111101
DECMAIL:190 BINARY:10111110
DECMAIL:191 BINARY:10111111
DECMAIL:192 BINARY:11000000
DECMAIL:193 BINARY:11000001
DECMAIL:194 BINARY:11000010
DECMAIL:195 BINARY:11000011
DECMAIL:196 BINARY:11000100
DECMAIL:197 BINARY:11000101
DECMAIL:198 BINARY:11000110
DECMAIL:199 BINARY:11000111
DECMAIL:200 BINARY:11001000
DECMAIL:201 BINARY:11001001
DECMAIL:202 BINARY:11001010
DECMAIL:203 BINARY:11001011
DECMAIL:204 BINARY:11001100
DECMAIL:205 BINARY:11001101
DECMAIL:206 BINARY:11001110
DECMAIL:207 BINARY:11001111
DECMAIL:208 BINARY:11010000
DECMAIL:209 BINARY:11010001
DECMAIL:210 BINARY:11010010
DECMAIL:211 BINARY:11010011
DECMAIL:212 BINARY:11010100
DECMAIL:213 BINARY:11010101
DECMAIL:214 BINARY:11010110
DECMAIL:215 BINARY:11010111
DECMAIL:216 BINARY:11011000
DECMAIL:217 BINARY:11011001
DECMAIL:218 BINARY:11011010
DECMAIL:219 BINARY:11011011
DECMAIL:220 BINARY:11011100
DECMAIL:221 BINARY:11011101
DECMAIL:222 BINARY:11011110
DECMAIL:223 BINARY:11011111
DECMAIL:224 BINARY:11100000
DECMAIL:225 BINARY:11100001
DECMAIL:226 BINARY:11100010
DECMAIL:227 BINARY:11100011
DECMAIL:228 BINARY:11100100
DECMAIL:229 BINARY:11100101
DECMAIL:230 BINARY:11100110
DECMAIL:231 BINARY:11100111
DECMAIL:232 BINARY:11101000
DECMAIL:233 BINARY:11101001
DECMAIL:234 BINARY:11101010
DECMAIL:235 BINARY:11101011
DECMAIL:236 BINARY:11101100
DECMAIL:237 BINARY:11101101
DECMAIL:238 BINARY:11101110
DECMAIL:239 BINARY:11101111
DECMAIL:240 BINARY:11110000
DECMAIL:241 BINARY:11110001
DECMAIL:242 BINARY:11110010
DECMAIL:243 BINARY:11110011
DECMAIL:244 BINARY:11110100
DECMAIL:245 BINARY:11110101
DECMAIL:246 BINARY:11110110
DECMAIL:247 BINARY:11110111
DECMAIL:248 BINARY:11111000
DECMAIL:249 BINARY:11111001
DECMAIL:250 BINARY:11111010
DECMAIL:251 BINARY:11111011
DECMAIL:252 BINARY:11111100
DECMAIL:253 BINARY:11111101
DECMAIL:254 BINARY:11111110
DECMAIL:255 BINARY:11111111



بطوری کلی،در برنامه،وقتی گفته شود 0 یا 0b00000000 تفاوتی ندارد! و مقداری دهی به دو روش صحیح می باشد و برنامه یک کار را انجام میدهد.!

;unsigned char B=0b11111111 به روش باینری
یا
;unsigned char B=255 به روش هگزا دسیمال


ولی روش دسیمال ساده تر و بهتر نیز می باشد. معمولا در اکثرا برنامه ها،بیشتر بدین شکل متغیرها مقداری دهی میشوند!

[HIGHLIGHT=#e36c09]مقداری دهی به روش هگز! HEX 

اما مقداری دهی به روش هگز، با روش های دیگر تفاوت نیز دارد! در این روش مقداری دهی، شمارش حول 16 نوع مقدار دهی می چرخد!

به ترتیب :
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

جمعا 16 نوع مقداری دهی! این روش نیز خلاصه تر از دو روش قبلی می باشد! و کاربرد ها فراوان نیز دارد!

هر کدام از مقدار هایی Hex معادل باینری و دسیمال نیز دارد! که در جدول زیر می توانید ببینید! تصویر   نوشتن مقدار ها به روش هگز،در برنامه باید 0x را قبل از ان بنویسید (به مانند باینری که باید 0b را می نوشتید)   برای درک بهتر، شمارش یک متغیر هشت بیتی به سه روش باینری و هگز و دسیمال انجام را می توانید در جدول پایین ببینید:  

کد: انتخاب همه

Learn_Counter DECIMAL Hex Binary
Site:centralclubs.com
HEX:0x0  |   DECIMAL:0  |   BINARY:0b00000000
HEX:0x1  |   DECIMAL:1  |   BINARY:0b00000001
HEX:0x2  |   DECIMAL:2  |   BINARY:0b00000010
HEX:0x3  |   DECIMAL:3  |   BINARY:0b00000011
HEX:0x4  |   DECIMAL:4  |   BINARY:0b00000100
HEX:0x5  |   DECIMAL:5  |   BINARY:0b00000101
HEX:0x6  |   DECIMAL:6  |   BINARY:0b00000110
HEX:0x7  |   DECIMAL:7  |   BINARY:0b00000111
HEX:0x8  |   DECIMAL:8  |   BINARY:0b00001000
HEX:0x9  |   DECIMAL:9  |   BINARY:0b00001001
HEX:0xa  |   DECIMAL:10  |   BINARY:0b00001010
HEX:0xb  |   DECIMAL:11  |   BINARY:0b00001011
HEX:0xc  |   DECIMAL:12  |   BINARY:0b00001100
HEX:0xd  |   DECIMAL:13  |   BINARY:0b00001101
HEX:0xe  |   DECIMAL:14  |   BINARY:0b00001110
HEX:0xf  |   DECIMAL:15  |   BINARY:0b00001111
HEX:0x10  |   DECIMAL:16  |   BINARY:0b00010000
HEX:0x11  |   DECIMAL:17  |   BINARY:0b00010001
HEX:0x12  |   DECIMAL:18  |   BINARY:0b00010010
HEX:0x13  |   DECIMAL:19  |   BINARY:0b00010011
HEX:0x14  |   DECIMAL:20  |   BINARY:0b00010100
HEX:0x15  |   DECIMAL:21  |   BINARY:0b00010101
HEX:0x16  |   DECIMAL:22  |   BINARY:0b00010110
HEX:0x17  |   DECIMAL:23  |   BINARY:0b00010111
HEX:0x18  |   DECIMAL:24  |   BINARY:0b00011000
HEX:0x19  |   DECIMAL:25  |   BINARY:0b00011001
HEX:0x1a  |   DECIMAL:26  |   BINARY:0b00011010
HEX:0x1b  |   DECIMAL:27  |   BINARY:0b00011011
HEX:0x1c  |   DECIMAL:28  |   BINARY:0b00011100
HEX:0x1d  |   DECIMAL:29  |   BINARY:0b00011101
HEX:0x1e  |   DECIMAL:30  |   BINARY:0b00011110
HEX:0x1f  |   DECIMAL:31  |   BINARY:0b00011111
HEX:0x20  |   DECIMAL:32  |   BINARY:0b00100000
HEX:0x21  |   DECIMAL:33  |   BINARY:0b00100001
HEX:0x22  |   DECIMAL:34  |   BINARY:0b00100010
HEX:0x23  |   DECIMAL:35  |   BINARY:0b00100011
HEX:0x24  |   DECIMAL:36  |   BINARY:0b00100100
HEX:0x25  |   DECIMAL:37  |   BINARY:0b00100101
HEX:0x26  |   DECIMAL:38  |   BINARY:0b00100110
HEX:0x27  |   DECIMAL:39  |   BINARY:0b00100111
HEX:0x28  |   DECIMAL:40  |   BINARY:0b00101000
HEX:0x29  |   DECIMAL:41  |   BINARY:0b00101001
HEX:0x2a  |   DECIMAL:42  |   BINARY:0b00101010
HEX:0x2b  |   DECIMAL:43  |   BINARY:0b00101011
HEX:0x2c  |   DECIMAL:44  |   BINARY:0b00101100
HEX:0x2d  |   DECIMAL:45  |   BINARY:0b00101101
HEX:0x2e  |   DECIMAL:46  |   BINARY:0b00101110
HEX:0x2f  |   DECIMAL:47  |   BINARY:0b00101111
HEX:0x30  |   DECIMAL:48  |   BINARY:0b00110000
HEX:0x31  |   DECIMAL:49  |   BINARY:0b00110001
HEX:0x32  |   DECIMAL:50  |   BINARY:0b00110010
HEX:0x33  |   DECIMAL:51  |   BINARY:0b00110011
HEX:0x34  |   DECIMAL:52  |   BINARY:0b00110100
HEX:0x35  |   DECIMAL:53  |   BINARY:0b00110101
HEX:0x36  |   DECIMAL:54  |   BINARY:0b00110110
HEX:0x37  |   DECIMAL:55  |   BINARY:0b00110111
HEX:0x38  |   DECIMAL:56  |   BINARY:0b00111000
HEX:0x39  |   DECIMAL:57  |   BINARY:0b00111001
HEX:0x3a  |   DECIMAL:58  |   BINARY:0b00111010
HEX:0x3b  |   DECIMAL:59  |   BINARY:0b00111011
HEX:0x3c  |   DECIMAL:60  |   BINARY:0b00111100
HEX:0x3d  |   DECIMAL:61  |   BINARY:0b00111101
HEX:0x3e  |   DECIMAL:62  |   BINARY:0b00111110
HEX:0x3f  |   DECIMAL:63  |   BINARY:0b00111111
HEX:0x40  |   DECIMAL:64  |   BINARY:0b01000000
HEX:0x41  |   DECIMAL:65  |   BINARY:0b01000001
HEX:0x42  |   DECIMAL:66  |   BINARY:0b01000010
HEX:0x43  |   DECIMAL:67  |   BINARY:0b01000011
HEX:0x44  |   DECIMAL:68  |   BINARY:0b01000100
HEX:0x45  |   DECIMAL:69  |   BINARY:0b01000101
HEX:0x46  |   DECIMAL:70  |   BINARY:0b01000110
HEX:0x47  |   DECIMAL:71  |   BINARY:0b01000111
HEX:0x48  |   DECIMAL:72  |   BINARY:0b01001000
HEX:0x49  |   DECIMAL:73  |   BINARY:0b01001001
HEX:0x4a  |   DECIMAL:74  |   BINARY:0b01001010
HEX:0x4b  |   DECIMAL:75  |   BINARY:0b01001011
HEX:0x4c  |   DECIMAL:76  |   BINARY:0b01001100
HEX:0x4d  |   DECIMAL:77  |   BINARY:0b01001101
HEX:0x4e  |   DECIMAL:78  |   BINARY:0b01001110
HEX:0x4f  |   DECIMAL:79  |   BINARY:0b01001111
HEX:0x50  |   DECIMAL:80  |   BINARY:0b01010000
HEX:0x51  |   DECIMAL:81  |   BINARY:0b01010001
HEX:0x52  |   DECIMAL:82  |   BINARY:0b01010010
HEX:0x53  |   DECIMAL:83  |   BINARY:0b01010011
HEX:0x54  |   DECIMAL:84  |   BINARY:0b01010100
HEX:0x55  |   DECIMAL:85  |   BINARY:0b01010101
HEX:0x56  |   DECIMAL:86  |   BINARY:0b01010110
HEX:0x57  |   DECIMAL:87  |   BINARY:0b01010111
HEX:0x58  |   DECIMAL:88  |   BINARY:0b01011000
HEX:0x59  |   DECIMAL:89  |   BINARY:0b01011001
HEX:0x5a  |   DECIMAL:90  |   BINARY:0b01011010
HEX:0x5b  |   DECIMAL:91  |   BINARY:0b01011011
HEX:0x5c  |   DECIMAL:92  |   BINARY:0b01011100
HEX:0x5d  |   DECIMAL:93  |   BINARY:0b01011101
HEX:0x5e  |   DECIMAL:94  |   BINARY:0b01011110
HEX:0x5f  |   DECIMAL:95  |   BINARY:0b01011111
HEX:0x60  |   DECIMAL:96  |   BINARY:0b01100000
HEX:0x61  |   DECIMAL:97  |   BINARY:0b01100001
HEX:0x62  |   DECIMAL:98  |   BINARY:0b01100010
HEX:0x63  |   DECIMAL:99  |   BINARY:0b01100011
HEX:0x64  |   DECIMAL:100  |   BINARY:0b01100100
HEX:0x65  |   DECIMAL:101  |   BINARY:0b01100101
HEX:0x66  |   DECIMAL:102  |   BINARY:0b01100110
HEX:0x67  |   DECIMAL:103  |   BINARY:0b01100111
HEX:0x68  |   DECIMAL:104  |   BINARY:0b01101000
HEX:0x69  |   DECIMAL:105  |   BINARY:0b01101001
HEX:0x6a  |   DECIMAL:106  |   BINARY:0b01101010
HEX:0x6b  |   DECIMAL:107  |   BINARY:0b01101011
HEX:0x6c  |   DECIMAL:108  |   BINARY:0b01101100
HEX:0x6d  |   DECIMAL:109  |   BINARY:0b01101101
HEX:0x6e  |   DECIMAL:110  |   BINARY:0b01101110
HEX:0x6f  |   DECIMAL:111  |   BINARY:0b01101111
HEX:0x70  |   DECIMAL:112  |   BINARY:0b01110000
HEX:0x71  |   DECIMAL:113  |   BINARY:0b01110001
HEX:0x72  |   DECIMAL:114  |   BINARY:0b01110010
HEX:0x73  |   DECIMAL:115  |   BINARY:0b01110011
HEX:0x74  |   DECIMAL:116  |   BINARY:0b01110100
HEX:0x75  |   DECIMAL:117  |   BINARY:0b01110101
HEX:0x76  |   DECIMAL:118  |   BINARY:0b01110110
HEX:0x77  |   DECIMAL:119  |   BINARY:0b01110111
HEX:0x78  |   DECIMAL:120  |   BINARY:0b01111000
HEX:0x79  |   DECIMAL:121  |   BINARY:0b01111001
HEX:0x7a  |   DECIMAL:122  |   BINARY:0b01111010
HEX:0x7b  |   DECIMAL:123  |   BINARY:0b01111011
HEX:0x7c  |   DECIMAL:124  |   BINARY:0b01111100
HEX:0x7d  |   DECIMAL:125  |   BINARY:0b01111101
HEX:0x7e  |   DECIMAL:126  |   BINARY:0b01111110
HEX:0x7f  |   DECIMAL:127  |   BINARY:0b01111111
HEX:0x80  |   DECIMAL:128  |   BINARY:0b10000000
HEX:0x81  |   DECIMAL:129  |   BINARY:0b10000001
HEX:0x82  |   DECIMAL:130  |   BINARY:0b10000010
HEX:0x83  |   DECIMAL:131  |   BINARY:0b10000011
HEX:0x84  |   DECIMAL:132  |   BINARY:0b10000100
HEX:0x85  |   DECIMAL:133  |   BINARY:0b10000101
HEX:0x86  |   DECIMAL:134  |   BINARY:0b10000110
HEX:0x87  |   DECIMAL:135  |   BINARY:0b10000111
HEX:0x88  |   DECIMAL:136  |   BINARY:0b10001000
HEX:0x89  |   DECIMAL:137  |   BINARY:0b10001001
HEX:0x8a  |   DECIMAL:138  |   BINARY:0b10001010
HEX:0x8b  |   DECIMAL:139  |   BINARY:0b10001011
HEX:0x8c  |   DECIMAL:140  |   BINARY:0b10001100
HEX:0x8d  |   DECIMAL:141  |   BINARY:0b10001101
HEX:0x8e  |   DECIMAL:142  |   BINARY:0b10001110
HEX:0x8f  |   DECIMAL:143  |   BINARY:0b10001111
HEX:0x90  |   DECIMAL:144  |   BINARY:0b10010000
HEX:0x91  |   DECIMAL:145  |   BINARY:0b10010001
HEX:0x92  |   DECIMAL:146  |   BINARY:0b10010010
HEX:0x93  |   DECIMAL:147  |   BINARY:0b10010011
HEX:0x94  |   DECIMAL:148  |   BINARY:0b10010100
HEX:0x95  |   DECIMAL:149  |   BINARY:0b10010101
HEX:0x96  |   DECIMAL:150  |   BINARY:0b10010110
HEX:0x97  |   DECIMAL:151  |   BINARY:0b10010111
HEX:0x98  |   DECIMAL:152  |   BINARY:0b10011000
HEX:0x99  |   DECIMAL:153  |   BINARY:0b10011001
HEX:0x9a  |   DECIMAL:154  |   BINARY:0b10011010
HEX:0x9b  |   DECIMAL:155  |   BINARY:0b10011011
HEX:0x9c  |   DECIMAL:156  |   BINARY:0b10011100
HEX:0x9d  |   DECIMAL:157  |   BINARY:0b10011101
HEX:0x9e  |   DECIMAL:158  |   BINARY:0b10011110
HEX:0x9f  |   DECIMAL:159  |   BINARY:0b10011111
HEX:0xa0  |   DECIMAL:160  |   BINARY:0b10100000
HEX:0xa1  |   DECIMAL:161  |   BINARY:0b10100001
HEX:0xa2  |   DECIMAL:162  |   BINARY:0b10100010
HEX:0xa3  |   DECIMAL:163  |   BINARY:0b10100011
HEX:0xa4  |   DECIMAL:164  |   BINARY:0b10100100
HEX:0xa5  |   DECIMAL:165  |   BINARY:0b10100101
HEX:0xa6  |   DECIMAL:166  |   BINARY:0b10100110
HEX:0xa7  |   DECIMAL:167  |   BINARY:0b10100111
HEX:0xa8  |   DECIMAL:168  |   BINARY:0b10101000
HEX:0xa9  |   DECIMAL:169  |   BINARY:0b10101001
HEX:0xaa  |   DECIMAL:170  |   BINARY:0b10101010
HEX:0xab  |   DECIMAL:171  |   BINARY:0b10101011
HEX:0xac  |   DECIMAL:172  |   BINARY:0b10101100
HEX:0xad  |   DECIMAL:173  |   BINARY:0b10101101
HEX:0xae  |   DECIMAL:174  |   BINARY:0b10101110
HEX:0xaf  |   DECIMAL:175  |   BINARY:0b10101111
HEX:0xb0  |   DECIMAL:176  |   BINARY:0b10110000
HEX:0xb1  |   DECIMAL:177  |   BINARY:0b10110001
HEX:0xb2  |   DECIMAL:178  |   BINARY:0b10110010
HEX:0xb3  |   DECIMAL:179  |   BINARY:0b10110011
HEX:0xb4  |   DECIMAL:180  |   BINARY:0b10110100
HEX:0xb5  |   DECIMAL:181  |   BINARY:0b10110101
HEX:0xb6  |   DECIMAL:182  |   BINARY:0b10110110
HEX:0xb7  |   DECIMAL:183  |   BINARY:0b10110111
HEX:0xb8  |   DECIMAL:184  |   BINARY:0b10111000
HEX:0xb9  |   DECIMAL:185  |   BINARY:0b10111001
HEX:0xba  |   DECIMAL:186  |   BINARY:0b10111010
HEX:0xbb  |   DECIMAL:187  |   BINARY:0b10111011
HEX:0xbc  |   DECIMAL:188  |   BINARY:0b10111100
HEX:0xbd  |   DECIMAL:189  |   BINARY:0b10111101
HEX:0xbe  |   DECIMAL:190  |   BINARY:0b10111110
HEX:0xbf  |   DECIMAL:191  |   BINARY:0b10111111
HEX:0xc0  |   DECIMAL:192  |   BINARY:0b11000000
HEX:0xc1  |   DECIMAL:193  |   BINARY:0b11000001
HEX:0xc2  |   DECIMAL:194  |   BINARY:0b11000010
HEX:0xc3  |   DECIMAL:195  |   BINARY:0b11000011
HEX:0xc4  |   DECIMAL:196  |   BINARY:0b11000100
HEX:0xc5  |   DECIMAL:197  |   BINARY:0b11000101
HEX:0xc6  |   DECIMAL:198  |   BINARY:0b11000110
HEX:0xc7  |   DECIMAL:199  |   BINARY:0b11000111
HEX:0xc8  |   DECIMAL:200  |   BINARY:0b11001000
HEX:0xc9  |   DECIMAL:201  |   BINARY:0b11001001
HEX:0xca  |   DECIMAL:202  |   BINARY:0b11001010
HEX:0xcb  |   DECIMAL:203  |   BINARY:0b11001011
HEX:0xcc  |   DECIMAL:204  |   BINARY:0b11001100
HEX:0xcd  |   DECIMAL:205  |   BINARY:0b11001101
HEX:0xce  |   DECIMAL:206  |   BINARY:0b11001110
HEX:0xcf  |   DECIMAL:207  |   BINARY:0b11001111
HEX:0xd0  |   DECIMAL:208  |   BINARY:0b11010000
HEX:0xd1  |   DECIMAL:209  |   BINARY:0b11010001
HEX:0xd2  |   DECIMAL:210  |   BINARY:0b11010010
HEX:0xd3  |   DECIMAL:211  |   BINARY:0b11010011
HEX:0xd4  |   DECIMAL:212  |   BINARY:0b11010100
HEX:0xd5  |   DECIMAL:213  |   BINARY:0b11010101
HEX:0xd6  |   DECIMAL:214  |   BINARY:0b11010110
HEX:0xd7  |   DECIMAL:215  |   BINARY:0b11010111
HEX:0xd8  |   DECIMAL:216  |   BINARY:0b11011000
HEX:0xd9  |   DECIMAL:217  |   BINARY:0b11011001
HEX:0xda  |   DECIMAL:218  |   BINARY:0b11011010
HEX:0xdb  |   DECIMAL:219  |   BINARY:0b11011011
HEX:0xdc  |   DECIMAL:220  |   BINARY:0b11011100
HEX:0xdd  |   DECIMAL:221  |   BINARY:0b11011101
HEX:0xde  |   DECIMAL:222  |   BINARY:0b11011110
HEX:0xdf  |   DECIMAL:223  |   BINARY:0b11011111
HEX:0xe0  |   DECIMAL:224  |   BINARY:0b11100000
HEX:0xe1  |   DECIMAL:225  |   BINARY:0b11100001
HEX:0xe2  |   DECIMAL:226  |   BINARY:0b11100010
HEX:0xe3  |   DECIMAL:227  |   BINARY:0b11100011
HEX:0xe4  |   DECIMAL:228  |   BINARY:0b11100100
HEX:0xe5  |   DECIMAL:229  |   BINARY:0b11100101
HEX:0xe6  |   DECIMAL:230  |   BINARY:0b11100110
HEX:0xe7  |   DECIMAL:231  |   BINARY:0b11100111
HEX:0xe8  |   DECIMAL:232  |   BINARY:0b11101000
HEX:0xe9  |   DECIMAL:233  |   BINARY:0b11101001
HEX:0xea  |   DECIMAL:234  |   BINARY:0b11101010
HEX:0xeb  |   DECIMAL:235  |   BINARY:0b11101011
HEX:0xec  |   DECIMAL:236  |   BINARY:0b11101100
HEX:0xed  |   DECIMAL:237  |   BINARY:0b11101101
HEX:0xee  |   DECIMAL:238  |   BINARY:0b11101110
HEX:0xef  |   DECIMAL:239  |   BINARY:0b11101111
HEX:0xf0  |   DECIMAL:240  |   BINARY:0b11110000
HEX:0xf1  |   DECIMAL:241  |   BINARY:0b11110001
HEX:0xf2  |   DECIMAL:242  |   BINARY:0b11110010
HEX:0xf3  |   DECIMAL:243  |   BINARY:0b11110011
HEX:0xf4  |   DECIMAL:244  |   BINARY:0b11110100
HEX:0xf5  |   DECIMAL:245  |   BINARY:0b11110101
HEX:0xf6  |   DECIMAL:246  |   BINARY:0b11110110
HEX:0xf7  |   DECIMAL:247  |   BINARY:0b11110111
HEX:0xf8  |   DECIMAL:248  |   BINARY:0b11111000
HEX:0xf9  |   DECIMAL:249  |   BINARY:0b11111001
HEX:0xfa  |   DECIMAL:250  |   BINARY:0b11111010
HEX:0xfb  |   DECIMAL:251  |   BINARY:0b11111011
HEX:0xfc  |   DECIMAL:252  |   BINARY:0b11111100
HEX:0xfd  |   DECIMAL:253  |   BINARY:0b11111101
HEX:0xfe  |   DECIMAL:254  |   BINARY:0b11111110

HEX:0xff | DECIMAL:255 | BINARY:  



پس در برنامه تفاوتی ندارد،که شما یک متغیر را به سه روش زیر تعریف کنید،در هر صورت مقدار ان 1 می باشد:

unsigned char B=0b00000001
unsigned char B=0x01
unsigned char B=1


* 1 یک مثال بود،طبق جدول بالا،هر مقدار و مبنایی معادلش ذکر شود، دو مبنا دیگر نیز دقیقا همان (اما به روش خودشان!) نیز می باشند.

برای دیدن شمارش به سه روش ذکر شده،به کمک پرتئوس،[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مثال را ببینید و اجرا کنید.
=========   آشنایی بیشتر با هگز و دسیمال و باینری، فرمول های بدست اوری انها،[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مقاله را مطالعه فرمایید.  جهت معادل سازی سه مبنا به هم دیگر، می توانید از این دو برنامه استفاده کنید: برنامه اولو برنامه دوم  
در پست بعدی مثال LED ها را ادامه خواهیم داد.
باتشکر. 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » پنج شنبه 15 مهر 1395, 10:35 am

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

[HIGHLIGHT=#ffc000]روشن شدن LED ها به صورت BCD
 
در پست قبل،در رابطه با ترتیب شمارش باینری،توضیحاتی ارائه کرده ایم، حال برای درک بهتر این مسئله می خواهیم، چنین شمارش را با یک از پورت ها میکروکنترولر انجام دهیم.

برای این کار کافیست! یک متغیر 8 بیتی تعریف کنیم،سپس در حلقه while ان را 1 واحد 1 واحد افزایش بدهیم.

کد: انتخاب همه

while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه 
    {  //while آغاز چرخه   

     PORTB=i;      //مقدار پورت بي برابر با اي
     i++;      //مقدار متغير يک واحد افزايش
     delay_ms(50);  //زمان تاخير


    }  //while انتهايي چرخه 
 تصویر 

همانجور که کدهایی بالا دید،پورت بی برابر با مقدار i خواهد بود! و i نیز هر بار 1 واحد افزایش پیدا می کند!(*مقدار افزایش به دسیمال می باشد)

چون متغیر ما هشتی بیتی می باشد، و تعداد پورت بی نیز هشت بیت می باشد! پس هشت LED وصل شده به PORTB، در 256 حالت مختلف نمایش داده میشود

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مثال(کدها و شبیه ساز)
---
بعد از انجام این پروژه می توانید بهتر،با شمارش باینری نیز آشنایی پیدا کنید.(برای درک بهتر،بهترست سرعت تاخیر برنامه را از 50 میلی ثانیه به 250 یا 500 میلی ثانیه افزایش دهید)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Major
Major
پست: 374
تاریخ عضویت: یک شنبه 14 بهمن 1386, 1:04 pm
سپاس‌های ارسالی: 253 بار
سپاس‌های دریافتی: 711 بار

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

پست توسط kingday » شنبه 18 دی 1395, 9:44 pm

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

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

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

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

پست توسط sinaset » یک شنبه 19 دی 1395, 9:01 am

سلام بر شما
ممنون و تشکر از نظرات خوب شما.
---
اگر اشتباه نکنم،در این تاپیک در گذشته در رابطه با سرعت پورت ها توضیحات ارائه کردم(البته شاید هم چنین نکرده باشم)
اما فکر میکنم، نهایت سرعتی که میشه روی پایه ها AVR به صورت معمولی پیدا سازی کرد 1 تا 2 مگاهرتز باشد. (با پرتئوس هم می توانید شبیه سازی کنید)
اگر با فرکانس 12 مگاهرتز اعمال کنی،احتمالا خروجی رو پایه،یک فرکانس 2 مگاهرتزی مربعی خواهد بود...
میکرو هر 1 میکرو ثانیه،یک دستور رو بررسی و انجام میدهد، اما در AVR محدودیت سرعت پورت ها نیز وجود دارد (که خود خود تاخیر ایجاد می کند)

برای پیدا کردن پاسخ صحیح تر،بهتر است،دیتاشیت را مطالعه فرمایید.
---
در [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]مقاله یک سایت،گفته شده با دستور مستقیم اسمبلی،میشه سرعت سوئیچ رو بیشتر کرد (بطور کلی دستورات اسمبلی بازده بهتر و مصرف توان انرژی در میکرو رو کمتر و بهینه تر می کنند)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » جمعه 4 فروردین 1396, 1:36 pm

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


با عرض پوزش بابت تاخیر... در ادامه می خواهیم شمارش با سون سگمنت را آموزش بدهیم.

اما قبل از ان اندکی آشنایی با سون سگمنت..

سون سگمنت از 7 +1 ال ای دی تشکیل شده است،که ما به کمک این نمایشگر ارزان قیمت می توانیم اعداد 0 تا 9 را شمارش کنیم! و با گذاشتن،چند عدد از نمایشگر در کنار هم،10 و 100 و 1000 گان را افزایش دهیم،به عبارت ساده تر شمارش چند رقمی (تا هر تعداد که بخواهیم) را افزایش بدهیم.
 تصویر   سون سگمنت به مانند شکل بالا می باشد، سون سگمنت ها به دو دسته آند و کاتد مشترک تقسیم می شود، داستان،اند و کاتد هم از این قرار می باشد که،برای صرفه جویی اقتصادی و کم شدن سیم کشی، ها یکی از پایه هایی سون سگمنت به صورت مشترک بین همه LED یک نمایشگر سون سگمنت به اشتراک گذشته میشوند.  *وقتی پایه مشترک بین همه LED ، مثبت باشد،به ان سون سگمنت آند مشترک می   *وقتی پایه مشترک بین همه LED ، منفی باشد،به آن سون سگمنت کاتد مشترک می گویند.  تصویر  نمایی داخلی LED درون سون سگمنت، همانطور که می ببینید وقتی پایه مشترک آند (مثبت) باشد،پایه مثبت بین همه LED یکی می باشد  و وقتی پایه مشترک کاتد (منفی)باشد،پایه منفی بین همه LED یکی می باشد.  اما نمایش عدد یا کارکتر دلخواه بر روی نمایشگر..  تصویر   که در تصویر می ببینید،هر LED به نام یک حروف انگلیسی معرفی شده است که به ترتیب a b c d e f g و DP نام گذاری شده اند.   وقتی،ما پایه مشترک را اتصال بدهیم،سپس پایه هر LED (که با حروف مشخص شده) را روشن کنیم،LED ان قسمت روشن میشود! , و وقتی چند پایه LED را همزمان روشن کنیم،می توانیم،یک عدد یا کارکتر را نمایش بدهیم ..  تصویر  همانجور که در تصویر انیمیشنی بالا می ببینید،یک سون سگمنت آند(مثبت) مشترک ،اعداد را با مثبت و منفی کرد پایه ها سون سگمنت نمایش میدهد!   کار ما با میکروکنترولر بسیار ساده تر می باشد! کافیست پایه مشترک را وصل کنیم،سپس 8 پایه سون سگمنت را به 8 پایه میکروکنترولر بدهیم .! که انشالله در پست بعدی به ان می پردازیم.  ادامه دارد...  . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

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

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

پست توسط sinaset » پنج شنبه 19 مرداد 1396, 9:51 am

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

آزمایش و راه اندازی صحیح سون سگمنت


در ادامه مبحث قبلی قصد داریم،یک سون سگمنت ساده، تکی ، مدل کاتد مشترک(GND) را به نحو صحیح راه اندازی کنیم

مراحل سخت افزاری!


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

 تصویر   تصویر (سون سگمنت سمت چپ یا کاتد مشترک) پایه ها را نمام گذاری صحیح کنید! (مثلا LED که در شکل بالا A می باشد، اگر پایه ان را پیدا کردید،در کنارش با ماژیک بنویسید A . برای باقی پایه ها چنین کنید)  
  نحویه وصل کردن به میکروکنترولر   اتصال نیاز به 8 عدد مقاومت 100 اهم (یا کمتر) دارید (*ولتاژ LED حدود 3.2 می باشد و ولتاژ پایه های میکرو 5 ولت می باشد،پس بهتر است،مقاومت استفاده کنید)   ها را به مانند تصویر زیر،به کمک مقاومت به میکرو اتصال دهید!  تصویر  به ترتیب:  PORTB.0=پایه A سون سگمنت  PORTB.1=پایه B سون سگمنت  PORTB.2=پایه C سون سگمنت  PORTB.3=پایه D سون سگمنت  PORTB.4=پایه E سون سگمنت  PORTB.5=پایه F سون سگمنت  PORTB.6=پایه G سون سگمنت  PORTB.7=پایه DOT سون سگمنت   دیگر همه چیز اماده   کدها   این برنامه ساده،هر 500 میلی ثانیه،به ترتیب پایه های a تا dot روشن میشوند،اینطور می توانید متوجه بشوید،که مدار را بدرستی اتصال داده   : 

کد: انتخاب همه

/*******************************************************
Project : learn-5
Date    : 1396.5.19
Author  :  sinaset
centralclubs.com

--> تست و ازمايش روشن شدن صحيح سون سگمنت ها<--

ATMEGA8:ميکروکنترولر مورد استفاده
1MHZ:فرکانس کاري ميکروکنترولر
*******************************************************/

#include <mega8.h>     //کتابخانه ميکروکنترولر
#include <delay.h>     //کتابخانه تاخير

unsigned char i=0;      //تعريف يک متغير 8 بيتي

void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي




DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند
PORTB=0x00;   //قرار مي دهيمGNDهمه پورت در وضعيت صفر يا همان


//**********************//
//**********************//

PORTB=0x01;
/*
مقدار اوليه به پورت بي
PORTB=0b00000001 
پورت بي يک دستور کلي مي باشد،که کل 8 پايه را کنترولر مي کند،به کمک کد بالا،به غير از پايه اول همه پايه هاپورت بي 1 شدن

*/ 
//**********************//
//**********************//         
while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه
//*****************//
    {  //while آغاز چرخه   

     delay_ms(500);  //زمان تاخير   
     PORTB<<=1;    // پورت يک  خانه شيفت پيدا کند
     i++;   
     if(i>8)i=0,PORTB=0x01;
    }  //while انتهايي چرخه   
   //**********************//
   //**********************//   
    /*
     در حلقه بالا با هر بار شيفت داده،پورت 1 درجه به پايه بعدي شيفت يا حرکت مي کند
     در ابتدا چرخه
     PORTB=0b00000001 
     بعد از يک درجه شيفت
     PORTB=0b00000010 
     بعد از بار دوم شيفت پيدا کردن
     PORTB=0b00000100
     در بار سوم
     PORTB=0b00001000
     در بار چهارم
     PORTB=0b00010000   
     در بار پنجم   
     PORTB=0b00100000   
     در بار ششم
     PORTB=0b01000000   
     در بار هفتم
     PORTB=0b10000000   
     بعد از اتمام بار هفتم شرط گذشته شده
     i
     بيش از 8 ميشود و شرط اجرا ميشود و از دوباره پورت  بي مقدار
     PORTB=0x01;
     را به خود مي گيرد
     اگر اين کار انجام نشود،همه پورت بي مقدار 0 را به خود مي گيرد و ديگر ال اي دي روشن نميشود
   
    */
   //**********************//
    //**********************//
   
}  //پرانتز انتها کدهايي تابع اصلي


دانلود پرتئوس و برنامه از [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

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

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

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

پست توسط sinaset » جمعه 31 شهریور 1396, 8:24 am

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


نمایش اعداد 0 تا 9 به کمک سون سگمنت

 تصویر 
حال اگر مطلب گذشته را خوانده باشید،دیگر می توانید به راحتی اعداد 0 تا 9 رو به روی سون سگمنت نمایش دهید! برای اینکه عدد مورد نظر به روی سون سگمنت نمایش داده شود،کافیست LED های مربوط به ان اعداد را(که هر کدام به یک پین از پورت بی وصل می باشند) روشن کنید،تا عدد مورد نظر به روی نمایشگر سون سگمنتی،نمایش داده شود.

کدهایی برنامه،برای نمایش اعداد:

کد: انتخاب همه

/*******************************************************
Project : learn-6
Date    : 1396.6.31
Author  :  sinaset
centralclubs.com

-->نمايش اعداد 0 تا 9 به کمک سون سگمنت<--

ATMEGA8:ميکروکنترولر مورد استفاده
1MHZ:فرکانس کاري ميکروکنترولر
*******************************************************/

#include <mega8.h>     //کتابخانه ميکروکنترولر
#include <delay.h>     //کتابخانه تاخير

void main(void)      //تابع اصلي که هميشه بايد تعريف شود را تعريف مي کنيم
{ //پرانتز آغاز کدهايي تابع اصلي



DDRB=0xFF;    // همه پايه هاي پورت بي به صورت خروجي تعريف شده اند
PORTB=0x00;   //قرار مي دهيمGNDهمه پورت در وضعيت صفر يا همان


//**********************//
//**********************//

PORTB=0x01;
/*
مقدار اوليه به پورت بي
PORTB=0b00000001 
پورت بي يک دستور کلي مي باشد،که کل 8 پايه را کنترولر مي کند،به کمک کد بالا،به غير از پايه اول همه پايه هاپورت بي 1 شدن

*/ 
//**********************//
//**********************//         
while (1) //!و بعد شرط حلقه،که در اينجا 1 گذاشته شده و حلقه تا بي نهايت مي چرخد،whileتعريف چرخه
//*****************//
    {  //while آغاز چرخه   

      
     PORTB=0b00111111;    // براي عدد صفر
     // A,B,C,D,E,F روشن شود تا عدد صفر نمايش داده شود   
      delay_ms(500);  //زمان تاخير 
    
     PORTB=0b00000110; //براي عدد 1 
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b01011011; //براي عدد 2 
    
     delay_ms(500);  //زمان تاخير      
    
     PORTB=0b01001111; //براي عدد 3   
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b01100110; //براي عدد 4   
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b01101101; //براي عدد 5   
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b01111101; //براي عدد 6   
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b00000111; //براي عدد 7   
    
     delay_ms(500);  //زمان تاخير   
         
     PORTB=0b01111111; //براي عدد 8   
    
     delay_ms(500);  //زمان تاخير   
    
     PORTB=0b01101111; //براي عدد 9   
    
     delay_ms(500);  //زمان تاخير   
    
    
    }  //while انتهايي چرخه   
   //**********************//
   //**********************//   
     /*
      براي نمايش اعداد به روي سون سگمنت
      کافيست،ال اي دي مخصوص به هر اعداد را روشن کنيم،تا شکل
      يک عدد به روي سون سگمنت نمايش داده شود
      به عنوان مثال عدد هشت
      براي نمايش شکل عدد هشت،بايد 7 ال اي دي موجود به روي سون سگمنت
      که به پايه هايي پي بي  0 تا 6 وصل هستن را يک کنيم
      تا در نتيجه عدد هشت بر روي سون سگمنت نمايش داده شود
     */
   //**********************//
    //**********************//
    /*
   :نکته
   0b00000000
   يک روش مقداري دهي به پورت يا يک  متغيير مي باشد
   در اين روش به هر بيت (که در اينجا 1 بايت است) مقداري داده ميشود   
   اين بيت ها از سمت راست شروع ميشوند
   به عنوان مثال
   0b00000011
   اگر به پورت بي داده شود،يعني
   Portb.0=1;
   Portb.1=1;
   Portb.2=0;
   Portb.3=0;
   Portb.4=0;
   Portb.5=0;
   Portb.6=0;
   Portb.7=0;
    */
   
}  //پرانتز انتها کدهايي تابع اصلي


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

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]سورس و شبیه ساز.

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

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