نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
محسن

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

77

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

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

شما وقتی بخواهید کد برای یک برنامه بنویسید میایید و از یک کامپایلر استفاده می کنید. بسته به سخت افزار هرکسی یک نوع کد و کامپایلر رو استفاده می کنه. مثلا یکی میاد و 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 !!!!
تو قسمت بعدی نکات دیگه رو خواهم گفت ..

درباره : 
تعداد مطالب : 4 تا
من دريافته ام كه ايده هاي بزرگ هنگامي به ذهن راه مي يابند كه اراده كنيم چنين ايده هايي را داشته باشيم. چارلي چاپلين
ارسال دیدگاه
28
نظرات این مطلب بسته شده است.
  1. Mohammad

    مهمان

    Mohammad

    تفاوت این دو تا چیه؟؟
    من امتحان کردم فرقی نکرد!

    DDRA |= (1<<DDRA0);
    DDRA = (1<<DDRA0);

    اینا چه فرقی دارن؟؟؟

    http://uplod.ir/ndps37vlzxas/DDRA.mp4.htm

    مشاهده پاسخ ها (5)
    • مهدی دمیرچیلو

      مدیر سایت

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

      کد خط 1 : تو کدنویسی c کاراکتر | یعنی OR بیتی ( & یعنی AND بیتی )
      درباره این دو تو نت مطالب زیاده، اما خلاصه بگم که وقتی میخوای مقدار یه بیت ( بیت DDRA0 ) از یک بایت ( رجیستر DDRA ) رو تغییر بدی ( در این جا : 1 کنی )، باید اینطوری کد بزنی.
      این مطلب هم فک کنم مرتبط باشه : تغییر و یا خوندن یه بیت از یک متغیر

      اما کد خط 2 : در این جا مقدار بیت فوق 1 میشه، اما مقدار بقیه بیت ها 0 میشه.!!!

      • محمد

        مهمان

        محمد

        ممنون از شما! اینم مفید بود –> [این مطلب هم فک کنم مرتبط باشه : تغییر و یا خوندن یه بیت از یک متغیر]
        یه سوال دیگه حالا نمیدونم شاید اینم تو مطالب قبل گذاشته باشید smile
        اگه پورت ها رو مقدار دهی نکنیم مقدارشون ۰ هست یا ۱ ؟

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

          مدیر سایت

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

          طبیعتا باید 0 باشه ولی خب میتونی دیتاشیت رو هم بررسی کنی، مقدار پیشفرض رو ذکر کرده برا هر رجیستر.

          • محمد

            مهمان

            محمد

            Tri-state (Hi-Z)
            این یعنی همون High impedance خودمون؟

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

            مدیر سایت

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

            بله / وضعیت 3 حالته : 0، 1 و High impedance

  2. محمد

    مهمان

    محمد

    سلام
    تو این جا راست و چپ رو برعکس گفتین؟!

    جهت اون دو تا علامت هم جهت شیفت رو مشخص می کنه. اگر <> یعنی شیفت به راست.

    نه؟

    مشاهده پاسخ ها (1)
    • مهدی دمیرچیلو

      مدیر سایت

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

      سلام – اصلاح شد – ممنون.

  3. سعید

    مهمان

    سعید

    سلام
    یه سوال داشتم
    اگه بخوایم به روش شیفت دادن کل بیت های یک ÷ورت مثلا هشت بیت یا 16 بیتی را یک کنیم چطوری میشه نوشت
    یعنی مثالهای ک زدید برای یک یا صفر کردن تک پین بود حالا برا همش یعنی باید تک تک شیفت بدم بعد اور کنم؟؟
    مرسی

  4. ا

    مهمان

    ا

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

  5. bhar

    مهمان

    bhar

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

  6. bhar

    مهمان

    bhar

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

  7. HAMID

    مهمان

    HAMID

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

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

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

  8. امین

    مهمان

    امین

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

  9. sjaber

    مهمان

    sjaber

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

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

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

  10. حامد

    مهمان

    حامد

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

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

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

  11. Milad

    مهمان

    Milad

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

  12. Milad

    مهمان

    Milad

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

  13. Milad

    مهمان

    Milad

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

  14. محمد

    مهمان

    محمد

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

    مشاهده پاسخ ها (1)
    • محسن

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

      محسن

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

  15. محسن

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

    محسن

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

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

    مدیر سایت

    مهدی دمرچیلو

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

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

    مدیر سایت

    مهدی دمرچیلو

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

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

    مدیر سایت

    مهدی دمرچیلو

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