اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کوچ کردن از کدویژن به AtmelStudio

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

    قبل از هرچیز جا داره یک توضیحاتی در رابطه با Atmel Studio بدم:

    Atmel Studio یک محیط برنامه نویسی( IDE ) مختص برنامه نویسی برای میکروکنترلرهاست. کامپایلری که در این محیط استفاده میشه کامپایلر معروف gcc میباشد.
    این محیط برنامه نویسی همون طور که از اسمش پیداست کار شرکت اتمل است که خود تولید کننده یه میکروکنترلرهای مختلفی میباشد.
    این محیط بسیار شبیه Visual Studio شرکت ماکروسافت است ( برخی افراد ویژوال استادیو را جزء عجایب دنیا میدانند(واقعا هم همینطوره) )

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

    برای دانلود Atmel Studio میتوانید مستقیم از سایت اتمل اقدام به این کار کنید:

    لینک دانلود جدیدترین نسخه Atmel Studio :
    http://www.atmel.com/tools/ATMELSTUDIO.aspx

    یا میتونید گوگل کنید:
    دانلود atmel studio

    الان جدیدترین نسخه 6.1 است.

    --------------------------------------------------------------------

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

    آموزش زبان سی توسط استاد بازرگان
    آموزش AVR توسط استاد کی نژاد

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    خوب با نام و یاد خدا و به امید موفقیت هرچه بیشتر شروع میکنم:

    پس از نصب اتمل استادیو و اجرای آن شما با یک پنجره مربوط به لودینگ که داخل آن یک کفش دوزک است مواجه میشود(کلا نماد اتمل استادیو کفشک دوزک است)
    بعد از اتمام لودینگ با بازشدن برنامه به یک صفحه Start Page برمیخورید.( ورود شما را به محیط برنامه نویسی اتمل استادیو تبریک میگم )
    برای ایجاد پروژه ی جدید ، راه های زیادی است : یکی از این راه ها کلیک بر روی New Project در سمت چپ صفحه ی Start Page می باشد.
    بعد از کلیک ، پنجره ای باز میشود که زبان و کامپایلر مورد نظر از شما پرسیده میشود همچنین در پایین پنجره میتوانید برای پروژه و سولوشن تان اسم مورد نظر را تعیین کنید و در قسمت Location میتوانید محل و دایرکتوری ایجاد پروژه را مشخص کنید.
    در بالا GCC C Executable Project را انتخاب کنید و با انجام تنظیمات روی دکمه OK کلیک کنید. (باید اضافه کنم در این محیط و با استفاده از کامپایلر gcc شما قادرید با زبان ++C و شیء گرایی اون برنامه نویسی کنید)
    پنجره ی بعدی پنجره ی Device Selection میباشد. که بوسیله ی آن میکروی مورد نظرتون را انتخاب میکنید .(همچنین میتوانید دیتاشیتش را دانلود کنید و...)

    بعد از ok کردن سولوشن و پروژه تون ساخته میشه و یک فایل c. همنام پروژه ایجاد میشه و محتویاتش براتون نشون داده میشه. به صورت زیر:

    کد:
    #include <avr/io.h>
    
    int main(void)
    {
      while(1)
      {
        //TODO:: Please write your application code 
      }
    }
    میبینید که تابع main در اینجا قرار دارد.
    همچنین یک فایل با نام io.h به صوت پیشفرض اینکلود میشود.
    داخل این فایل به نسبت اینکه درقسمت Device Selection چه میکرویی انتخاب شده یک فایل بسیار مهم اینکلود میشود.
    مثلا درصورتی که Mega32 را انتخاب کرده باشید ، فایل avr/iom32.h اینکلود میشود.
    این فایل شما را قادر میسازد تا ماژول های i/o میکروتون کار کنید.
    برای اطلاع بیشتر به لینک زیر برید. یک توضیحاتی در رابطه با قسمتهای مختلف میکرو به دوستمون دادم:
    http://www.eca.ir/forum2/index.php?topic=82558.msg503769#msg503769

    برای اینکه با جزئیات و مفصل دراینباره اطلاع پیدا کنید ، سری آموزشی AVR جناب کی نژاد را دنبال کنید.

    در ادامه پست را به چند قسمت تقسیم میکنم:


    -----------کار با محیط دیباگینگ Atmel Studio -------------------------------------------------------------------------------------

    این بخش می تونه قدرت Atmel Studio را نشان دهد که از پدربزرگ خود یعنی Visual Studio به ارث برده است.(البته به صورت شبیه سازی شده)

    دیباگ کردن عملی است که بوسیله آن برنامه را به صورت دقیق اشکال زدایی میکنیم . برای اشکالزدایی برنامه بایستی دستورات دونه به دونه اجرا شود و نتیجه هر دستور بعد از اجرای آن به برنامه نویس نشان داده شود. در حالت معمولی کدها به سرعت و پشت سرهم توسط پردازنده اجرا میشوند و امکان دیباگینگ کد وجود ندارد ، برای فراهم کردن اینکار بایستی برنامه در بین اجرا به اصطلاح break شود.
    خوب فکر میکنم بهتر باشه از تعریف و تئوری فاصله بگیریم و هرچه سریع تر بریم سراغ کد زدن.
    توصیه جدی: قبل از ادامه خواندن ، حتما Atmel Studio را باید اجرا کنید . و یک پروژه ایجاد کنید و وارد محیط برنامه برنامه نویسی شوید. در غیر این صورت تا فراهم شدن این بستر از خواندن ادامه پست خودداری کنید

    برای مثال ابتدا ما یک برنامه معمولی به شکل زیر مینوسیم:
    کد:
    int a,b;
    void xchange()
    {
    	int temp;
    	temp=a;
    	a=b;
    	b=temp;
    }
    int main(void)
    {
    	char x= 5;
    	DDRA=x;
    	a=3;
    	b=0;	
    	xchange();
    	while(1);
    }
    نکته خیلی مهم: برای دیباگینگ بهتر باید از بهینه سازی کامپایلر جلوگیری کرد ، که برای اینکار 2 راه وجود دارد:
    1- رفتن به شاخه زیر و غیرفعال سازی Optimization :
    project --> main properties --> Toolchain --> AVR/GNU C Compiler --> Optimization
    و در اینجا میتونید سطح بهینه سازی ( Optimization Level ) را تعیین کنید که در اینجا بایستی روی حالت None قرار دهید.

    2- استفاده از کلمه کلیدی volatile در هنگام اعلان متغییرهای برنامه.

    (که در اینجا روش اول توصیه میشود)

    برای ورود به محیط دیباگ روش های متفاوتی وجود دارد که در اینجا شما به صورت زیر عمل کنید.

    با زدن کلید f10 یا f11 به محیط دیباگ وارد شوید.صبر کنید تا یک فلش زرد رنگ کنار اول بلوک تابع main ظاهر بشه. (ورودتون را به محیط دیباگ خوش آمد می گم)

    این فلش زرد رنگ نشون میده که دستور بعدی که اجرا میشه چیه. برای اجرای متوالی می توانید از f10 یا f11 استفاده کنید که با هربار زدن اونها دستوری که فلش زرد رنگ کنارشه اجرا میشود(البته تفاوت هایی داره که بعدا عرض میکنم)

    خوب قبل از اینکه بریم سراغ دیباگینگ برنامه مون ، به امکاناتی که این محیط به ما میده می پردازیم:

    این امکانات به صورت window هایی است که در شاخه Debug --> Windows وجود دارند ، فراهم میشود.

    خوب ما عموما به سه window نیاز داریم که در شاخه ی Debug --> Windows میتوان آنها را اضافه کنیم:

    1- I/O View : این پنجره به ما این امکان را میدهد که مقدار فعلی رجیستر های میکرو را مشاهده کنیم.(خیلی گرافیکی و ساده است ، یکم باش بازی کنید ، متوجه میشوید.)

    2- Watch : این پنجره به ما مقادیر متغییرها و آرایه ها و در کل دیتا آبجکت هایی که تعریف کردیم و در بخش فعلی که هستیم به آنها دسترسی داریم را برای ما مشخص میکند. ( برای این کار در قسمت Name بایستی اسم دیتا آبجکت مد نظرتون را تایپ و Enter کنید. برای بدست آوردن آدرس دیتا آبجکت بایستی از & قبل از اسم آن استفاده کنید)

    3- Memory : این پنجره محتویات حافظه را به صورت کامل برای ما نمایش میدهد.( برای اینکار بایستی فضای حافظه مد نظرتون را از لیست انتخاب کنید.)

    خوب حالا که با ابزار کار آشنا شدیم ، میریم سراغ دیباگینگ برنامه مون .

    هنوز فلش زرد رنگ کنار آکولاد اول تابع main است. با زدن دکمه f10 یا f11 فلش روی دستور char x=5; قرار میگیرد. این یعنی اگر یه بار دیگه f10 یا f11 بزنید دستور char x=5; اجرا میشود. خوب قبل از اجرای این دستور بیاید یک نگاه به پنجره watch بندازیم:

    همان طور که گفته شد یکی از امکانات این پنجره نمایش مقدار فعلی متغییرهایی است که به اون ها دسترسی داریم:
    ما در این برنامه 4 متغییر اعلان شده است : a و b که متغییرهای سراسری هستند و x که متغییر محلی یا local تابع main است و temp که متغییر local تابع xchange است.
    اینجا ما هر 4 متغییر را به پنجره watch می دهیم.

    میبینیم که مقدار متغییر های x و a و b صفر گذاشته شده و این متغییر ها شناخته شده اند ولی متغییر temp چون ما در تابع main به آن دسترسی نداریم ناشناخته (Unknown identifier ) است.
    از این به بعد باید با هربار اجرای یک دستور پنجره watch هم نگاه می کنیم.

    دکمه f10 یا f11 را میزنیم ، با ایتکار مقدار متغییر x برابر 5 میشود .

    دوبار دکمه f10 یا f11 را میزنیم . اینبار به پنجره IO View نگاه میکنیم ، اگر روی PORTA کلیک کنید می بینیم که بیت های 0 و 2 رجیستر DDRA ست میشود.

    دوبار دکمه f10 یا f11 را میزنیم . در پنجره Watch مقدار متغییر a را میبینیم که به 3 تغییر پیدا کرده .

    دوبار دکمه f10 یا f11 را میزنیم . در پنجره Watch مقدار متغییر b را میبینیم که به 0 تغییر پیدا کرده . (البته قبلا 0 بوده)

    خوب الان فلش زرد رنگ کنار xchange(); قرار دارد .
    اینجا میتونیم تفاوت عملکرد دکمه های f10 و f11 را ببینیم:

    عملکرد دکمه f10 : با زدن f10 تابع xchange کامل اجرا میشود و فلش زرد رنگ روی حلقه بینهایت میرود. و اگر پنجره watch را ببنیم ، مقادیر متغییر های a و b با هم عوض میشوند.

    عملکرد دکمه f11 : با زدن f11 دیباگر و فلش زرد رنگ وارد تابع xchange می شود ، و فلش روی آکولاد اول تابع xchange قرار می گیرد .
    دوبار f10 یا f11 می کنیم : چون int x یک اعلان بدون مقدار اولیه است دیباگر از روی آن میگذرد .(یه مطلب جالب ایه که چون دیباگینگ atmel studio نوپاست یک سری باگ دارد ، یکیش اینجا قابل مشاهده است : متغییر x یک متغییر محلی تابع main است و در اینجا باید ناشناخته باشد ، ولی اینجا در پنجره watch مقدار x را صفر نشان داده وکه بعد ورود دوباره به مین درست میشه و همون 5 را نشون میده ولی اینجا بهتر بود متغییر x ناشناخته اعلام می شد.
    با زدن متوالی دکمه f10 یا f11 دستورات تابع دونه دونه اجرا میشود و بعد از اجرای آخرین دستور ، دیباگر وارد تابع main می شود.

    فعلا تا همینجا کافیه . امکانات دیگه مثل قرار دادن break point و ... هم وجود دارد که با بازی کردن در محیط دیباگر می توانید تجربی آنها را فرا بگیرید.



    -----------پستهای به نسبت مفیدتر در این تاپیک -------------------------------------------------------------------------------------

    البته کامل خواندن این تاپیک را به همه ی دوستان توصیه میکنم ، در صورتی که میخواهید به پستهای به نسبت مفیدتر دسترسی داشته باشید میتوانید از لینکهای زیر استفاده کنید:

    انجام عملیات بیتی روی یک بایت یا رجیستر خاص : http://www.eca.ir/forum2/index.php?topic=81025.msg493466#msg493466

    آشنایی با عملگر شیفت و مقدار دهی به رجیستر ها به صورت رایج تر: http://www.eca.ir/forum2/index.php?topic=81025.msg493484#msg493484

    نحوه کار با توابع تاخیر( delay ) در اتمل استادیو: http://www.eca.ir/forum2/index.php?topic=81025.msg493662#msg493662

    انواع متغییرها از نظر حوزه دسترسی و LifeTimeم : http://www.eca.ir/forum2/index.php?topic=81025.msg499601#msg499601

    چندی در رابطه با پیشوند volatile در سی: http://www.eca.ir/forum2/index.php?topic=81025.msg499818#msg499818 و http://www.eca.ir/forum2/index.php?topic=81025.msg499866#msg499866

    دیتا آبجکت چیست و معرفی استراکچر: http://www.eca.ir/forum2/index.php?topic=81025.msg504542#msg504542

    مختصری در باب اشاره گرها در سی و عملگر <-- : http://www.eca.ir/forum2/index.php?topic=81025.msg504661#msg504661

    یک تابع کوچک برای ارسال طلاعات از طریق یوزارت: http://www.eca.ir/forum2/index.php?topic=81025.msg505180#msg505180

    انواع حافظه ها و دسترسی به حافظه فلش(قسمت اول): http://www.eca.ir/forum2/index.php?topic=81025.msg505462#msg505462

    انواع حافظه ها و دسترسی به حافظه فلش(قسمت دوم): http://www.eca.ir/forum2/index.php?topic=81025.msg505535#msg505535

    کار با وقفه ها و نوشتن روتین وقفه مورد نظر: http://www.eca.ir/forum2/index.php?topic=81025.msg505608#msg505608

    مثال از استفاده از وقفه در برنامه ( ارسال رشته به صورت سریال) : http://www.eca.ir/forum2/index.php?topic=81025.msg505729#msg505729

    -----------راه انداز ماژول های مختلف بوسیله ی میکرو و Atmel Studio -------------------------------------------------------------------------------


    به لینک زیر مراجعه کنید:

    http://www.eca.ir/forum2/index.php?topic=82130.0
    درصورتی که برای ماژول درخواستی شما راه اندازی نبود ، میتوانید در همان تاپیک تقاضا دهید .


    پیشاپیش از سوالات و همکاریتون در این تاپیک تشکر و قدردانی میکنم.
    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

    #2
    پاسخ : کوچ کردن از کدویژن به AtmelStudio

    در رابطه با لایبرری ها یکم توضیح بدین مثلا کتابخانه هایی که تو ویژن داریم
    ctype-stdlib-math-string-bcd
    سینتکسشون چطوریه
    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

    دیدگاه


      #3
      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      نوشته اصلی توسط صادق ابراهیمی
      در رابطه با لایبرری ها یکم توضیح بدین مثلا کتابخانه هایی که تو ویژن داریم
      ctype-stdlib-math-string-bcd
      سینتکسشون چطوریه
      نظر خوبیه که با خوندن فایل های هدر بدست میاد. ولی خوب چون کلش طولانیه ، یواش یواش به هرکدوم میپردازیم.(البته این هدرها یه جورایی برای سی استاندارد شدند و تقریبا برای همه کامپایلرها کارشون مشخصه)
      راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
      کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
      نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

      دیدگاه


        #4
        پاسخ : کوچ کردن از کدویژن به AtmelStudio

        نوشته اصلی توسط RubeuS
        نظر خوبیه که با خوندن فایل های هدر بدست میاد. ولی خوب چون کلش طولانیه ، یواش یواش به هرکدوم میپردازیم.(البته این هدرها یه جورایی برای سی استاندارد شدند و تقریبا برای همه کامپایلرها کارشون مشخصه)
        مثل ویژن که نیست؟
        مثلا برای delay
        http://www.eca.ir/forum2/index.php?t...5049#msg375049
        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

        دیدگاه


          #5
          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          نوشته اصلی توسط صادق ابراهیمی
          مثل ویژن که نیست؟
          مثلا برای delay
          http://www.eca.ir/forum2/index.php?t...5049#msg375049
          بله منم عرض کردم، همه کارشون مشخصه :
          مثلا همین delay کارش ایجاد تاخیر بوسیله نرم افزار است که با اجرا کردن چندین دستور nop بوجود می آید.
          به عنوان مثال در همه ی کامپایلرها بایستی قبل از استفاده از آن کلاک cpu مشخص شود:
          یجا مثل کدویژن کلاک سی پی یو را باید با تعریف xtal بش بفهمونیم و یه جا مثل gcc باید با تعریف F_CPU بهش بفهمونیم.
          راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
          کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
          نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
          انشالله به زودي تاپيک ها به روز رساني خواهد شد،

          دیدگاه


            #6
            پاسخ : کوچ کردن از کدویژن به AtmelStudio

            نوشته اصلی توسط صادق ابراهیمی
            در رابطه با لایبرری ها یکم توضیح بدین مثلا کتابخانه هایی که تو ویژن داریم
            ctype-stdlib-math-string-bcd
            سینتکسشون چطوریه

            فکر نمیکنم اینکار عملی باشه چون تعداد توابع خیلی زیاده

            شما با این هدر ها تو کدویژن آشنایید؟ اگر آشنایید ، یواش یواش اسم توابع را بگید تا تو gcc معادل سازی کنیم براش( اگر تو کتابخونه هاش موجود بود که از هدرهای تو gcc استفاده میکنیم وگرنه خودمون تابعش رو مینویسیم.)
            اینطوری بهتر نیست؟؟؟ :question: فکر میکنم خیلی بهتر باشه تا اینکه بخوام کل توابع را بگم(چون خیلیه و خیلیاش هم زیاد کاربرد ندارن)
            راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
            انشالله به زودي تاپيک ها به روز رساني خواهد شد،

            دیدگاه


              #7
              پاسخ : کوچ کردن از کدویژن به AtmelStudio

              دوستان درصورتی که تابع(توابع) خاصی مدنظرتون هست اعلام بفرمایید تا در رابطه باش گفتگو کنیم
              راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
              کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
              نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
              انشالله به زودي تاپيک ها به روز رساني خواهد شد،

              دیدگاه


                #8
                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                سلام آقای مرتضوی
                چطور از انواع ال سی دی استفاده کنیم
                یه جورایی کتابخونه داره ؟
                یه سوال دیگه برای همین وقفه ها نمیشه که همه رو حفظ کرد یا به فایل هدرش رجوع کرد روش ساده تری هم هست که بشه آرگومان داخل ISR رو پر کرد(مثلا برای فعال سازی وقفه کامل شدن UDR)
                لطفا این لینک روهم ببینید به کمکتون احتیاج دارم
                ممنون
                چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                دیدگاه


                  #9
                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  نوشته اصلی توسط صادق ابراهیمی
                  سلام آقای مرتضوی
                  چطور از انواع ال سی دی استفاده کنیم
                  یه جورایی کتابخونه داره ؟
                  یه سوال دیگه برای همین وقفه ها نمیشه که همه رو حفظ کرد یا به فایل هدرش رجوع کرد روش ساده تری هم هست که بشه آرگومان داخل ISR رو پر کرد(مثلا برای فعال سازی وقفه کامل شدن UDR)
                  لطفا این لینک روهم ببینید به کمکتون احتیاج دارم
                  http://www.eca.ir/forum2/index.php?topic=81097.new#new
                  ممنون
                  1- برای کتابخونه هایی از این دست ( که یک ماژول خارج از میکرو را میخواهید درایو کنید) میتونید از avrlib.h استفاده کنید. لینک زیر کمک خوبی بتون میکنه:
                  http://www.eca.ir/forum2/index.php?topic=41050.0

                  2- شما تو کدویژن مگه چطور وقفه ها را مینوشتی؟ من که بعد از کلمه کلیدی interrupt تو کروشه از دیفاین ها ی معروف استفاده میکردم. مثلا برای سرریز تایمر2 TIM2_OVF یا برای وقفه دریافت سریال از USART_RXC یا ... استفاده میکردم. یه مدت که کار کنید دیگه نیاز به فکر کردن نداره . اینجا هم فرقی نداره از یک سری دیفاین که فقط اسمش کمی عوض شده استفاده کنید. مثلا برای تعریف روتین وقفه روی فلگ UDRE از USART_UDRE_vect استفاده کنید ، فرقی نداره.

                  3- چشم ،نگاه میکنم
                  راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                  کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                  نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                  http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                  انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                  دیدگاه


                    #10
                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    یکی از دوستان در رابطه با تغییر دادن یک پین سوال کرده بودند، گفتم تو این تاپیکم قرار بدم:
                    (این کار فقط مختص رجسترهای DDRX و PORTX و PINX نیست و برای همه رجیستر ها صادق است)

                    شما میتونید فایل هدر زیر را اینکلود کنی:

                    کد:
                    #include <compat/deprecated.h>
                    توی این هدر میتونید از توابع ( شبه تابع) زیر استفاده کنید:
                    برای صفر کردن یک پین:
                    کد:
                    cbi(port, bit);
                    برای یک کردن یک پین :
                    کد:
                    sbi(port, bit);


                    اگر میخواهید بدونید که cbi و sbi چطور عمل میکنند ، فقط تعاریف زیر را نگاه کنید:
                    کد:
                    #define cbi(port, bit) (port) &= ~(1 << (bit))
                    
                    #define sbi(port, bit) (port) |= (1 << (bit))
                    به عنوان مثال در کدویژن داریم:
                    کد:
                    PORTA.3 = 1;
                    برای اینکار تو اتمل استادیو:
                    کد:
                    sbi(PORTA , 3);
                    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                    دیدگاه


                      #11
                      پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      شاید شما زیاد با مقدار دهی به صورت زیر برخورد کردید و براتون عجیب بوده:
                      کد:
                      PORTB = (1<<PB0) | (1<<PB3) | (1<<PB6);
                      که معادلش میشه :

                      کد:
                      PORTB = 0x49;
                      یعنی پین های 0 و 3 و 6 از پورت B را یک کن و بقیه صفر.

                      حالا دوتا سوال پیش میاد :
                      1- چرا از حالت اول استفاده کنیم و کدمون را اینقدر طولانی بنویسیم؟(از نظر طول دستور به صورت چشمی و تایپی)
                      2- چطور حالت اول معادل حالت دوم میشود؟

                      با دادن جواب به این سوالات من پستم را خاتمه میدم:

                      1- خوب کاملا مشخصه که خوانایی برنامه در حالت اول خیلی بیشتر از حالت دوم است و همچنین اصولی تر و باب تر است . پس حالا که میخوایم تغییر در محیط برنامه نویسی مون بدیم بهتر است تو روش برنامه نویسی خودمون هم تغییراتی بدیم.

                      2- در رابطه با نحوه عملکرد دستور ، شما باید با عملگر شیفت منطقی به چپ و همچنین چند تا دیفاین ساده آشنا باشید:
                      الف) شیفت منطقی به چپ : که با عملگر >> انجام پذیر است ، بوسیله این عملگر ، عملوند سمت چپ را به اندازه ی عملوند سمت راست ، شیفت به چپ میدهیم:
                      به عنوان مثال : فرض میکنیم دو عدد a=20 و b=3 داریم حالا با دستور زیر :
                      a<<b;
                      a را که به باینری 00010100 است را به اندازه b یعنی 3 تا به چپ شیفت میدهد، که میشه: 10100000
                      ( ولی چون مقدار بازگشتی این عملگر را جایی نمیریزیم ، این دستور عملا کاری نمیکند و کامپایلر بتون وارنینگ میده - البته منظور فقط نشان دادن شیفت بود)

                      ب) دیفاین های زیر را درنظر بگیرید:
                      کد:
                      #define PB7   7
                      #define PB6   6
                      #define PB5   5
                      #define PB4   4
                      #define PB3   3
                      #define PB2   2
                      #define PB1   1
                      #define PB0   0
                      خیلی ساده هستند ، یعنی هرجایی ما از PBx استفاده کردیم ، این یعنی همان مقدار عددی x .

                      خوب حالا دستور زیر را تجزیه تحلیل میکنیم:
                      کد:
                      PORTB = (1<<PB0) | (1<<PB3) | (1<<PB6);
                      اول که یه دستور انتساب ( = ) است که یک مقداری را درون رجیستر PORTB میریزد، که هیچی معلومه دیگه.
                      حالا میریم سراغ سمت راست = :
                      اول اینکه باید بگم ، این ایده ی جمع مینترم هاست ( sop ) که تو درس مدار منطقی ، فصلهای اول و دوم وجود دارد . که برای یک تابع از طریق جدول درستی مقادیر مینترم ها را بدست می آوردیم و آنها را باهم OR میکردیم تا تابع منطقی ساخته شود.
                      اینجا هم میبینیم که سه مقدار درون پرانتزی باهم OR شدند( با عملگر | که همون OR منطقی است)
                      باتوجه به 2 - الف که در رابطه با شیفت گفتم و همچنین 2 -ب که همون دیفاین ها بودند:
                      سه مقدار هشت بیتی زیر باهم OR میشوند:
                      مینترم اول : یک را به اندازه ی PB0 ( که همان 0 است) به چپ شیفت بده که جواب میشه : 00000001
                      مینترم دوم : یک را به اندازه ی PB3 ( که همان 3 است) به چپ شیفت بده که جواب میشه : 00001000
                      مینترم سوم : یک را به اندازه ی PB6 ( که همان 6 است) به چپ شیفت بده که جواب میشه : 01000000
                      خوب حالا اگر همه مینترم ها را باهم OR کنیم، خیلی قشنگ به 01001001 یعنی همون 0x49 میرسیم که در عوض خیلی خوانایی برنامه را افزایش دادیم.
                      راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                      کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                      نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                      دیدگاه


                        #12
                        پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        سلام اگر تنها یک بیت رو بخایم صفر یا یک کنیم چی ؟اینطور درسته؟

                        کد:
                        UCSRA|=(1<<MPCM);
                        		UCSRB|=(0<<TXB8);

                        و اگه بخایم یک فلگ رو تغییر حالت بدیم ؟
                        این فلگ رو صفر میکنه؟(پرچمو میاره پایین؟)

                        کد:
                        UCSRA=(1<<RXC);
                        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                        دیدگاه


                          #13
                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                          کد:
                          UCSRA|=(1<<MPCM);
                          		UCSRB|=(0<<TXB8);

                          و اگه بخایم یک فلگ رو تغییر حالت بدیم ؟
                          این فلگ رو صفر میکنه؟(پرچمو میاره پایین؟)

                          کد:
                          UCSRA=(1<<RXC);
                          جواب شما فقط تو این دیفاین های زیر است. فقط روشش رو بفهمید:
                          کد:
                          #define cbi(port, bit) (port) &= ~(1 << (bit))
                          
                          #define sbi(port, bit) (port) |= (1 << (bit))
                          برای اولی یعنی 1 کردن بیت MPCM ، کاملا درست است . ( راستی مشکلتون با MPCM حل شد؟ )
                          برای دومی یعنی صفر کردن TXB8 ، نه اشتباه است. ( پست قبلم رو حتما کانل بخونید. یک اصل بزرگ: صفر را به هر تعداد که شیفت دهیم جواب همون صفر میشود)
                          برای اینکار مثل دیفاین cbi عمل کنید. یعنی :
                          کد:
                          UCSRB & = ~ (1 << TXB8);
                          برای پایین آوردن فلگ ، باید مقدار یک درونش بریزید . که همین کار را هم کردید.(ولی اگر | هم بزارید و مثل قبل عمل کنید بهتره ، برای اینکه توی بیت های دیگه خدای نکرده اختلال ایجاد نکنید.)
                          راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                          کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                          نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                          انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                          دیدگاه


                            #14
                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

                            سلام

                            تفاوت متغیرهایی مثل int ، uint8_t و عباراتی از این دست چیه ؟ لطفا منبعی برای مطالعه این موارد معرفی فرمایید .

                            تشکر .

                            دیدگاه


                              #15
                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              نوشته اصلی توسط aseok
                              سلام

                              تفاوت متغیرهایی مثل int ، uint8_t و عباراتی از این دست چیه ؟ لطفا منبعی برای مطالعه این موارد معرفی فرمایید .

                              تشکر .
                              سلام

                              بزارید همون اول برم سر منبع ، چون خودش کاملا گویاست:
                              فایل هدر stdint.h
                              که اگر ورژن atmelstudio من با شما یکی باشه . میشه آدرس زیر:
                              Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.1.95\AVRToolchain\ avr\include\stdint.h

                              خوب برای توضیح باید بگم : int یک DataType استاندارد سی است و یعنی متغییر از نوع عدد صحیح (البته تعداد بیتش تو کامپایلر های مختلف متفاوت است)
                              با اضافه کردن فایل stdint.h به پروژه تون میتونید از uint8_t استفاده کنید.
                              اگر فایل stdint.h را نگاه کنید ، به دستور زیر میرسید:
                              کد:
                              typedef unsigned char uint8_t;
                              که یعنی آقای کامپایلر هرجایی که uint8_t را دقیقا در جای یک DataType دیدی ، این همون unsigned char است.
                              راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                              کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                              نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                              انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                              دیدگاه

                              لطفا صبر کنید...
                              X