آموزش مقدماتی AVR – بخش ششم | نحوه پروگرام ATmega16

پروگرام کردن اولین پروژه

سلامی دیگر به علاقه‌مندان الکترونیک. امیدوارم هرجا که هستید شاد و پیروز باشید. در این قسمت قراره با نحوه پروگرام atmega16 آشنا بشیم؛ اولین برنامه‌ی کاربردی که یک رقص نور ساده هست رو بنویسیم، شبیه‌سازی کنیم و در نهایت بر روی ATmega16 پروگرام کنیم. همراه ما باشید.

نحوه پروگرام ATmega16

اولین قدم برای فراگیری نحوه پروگرام atmega16 ، ایجاد یه پروژه جدیده. برای این کار، پس از باز شدن CodeVision از منوی File روی گزینه new و سپس Project کلیک کنید.

ایجاد پروژه در CodeVision

از شما سؤالی پرسیده می‌شود مبنی بر اینکه آیا تمایل به استفاده از CodeWizard دارید یا خیر؟ گزینه Yes را انتخاب کنید. به عنوان یک توضیح مختصر محیط wizard برای مقداردهی اولیه به امکانات میکروکنترلر مثل تایمرها، رابط‌های سریال، پورت‌ها و موارد مختلف است و اگر گزینه No انتخاب شود، مراحلی که در زیر توضیح می‌دهم ظاهر نخواهد شد و مستقیماً به صفحه کدنویسی می‌روید.

انتخاب دسته mega برای برنامه‌نویسی

پس از انتخاب Yes، صفحه بالا ظاهر می‌شود. دو گزینه انتخاب وجود دارد: سری mega و tiny یا سری xmega. در مورد انواع دسته‌بندی میکروکنترلرهای AVR در قسمت اول صحبت کردیم. بنابراین چون میکرو ما ATmega16 است گزینه‌ی اول را انتخاب کرده و OK را بزنید. صفحه زیر باز می‌شود.

مقداردهی اولیه ATmega16 در CodeWizard

صفحه بالا در واقع صفحه‌‎ی اصلی Wizard است. در پنجرۀ سمت چپ تمام امکانات میکروکنترلر به اضافه‌ی مواردی مثل اتصال LCDهای کاراکتری یا گرافیکی وجود دارد. در آینده تمام رجیسترهای مربوط به این موارد را به شما آموزش خواهیم داد و قادر خواهید بود بدون استفاده از Wizard به هر نحوی که خواستید از این امکانات استفاده کنید. اما برای ایجاد یک پروژۀ ساده از منو سمت راست مدل میکرو را روی ATmega16 و فرکانس آن را روی 1MHz تنظیم کنید. در نهایت روی علامتی که شبیه چرخ دنده است بزنید. یک نام و یک مسیر برای پروژه باید وارد کنید. توجه شود که پنجره باز شده 3 بار تکرار می‌شود.

نوشتن برنامه رقص نور

دومین گام در جهت یادگیری نحوه پروگرام atmega16 ، نوشتن یه برنامۀ کاربردی و تست کردن اونه. برای این کار، پس از باز شدن محیط کدنویسی، کد زیر را وارد کنید.

در این برنامه ابتدا هدرهای mega16.h و delay.h را الحاق کردیم. اولی برای معرفی میکرو و دومی برای وارد کردن توابع تاخیر. در تابع main تمام پایه‌های پورت A به صورت خروجی تعریف شد و سپس مقدار آن را با ریختن 0x00 درون PORTA کاملا خاموش کردیم. در این لحظه تمام LEDها خاموش هستند. اما با رفتن CPU درون حلقه while (که بی‌انتها است) حلقه for اجرا شده که مقدار i مرتباً بین 0 تا 7 تغییر می‌کند. اما در درون for با استفاده از دستور شیفت منطقی به سمت چپ (>>)، عدد ثابت 0x01 به تعداد i بار به چپ شیفت داده می‌شود. با تریس کردن (trace) برنامه پس از هر بار تکرار حلقه for به ترتیب اعداد 0x04 , 0x02 , 0x01 و … روی پورت با تاخیر 300 میلی‌ثانیه ظاهر می‌شوند.

برای خروجی گرفتن از CodeVision، یا کلید ترکیبی Ctrl+F9 را بزنید یا روی گزینۀ زیر کلیک کنید.

build کردن پروژه در codevision

صفحه‌ای باز می‌شود که شامل تمام گزارشات برنامه است. اما مهم‌ترین آنها شامل سه مورد می‌شود؛ تعداد خطاها (Errors)، تعداد هشدارها (Warnings) و مقدار فضای اشغال شده حافظه flash در صورت پروگرام کردن میکروکنترلر است.

گزارش نهایی build کردن پروژه

همانطور که می‌بینید، برنامۀ ما هیچگونه خطا و اخطاری ندارد و فضای مورد نیاز برنامه 226 بایت است. در این وضعیت، در مسیر پروژه در فولدر Debug سپس Exe فایلی با پسوند hex. تولید می‌شود. این همان فایلی است که باید روی میکروکنترلر پروگرام گردد.

شبیه سازی در Proteus

سومین بخشی که در این آموزش (که در مورد نحوه پروگرام atmega16 هستش) به اون می‌پردازیم، بحث شبیه‌سازی در محیط نرم‌افزار proteus هست. ابتدا محیط isis پروتئوس را باز کنید و از قسمت کتابخانه که با علامت P مشخص شده است، mega16 ، Led-Green و res (مقاومت) را به لیست قطعات وارد کنید. سپس مدار زیر را ببندید.

مدار رقص نور در پروتئوس

برای شبیه‌سازی برنامه نوشته شده، روی میکروکنترلر دابل کلیک کنید تا صفحه زیر باز شود.

وارد کردن فایل hex در پروتئوس

ابتدا از گزینه Program File فایل hex که در مرحله قبل تولید شد را وارد کرده و در قسمت CKSEL Fuse که در مورد آنها و عملکردشان در جلسه چهارم آموزش صبحت کردیم، آن را روی حالت اسیلاتور RC داخلی با فرکانس 1 مگاهرتز قرار دهید. کارمان تمام است. ok کرده و از قسمت پایین نرم افزار دکمه پلی (یک مثلث کوچک) را بزنید. مشاهده میکنید که تک تک LED ها مطابق برنامه خاموش و روشن می‌شوند.

پروگرام کردن میکروکنترلر با Progisp

و برای آخرین گام جهت یادگیری اولیه‌ی نحوه پروگرام atmega16 به سراغ پروگرام کردن به وسیله‌ی Progisp خواهیم رفت. در واقعیت برای برنامه‌ریزی میکرو به یک پروگرامر نیاز داریم. پروگرامر ما از نوع USB-ISP است و باید از نرم‌افزار progisp استفاده کنیم. این نرم‌افزار نسخه‌های مختلف دارد که از نظر گرافیکی دارای تفاوت هستند اما اکثر گزینه‌های آن‌ها مشترک است. ما از نسخه 1.6.7 استفاده می‌کنیم که محیط ساده‌تر و یکپارچه‌تری دارد. ابتدا پروگرامر را به سیستم متصل و سپس نرم افزار را باز کنید.

پروگرام کردن با progisp

چندین مورد باید رعایت شود:

  1. در پنل سمت چپ فیوزبیت‌ها را مشاهده می‌کنید. زیر این پنل سه گزینه Default , Read و Write وجود دارد. با زدن Read وضعیت فعلی فیوزبیت‌های میکروکنترلر متصل به پروگرامر، خوانده شده و نشان داده می‌شود. با زدن Default حالت پیشفرض و با زدن Write موارد حال حاضر روی میکروکنترلر پروگرام می‌شود.
  2. چون فرکانس میکرو داخل برنامه روی 1 مگاهرتز تنظیم است، ما هم وضعیت 4 بیت CKSEL را روی اسلاتور RC داخلی تنظیم کردیم.
  3. از گزینه Load Flash فایل hex را باید وارد کرد.
  4. سه گزینه Chip Erase و Program Flash و Verify Flash را تیک بزنید.

پس از انجام موارد بالا با زدن Auto، مراحل مورد 4 به ترتیب اجرا می‌شوند: ابتدا حافظه میکرو پاک شده. سپس برنامه روی حافظه ریخته می‌شود و در نهایت مقایسه‌ای بین برنامه داخل میکرو با فایل hex انجام می‌گردد. مورد آخر برای اطمینان از سالم بودن عمل پروگرام است. اگر همه چیز اوکی باشد، یک پیغام موفقیت آمیز (…Successful) در پنل اعلانات داده خواهد شد.

این بخش از آموزش هم (که بیشتر سعی کردیم مقدماتی برای آموزش نحوه پروگرام atmega16 بیان کنیم)، به اتمام رسید و امیدوارم بدون مشکل مراحل را پیش برده باشید. اگر ایرادی یا اروری وجود داشت، در بخش کامنت‌ها مطرح کنید؛ تیم رزدینو در کمترین زمان پاسخگوی شما عزیزان خواهد بود.

مطلب بعدی مبحث حافظه EEPROM می‌باشد همچنین برای آموزش‌های بیشتر با رزدینو همراه باشید.

محمد نصر

محمد نصر

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

31 پاسخ

  1. سلام و ممنون از توضیحات خوبتان . من یک سوال دارم . من میکرو atmega16 را با کریستال خارجی 8 مگاهرتز پروگرم کردم و از میکرو در مدارم استفاده کردم و مشکلی نداشتم . الان به دلیل دقت بیشتر لازم است که کریستال خارجی را 16 مگاهرتز کنم . این بار برنامه را دوباره نوشتم ولی فرکانس آنرا 16 مگاهرتز تعیین کردم و برای پروگرم کردن ، فیوزبیت ckopt را برنامه ریزی کردم (آنرا صفر کردم) . میکرو پروگرم می شود ولی وقتی از آن در مدارم استفاده می کنم ، میکرو درست کار نمی کند. من از نرم افزار codevision و پروگرمر stk200 استفاده می کنم.

    1. سلام. خسته نباشید.
      1- دو خازن 12pf بر روی پایه های Xtal فراموش نشود. شکل قرارگیری آن را در گوگل می‌توانید پیدا کنید.
      2- سعی کنید یکبار بدون پروگرام کردن فیوزبیت CKOPT فرکانس رو 16 مگ کنید. (CKOPT = 1).

  2. سلام میشه بگید حلقه for چطوری باید نوشته بشه اگه بخایم led ها از آخر به اول روشن بشن؟

  3. سلام حاجی دستم به دامنت من میخوام یک atmega 16a رو پروگرم کنم به روش spi با پروگرمر usbasp ولی همش میکرو رو نمیشناسه. از پایه 6 تا 11 رو وصل کردم نمیدونم دیگه باید چیکار کنم تا بشناستش؟ از جامپر های 1و2و3 هم باید وصل کنم بهش؟؟چطوری؟

    1. سلام. متن دقیق ارور چی هست؟
      اول اینکه تغذیه میکروکنترلر باید وصل باشه.
      دوم اینکه اگه میکروکنترلر بار اول هست که استفاده میشه، سرعت پروگرامر باید بر روی low قرار بگیره.
      سوم اینکه در نهایت اگه باز هم میکرو شناسایی نشد، ممکنه فیوز بیت ها درست تنظیم نشده باشن.

      1. سلام، ممنون بابت آموزش خوبتون
        خواستم بپرسم چرا باید سرعت پروگرامر روی low باشه؟ و این که برای من به طور پیش فرض روی high بود و منم تغییرش ندادم. الآن اتفاقی میفته؟ من یه برنامه چشمک ال ای دی نوشتم و مشکلی تو اجرا نداشت…

        1. سلام. ممنون از انرژی خوبتون
          ببینید بسته به اینکه میکرو در چه فرکانسی شروع به کار کنه، ما وضعیت پروگرام رو تنظیم میکنیم. اگه فیوز بیت های میکرو در حالت پیش‌فرض باشن، فرکانس میکرو ۱ مگاهرتزه و نمیشه از حالت high استفاده کرد.‌ در واقع توی این حالت پروگرامر میکرو رو نمی‌شناسه. واسه این دلیل باید سرعت پروگرامر بر روی low تنظیم بشه تا امکان برقراری ارتباط فراهم گردد.

          1. اهان ممنونم
            بله من چیزی رو تغییر ندادم و فرکانس میکرو همون یک مگاهرتز بود، و سرعت high هم کنارش نوشته بود یک مگاهرتز. با این حال پروگرمر میکرو رو شناخت و مشکلی پیش نیومد. ممکنه دفعه ی بعد که خواستم پروگرم کنم نشناسه؟ یا مشکل جدی دیگه ای به وجود بیاد؟
            مرسی بابت پاسخگوییتون

      2. سلام دمت گرم.آقا من یه atmega32 قدیمی استفاده شده داشتم خواستم یه برنامه ای رو ش پروگرم کنم گیر افتادم میگه
        avr ispmkii could not enter programming mode
        نمیدونم رو فیوز بیت ها را چجور ورو چه مقدار تعیین کنم که پروگرم بشه

    2. سلام استاد درایور پروگرامر نصب هست ولی نرم افزار خطا میده پروگرامر را نمیشناسه

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

  4. سلام مخلصم.مهندس من یه ساعت دیجیتال با سون سگمنت های بزرگ درست کردم. سون سگمنت ها رو خودم درست کردم و داخل اونها از led های نصب سطحی با کد 2835 استفاده کردم. ساعت کار میکنه و روی سون سگمنت ها نمایش داده میشه ولی چون سون سگمنت ها خیلی بزرگ هستند باید اسکن اعداد با سرعت بیشتری انجام بشه تا لرزش اعداد مشخص نباشه من برای اینکار سعی کردن فرکانس اعمال شده به timer 0 رو به شکل زیر افزایش بدم
    TCCR0=(0<<CS02) | (1<<CS01) | (0<<CS00);
    در صورتی که کد خودش به صورت زیر بود
    TCCR0=(1<<CS02) | (0<<CS01) | (0<<CS00);
    کل کد هم به شکل زیر هست
    /********************************
    Code hidden
    /********************************
    سوالی که داشتم میخواستم بدونم اینکار درسته؟
    و چطوری میشه این فایل رو به hex تبديل کرد چون چند بار اومدم انجام بدم کدویژن 31 خطا گرفت.
    با تشکر

    1. سلام خدمت شما.
      دوست عزیز اصولا ساعت‌هایی که موجود هست با فرکانس 120 هرتز رفرش میشه تا هیچگونه لرزشی نداشته باشه.
      اینکه چرا کد بالا کار نمیکنه باید بررسی بشه و اصطلاحا دیباگ بشه.
      سعی میکنم بعد از اینکه یک سری از مطالب AVR که هنوز کامل نشدن، آموزش ساخت ساعت رو هم قرار بدم.

  5. برنامه میکرو و پروگرامر را تشخیص نمیده اگه میشه راهنمایی کنید که چه کار کنم؟

    1. ارور چیه؟ میکرو تشخیص داده نمیشه یا اینکه نرم افزار پروگرامر رو نمی‌شناسه؟

      1. مشکل حل شد درگاه usb نصب نبود

        واقعاً ممنون برای آموزش های خوبتون

  6. سلام من قبلا بصورت تفریحی کار میکردم به دلایلی مدتها سراغ میکرو و برنامه نویسی نرفتم اکنون بعد هشت سال مجددا شروع کردم ولی فقط کلیات یادم مونده و تازه فهمیدم که چقدر اشتباه کردم و چه کار مهیجی را از دست دادم.

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

  7. سلام مهندس ممنون از مطالب خوبتان من امروز با این مشکل روبرو شدم موقع کمپایلر کردن ارور flash verify error یک شماره که قبلا نمیداد و درست انجام میشد از پروگرامر usbasp استفاده میکنم اگر مکنه راهنمایی کنید

    1. سلام وقت بخیر.
      ۱) اتصال پایه ها درست بر قرار نیست.
      ۲) میکرو داخل مدار داره پروگرام میشه و بقیه اجزا مدار تأثیرگذار هستن.
      ۳) تغذیه میکرو یا برقرار نیست و یا خیلی نویز داره.

  8. سلام

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

    1. با عرض پوزش. مطالب فقط روی سایت موجود هست و امکان تولید pdf نیست.

  9. سلام برای برنامه نویسی و خواندن کامپیوتر ماشین باید از چه کامپایلر و زبانی استفاده کرد؟

  10. سلام من می‌خوام با اتمگا ۸ یه ساعت با ۷سگمنت درست کنم که کریستال ساعت بهش وصل کنم برنامشو نوشتم با پروتوس هم چک کردم اوکی هست ولی وقتی میخوام پروگرام کنم cksel رو ۱۰۰۱ میزارم میکرو لاک میشه
    کلا راهنمایی میکنین چیکار کنم؟
    ممنون

    1. شما نباید لاک بیت رو تغییر بدید در اینصورت فیوز لاک بیت به صورت داخلی اتصال باز شده و میکرو قابلیت پروگرامش را از دست میده .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  مزایای عضویت در رزدینو :

✔️ دسترسی به فایل های دانلودی

✔️ دریافت پشتیبانی برای محصولات

✔️ مشاهده تمام مطالب کاملا رایگان

✔️ دسترسی آسان به آپدیت محصولات

✔️ بهره مندی از تخفیف های ویژه کاربران