نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
Avatar

آموزش صحیح و خوانا نوشتن کد میکروکنترلرها-1

آموزش صحیح و خوانا نوشتن کد میکروکنترلرها-1

آموزش صحیح و خوانا نوشتن کد میکروکنترلرها-1
شاید تا حالا براتون پیش اومده باشه که بخواهید کدهای دیگرون رو ببینید و تحلیلشون کنید. مثلا خود من واسم جالب بود ببینم دیگران چطور کد می نویسن. دقت کنید منظورم [highlight] استفاده از عبارات و حرفه ای نوشتن [/highlight] هستش.
شما وقتی بخواهید کد برای یک برنامه بنویسید میایید و از یک کامپایلر استفاده می کنید. بسته به سخت افزار هرکسی یک نوع کد و کامپایلر رو استفاده می کنه. مثلا یکی میاد و AVR رو انتخاب می کنه. بعد میاد و از بین دو تا زبون برامه نویسی C و بسکام، C رو انتخاب می کنه (نشون میده قصدش ادامه دادن برنامه نویسی تو آینده هستش). بعد میاد و از بین کامپایلرا بکی رو انتخاب می کنه. مثلا کدویژن کار رو برای برنامه نویس راحت می کنه. محیطش ساده است. یکی میاد و میره با Atmel stodio کار می کنه یکی میاد. هر کدوم مزیت های خودشو داره اما نکته ای که مهمه اینه که :

مهم نیست با چه زبونی و چه کامپایلری می نوسی، مهم اینه که خوانا بنویسی تا بعدا خودت و دیگران اذیت نشن.

چون اکثرا از کدویژن استفاده می کنند من چند نمونه رو میگم. البته این نکاتی رو که من میگم می تونید تو کامپایلرای دیگه هم استفاده کنید.

1. مقداردهی به رجیسترا :

فرض کنید میخواهید یک پورت رو انتخاب کنید و چند تا از پایه هاشو خاموش کنید یا اصلا یک رجیستری رو انتخاب کردید و دارید باهاش کار می کنید. بهش مقدار میدید. به چن روش میشه این کارو انجام داد. یا عدد معادل دهدهی نوشته بشه یا باینری و یا هگز. مثلا رجیستر ما 8 بیتی هستش و برای مقدار دادن به پورت A از میکروکنترلر ATmega32. خوب حالا چند روش رو تو شکل زیر می تونید ببینید:

فرض کنید کد رو نوشتید و یکی میاد از شما می پرسه کدوم پایه یک هست (یا مثلا کدوم پایه یک هستش). شما خط اول رو نگاه می کنید !! هیچی ازش فهمیده نمیشه. خط سوم هم خیلی نشون نمیده خودشو. میمونه خط دوم که خوب نشون میده اما یک ذره طولانیه و زیاد هم حرفه ای نیست.
اگر همون بنده خدا کمی اذیت کنه و بگه مثلا پایه 5 رو یک کن، پایه 8 رو 0 کن و …. . اون وقت شما اگر از خط اول و سوم استفاده کرده باشید باید چند دقیقه وقت بزارید و معادلشو پیدا کنید. اگر از دومی استفاده می کنید

کارتون راحته اما گفتم حرفه ای نیست.

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

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

عبارت بالا میگه یک رو به اندازه PORTA7 تا شیفت بده سمت چپ. حالا این PORTA7 چیه ؟ این تیکه داخل همون هدری که اول برنامه استفاده کردید تعریف شده و مقدارش برابر هست با 7. یعنی این دو تا با هم یکی هستن و هر دو 1 رو به اندازه 7 بیت به سمت چپ شیفت میدن.

حالا اگر چند تا از اینارو با هم استفاده کنید و با هم OR کید ( | ) ، میشه همون مقداری که بابا داشتیم یعنی 0x11.
حالا اگر همون بنده خدا بیاد و این خط رو نگاه کنه میفهمه که هر پایه چه مقداری داره. اگر بخواهید مقدار یک پایه رو همون جا صفر یا یک کنید کافیه صفر یا یک رو شیفت بدید به جای پورت خواسته شده.

حالا تو یک جای برنامه می خواهید با این روش یک بیت رو صفر یا یک کنید. همه می دونیم وقتی یک بیت با یک منطقی OR بشه، حاصل یک منطقی هست و وقتی یک بیت (هر چی میخواد باشه) یا صفر منطقی AND بشه، حاصل صفر میشه. (بدون توجه به اینکه چی بوده).
برای یک کردن کافیه اون عددتون را با یکی که به مقدار لازم شیفت دادین OR کنید. مثلا :

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

علامت ~ میاد و بیت رو مکمل می کنه یعنی یک رو صفر و صفر رو یک می کنه. بعدش ما یک عدد 8 بیتی داریم که بیت مورد نظر ما توش صفره و بقیه یک هستن. این عدد بوجود آمده اگر در عدد دلواهی مثلا PORTA ، بیاد و AND بشه اون جایگاه بیت مورد نظر صفر میشه (چون هر چی بوده با صفر AND شده و حالا صفر هست) و بقیه بدون تغییر باقی میمونن.
حالا یکی میاد میگه چه کاریه بیاییم و از دستور پایین استفاده کنیم :

از این کار هم میشه استفاده کرد اما بهتون بگم وقتی برید سراغ کامپایلرای دیگه مثل keil برای ARM یا اگر یک برنامه نویس حرفه ای برنامه تون رو ببینه، به مشکل بر میخورید !!! همین قسمت تو خودش چند تا نته داشت اما همش شد 1 !!!!
تو قسمت بعدی نکات دیگه رو خواهم گفت ..

گروه پرسش و پاسخ الکترونیکی در سروش
تعداد مطالب : 5 تا
Avatar من دريافته ام كه ايده هاي بزرگ هنگامي به ذهن راه مي يابند كه اراده كنيم چنين ايده هايي را داشته باشيم. چارلي چاپلين
ارسال دیدگاه
19

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    ا

    سلام خدا خیرت بده

  2. Avatar

    مهمان

    bhar

    سلام میشه یه پروژه داخل کد ویژن بنویسین که از ۴ تا سون سگمنت استفاده کنه و کیبورد ،یه دکمه رو که روی کیبورد فشار بدیم روی سون سگمنت اول نشون بده دکمه بعدیو که بزنیم عدد اول بره روی سون سگمنت دوم و عدد جدید بره روی سون سگمنت اول بعد از ۴ بار تکرار این عمل از نو شروع کنه

  3. Avatar

    مهمان

    bhar

    سلام میشه یه پروژه داخل کد ویژن بنویسین که از ۴ تا سون سگمنت استفاده کنه و کیبورد ،یه دکمه رو که روی کیبورد فشار بدیم روی سون سگمنت اول نشون بده دکمه بعدیو که بزنیم عدد اول بره روی سون سگمنت دوم و عدد جدید بره روی سون سگمنت اول بعد از ۴ بار تکرار این عمل از نو شروع کنه

  4. Avatar

    مهمان

    HAMID

    سلام من یک ای سی atmega328p دارم ولی نمیتونم تو کد ویژن معرفیش کنم مینویسم <include <mega328p.h# ولی ارور میده rtfm نمیدونم چرا لطفا راهنمایی کنید تا کد درستشو بنویسم laugh

    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

      سلام
      یه پروژه جدید ایجاد کن – از کدویزارد میکرو مد نظرتو انتخاب کن و …

  5. Avatar

    مهمان

    امین

    خدا خیرت بده
    امیدوارم هم خودت هم سایتت همیشه پاینده باشید

  6. Avatar

    مهمان

    sjaber

    سلام
    ایا تم ها ی آماده هم برای کدویژن هست؟؟

    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

      سلام
      من ندیدم – سرچ کنید

  7. Avatar

    مهمان

    حامد

    آقا من میخوام back ground صفحمو تو کد ویزن سیاه کنم چون سفید باشه اذیت میکنه چشامو
    چیکا کنم سفید شه؟

    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

      تغییر رنگ پس زمینه کدویژن ( تغییر تم کدویژن ، یا همونی که گفتی laugh )
      setting > editor > Text > Default Background Color

  8. Avatar

    مهمان

    Milad

    return 7
    البته
    اشتباه تایپ شد yes

  9. Avatar

    مهمان

    Milad

    آهان،فهمیدم
    ;if( ( PINE | ~(1<<۴) )!=۰xff ) return 4
    crazy
    اما حقیقتا،اصن جرات نمیکنم بهش نگا کنم،آدم وحشت میکنه از این جمله sorry
    راه ساده تری ندارین dash

  10. Avatar

    مهمان

    Milad

    سلام،اولا دمتون گرم با این سایتتون good
    دوما مطلب خیلی خوبی بود yes
    و اما حالا اصل کاری: smile
    اگه ما بخوایم این کد رو به این شکلی که شما گفتین استفاده کنیم،باید چی کار کنیم:
    if(PINE.4==0) return 7;
    منظورم اینه که بدون این نقطه و تنها با عملگراهای منطقی مثل or و and چه جوری میشه اینو نوشت؟

  11. Avatar

    مهمان

    محمد

    سلام مهندس،میشه بیشتر توضیح بدی این روش رو برام؟چون دقیقا موافقم با شما که خوانا و کاربردی تر،و البته خط های برنامه کمتر و در نتیجه سرعت اجرا بالاتر می شود.
    من نحوه شیفت دادن و and و or و not کردناشو نمیفهمم
    توضیحات خوب بودن و لی اگر امکانش هست چنتا مثال دیگه بزنی ممنونت میشم
    در کل برای پیشنهادت در این روش تشکر میکنم

    • Avatar

      نویسنده این مطلب

      محسن

      نحوه شیفت دادن و عملیاتی که گفتید معروف هستند به عملیات منطقی. یک سرچ کوچولو بزنید در موردش بیشتر آشنا میشید.
      جدا از سرعت و خوانا تر شدن کد، شما تو کامپایلرای دیگه مثل keil و atmel studio هم دیگه اذیت نمیشی.
      مثال هم خودت بشین کدایی که تا حالا زدی رو به این شکل در بیار.

  12. Avatar

    نویسنده این مطلب

    محسن

    ببین زبون برنامه نویسی C هستش. اما کامپایلر کدویژن ظاهر قشنگی داره و استفاده ازش راحت هستش. شرکت hp از یک سری کدهایی استفاده می کنه تا برنامه نویسا اذیت نشن !!
    مثلا همین که بعد از رجیستر نقطه میزاری و شماره بیت رو می نویسی. اگر با کسی که نرم افزار خونده صحبت کنی و این رو نشونش بدی، از این کار سر در نیماره. جون فقط تو کدویژنه که اینجوریه !! کدویزارد خود hp هم تو ورژنای جدید روشی که من گفتم رو پیشنهاد میکنه.
    تو کامپایلرای دیگه از این روش استفاده نمیشه و از روشی که گفتم استفاده می کنن. توی یک برنامه چشمک زن و کوتاه مشکلی نداره، اما سعی کن که این روشی که گفتم رو پیاده کنی تا تو کامپایلرای دیگه هم به مشکل برنخوری.

  13. مهدی دمرچیلو

    مدیر سایت

    مهدی دمرچیلو

    یه چیز…
    تو آخر مطلب گفتی کد ها به صورت زیر نباشه
    PORTA.4=1;
    DDRB.3=0;
    چون
    “وقتی برید سراغ کامپایلرای دیگه مثل keil برای ARM یا اگر یک برنامه نویس حرفه ای برنامه تون رو ببینه، به مشکل بر میخورید”
    دلیلش رو هم میشه بگی لطفا………

  14. مهدی دمرچیلو

    مدیر سایت

    مهدی دمرچیلو

    با اجازت عکس رو آپلود کردم تو سایت….

  15. مهدی دمرچیلو

    مدیر سایت

    مهدی دمرچیلو

    داش محسن عکس ها و فایل ها رو تو خود سایت آپلود کن….الان این اولین عکس مطلبت نمایش داده نمیشه… blum