اطلاعیه

Collapse
No announcement yet.

آموزش AVR-GCC

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

    آموزش AVR-GCC

    با سلام
    دوستان من دیروز یک سورس اسمبلی برای یک کاری برخورد کردم که مجبور شدم برم سراغ AVRSTUDIO دیدم که واقعا چه محیط جذاب و کاربر پسندی داره آدم یاد VISUALSTUDIO میندازه از قبل میدونستم که میشه با AVRGCC به زبون C برنامه نوشت گفتم ما که IAR بهمون خیلی مزه کرده بزار ببینیم این چطوره ، وقتی که باهاش رفتم یک برنامه نوشتم از اول تا آخرش با چیزای هیجان انگیز مواجه میشدم ، هر حرکت من رو حدس میزد مثلا میخواستم پرانتز باز کنم دیدم پرانتز بسته رو هم خودش اضافه کرد یا مثلا می خواستم فایل سرایند رو اضافه کنم دیدم یک لیست برام باز کرد گفت عزیزم کدومش رو میخوای ! یا مثلا هر حلقه ای که میخواستم بنویسم تا کلمه کلیدی اش رو می نویسم سریع بهم میگه اینو میخوای اینتر کن و... که البته همه اینها با توجه به کلمات کلیدی که برای نرم افزار تعریف شدند عمل میکردند و میشه اون را به صورت دلخواه تغییر داد و البته خیلی چیزهای دیگه که هنوز من بی خبرم ! خلاصه اینکه ایجوری شد که تصمیم گرفتم این تایپیک رو بزنم تا بابی بشه برای آموزش این نرم افزار
    من که خودم هیچی بلد نیستم اما قصد دارم با کمک شما دوستان این مورد رو هم مثل IAR به یک جاهای برسونم ، حالا هر کی پایه است بسم الله و گرنه که هر کی سی خودش این تایپیکم سی اعماق ECA !

    __________________________________________________ __________________________
    منابع :
    فارسی زبان :
    1. آموزش winavr و avrlib
    انگلیسی زبان :
    1. gcc.gnu.org/onlinedocs
    2. ATMEL.COM
    3. avrfreaks.net
    4. winavr.scienceprog.com
    5. en.wikipedia.org
    6. WinAVR-user-manual.html
    7. quantumtorque.com
    __________________________________________________ _________________________________
    فهرست مطالب:

    AVRStudio5

    استفاده از تابع sprintf برای تبدیل مقادیر اعشاری(flaot) به رشته


    دسترسی به حافظه فلش

    استفاده از حافظه فلش برای ذخیره سازی و نمایش رشته

    نوشتن برنامه ترکیبی از c و اسمبلی

    مختصری در رابطه با انواع داده

    دسترسی به حافظه ( EEPROM (Electrically Erasable Programmable Read-Only Memory

    مروری بر چند ماکرو پر کاربرد از کتابخانه avr/io.h

    نحوه نوشتن روتین وقفه ( ISR (interrupt service routine

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

    نحوه نوشتن Inline Assembly (بخش اول)

    نحوه نوشتن Inline Assembly (بخش دوم)

    کار با WinAVR

    نحوه کار با ( MFILE( generator

    . نوشتن برنامه ترکیبی از c و اسمبلی(در WINAVR)

    نوشتن کتابخانه

    مختصری در مورد Structure

    مختصری در رابطه با type-casting


    940
    WinAVR
    0%
    412
    AVRStudio4
    0%
    352
    ATMELStudio6/AVRStudio5
    0%
    176

    #2
    پاسخ : آموزش avrstudio5(AVRGCC)

    خوب پس با اجازه اساتید

    1. ایجاد پروژه جدید :

    وقتی که avr studio رو اجرا میکنید صفحه start page باز میشه :


    برای ایجاد پروژه جدید در قسمت چپ صفحه روی New Project کلیک کنید یا منوی file --> New Project ، یا ctrl+shift+N


    در پنجره بعدی محل ذخیره سازی و اسم پرژتون رو انتحاب کنید :


    در پنجره بعدی میکروکنرتلری که میخواهید باهاش کار کنید رو انتخاب کنید :


    خوب به این ترتیب شما یک پروژه جدید ایجاد کردید ، حالا اولین موقعیت که نمایش داده میشه درواقع محیط work space هست که اسناد پروژه توی این محیط نوشته میشن
    خوی همونطور که می دونید یک پرژه به زبان c دارای یک فایل سورس هست که برنامه یا به عبارتی تابع اصلی در داخل اون نوشته میشه ، توی avrstudio تمام اسناد پروژه اعم از فایل اصلی برنامه و کتابخونه ها وفایل های سرایندی که در برنامه ازشون استفاده کردیم و همچنین خروجی های کامپایلر به صورت یک ساختار درختی در سمت راست به صورت auto hide در یک پنجره به نام solution explorer قرار قرار گرفتن بر خلاف codvision و IAR که این ساختار درختی پروژه در سمت چپ نرم افزار بود

    خوب همونطور که اشاره کردم برای اینکه برنامه مون رو بنویسیم باید فایل C. رو باز کنیم و برنامه مون رو توش بنویسیم ، برای این کاراشاره گر موس رو میبریم روی solution explorer ، در انتهای چارت درختی فایل c قرار گرفته روی اون کلیک کنید تا فایل اصلی برنامه باز بشه :



    2. visual assistx

    یکی از مهمترین ویژگی های avrsudio5 برخورداری از visual assistx هست که واقعا من رو که شگفت زده کرده
    خوب این مورد به صورت پیشفرض فعال هست اما اگر خواستید که تنظیماتش رو به دلخواه خودتون تغییر بدید یا اصلا غیر فعالش کنید برید به منوی VASSISTX و روی گزینه یکی مونده به آخری کلیک کنید تا اگر فعال هست غیر فعال و اگر غیر فعال هست فعال بشه


    خوب همونطور که میبینید بعد از غیر فعال کردن محیط برنامه نویسی اون حالت گرافیکیش رو از دست میده و دیگر قابلیت دس زدن رو نداره ، قابلیت حدس زدن (جزو اصطلاحات خودمه توی فرهنگ لغت مجتبی دنبالش بگردید :nice خوب نرم افزار با این قابلیت که در واقع یک سری کلمات کلیدی هست که در نرم افزار تعیین شده که قابلیت تغییر رو هم دارند به ما موقع نوشتن برنامه کمک میکنه به این ترتیب که اگر VASSISTX فعال باشه مثلا وقتی می خواهید یک فایل سرایند رو بنویسید با نوشتن in# یک مینی پنجره (ف .م) ظاهر میشه که گزینه دومش <> برای اینکلود کردن فایل های سرایندی خود نرم افزار هست که یا توی همون دایرکتوری مستقیم هستندیا توی دایرکتوریای دیگه مثل util یا avr و گزینه اول "" برای فایل های هدری هستند که خودمون نوشیتم یا از یه جای دیگه پدا کردیم مثل lcd.h خوب حالا فرض کنیم میخواییم فایل رجیستری io رو اینکلود کنیم مینویسیم in# بعد از مینی پنجره گزینه دوم رو انتخاب میکنیم (با کلید های جهتی کیبورد با موس نه) حالا همونطور که میبینید لیست فایل های سرایندی موجود در نرم افزار باز میشه ، از اونجا که فایل رجیستری io داخل دایرکتوری avr قرار میگیره برید روی پوشه avr (یا بنویسید a) بعد برید روی io.h و بعد اینتر کنید؛ خوب شاید بگید چه کاریه خودمون مینویسیم دیگه ، اولا اینکه این یکی از قابلیتهای نرمافزار هست و دوما همیشه نمیشه (دیکته دقیق ) اسم تمام فایل های سرایندی رو حفظ کرد (البته برای من مبتدی این جوریه )
    به همین ترتیب فایل های سرایندی دیگر روهم به برنامه تون الحاق میکنید
    حالا اگر میخوایید که اون کلمه کلیدی رو تغییر بدید وقتی که می نویسید in# کنار مینی پنجره یک راهنما هم باز میشه توی این راهنما یک گزینه edit هست روی اون کلیک کنید تا پنجره زیر باز بشه :


    حالل توی قسمت shortcut میتونید کلمه کلیدی رو تغییر بدید و یا توی قسمت title عنوان این شورت کات رو که توی مینی پنجره دیده میشه رو عوض کنید مثلا بنویسید header بعد بیایید بنویسید in# میبینید که این بار گزینه دوم شده header ، و همینطور میتونید خورجی شورت کات رو تغییر بدید

    حالا فرض کنید میخواییم یک حلقه for بنویسیم ، بنویسید forr همونطور که میبینید دوباره یک پینی پنجره باز شده که گزینه اولش برای ایجاد یک حلقه با گام های افازیشی و دومی هم برای ایجاد حلقه با گام های کاهشی هست ، خوب گزینه اول رو انتخاب کنبد یک پنجره باز میشه که توی تبی که یک کاغذ زرد رنگ روش هست فرم خروجی حلقه رو نشون میده (نمیشه تغییرش داد هر کاری کردم نشد) خوب اگه دقت کنید index متغیری از نوع int خواهد بود که به صورت افزایشی با گام های یک واخدی افزایش پیدا میکنه تا اینکه به مقدار حداکثرش یعنی length برسه ، حالا بریم توی تب اول توی فیلد اول اسم متغیر رو بنویسید و توی فیلد دوم هم مقدار حداکثر حلقه (توجه کنید که متغیر از نوع int هست پس مقدار حداکثر اون برابر هست با 32767 )




    پایان قسمت اول

    دیدگاه


      #3
      پاسخ : آموزش ( avrstudio5 ( AVRGCC

      با سلام و خسته نباشید.
      لطفا یه کمی هم در مورد gcc و ورژن آن و چجوری روی avrstudio اجرا کردین و... در این مورد بگین.
      با تشکر
      یادش بخیر یه وقتایی هر روز میومدم اینجا !

      دیدگاه


        #4
        پاسخ : آموزش ( avrstudio5 ( AVRGCC

        من این نرم افزار رو حدود یک ماه پیش روی سیستمم نصب کردم اما تا اونجا که یادمه رفتم سایت اتمل دانلودش کردم بعد هم نصبش کردم تا اونجا که یادمه نکته خاصی هم نداشت !
        این هم لینک صفحه اتمل : http://www.atmel.com/dyn/products/to...?tool_id=17212

        دیدگاه


          #5
          پاسخ : آموزش ( avrstudio5 ( AVRGCC

          مرسی از این پست
          منم دوست دارم یاد بگیرم اساتید کمک کنن
          اگه امکانش هست به صورت document کنید :rolleyes:
          "لحظه پیروزی از آن جهت برایم شیرین است که ملت کشورم را در آرامش و شادی ببینم"
          نادر شاه

          دیدگاه


            #6
            پاسخ : آموزش ( avrstudio5 ( AVRGCC

            در ادامه بحث VASSIST ، یکی از قابلیت های دیگه این بخش کپی پردن همزمان چند چیز و پیست کردن بدلخواه هرکدوم اونهاست به این ترتیب که هر بار از یک چیزی کپی میگیرید در حافظه اش ذخیره میشه و بعد از ده مورد کپی ، اولین کپی از حافظه اش پاک وکپی آخر به حافظهاش اضافه میشه یعنی فقط ده کپی آخر رو در خودش نگه می دارهکه البته بعد بستن و خاموش کردن سیستم و دوباره روشن کردن سیستم و اجرای دوباره نرم افزار همچنان 10 مورد آخری که کپی از اون ها گرفته شده رو در حافظه اش نگه میداره ، برای استفاده از این نوع پیست میتونید از منوی VASSIST گزینه PAST... و یا کلید میانبر CTRL+SHIFT+V استفاده کنید



            همچنین می تونید با استفاده از گزینه SYMBOL در همین منو از تمام سیمبل های تعریف شده توسط دستور پیش پردازنده define# رو مشاهده کنید و با دبل کلیک بر روی اون ها به محل تعریفشون برید و همینطور میتونید با انتخاب گزینه VA VIEW از زیر منوی TOOLS در همین منوی VASSIST تمام سیمبلهایی که در برنامه تعریف شده اند رو در پنجره AUTO HIDE که در سمت راست اضافه میشه مشاهده کنید

            اگر میخواهید که با دیگر شورت کات ها و مواردی که می توان به صورت آماده به برنامه از طریق VA اضافه نمود آشنا بشید گزینه INSERT VA snippet... انتخاب کنید در زیر منویی که باز می شود در قسمت اول میتونید از موارد آماده مثل توضیحات برنامه کا حاوی اسم نویسنده برنامه میشه رو استفاده و در ابتدای برنامه تون اضافه کنید و در قسمت پایین مجموعه شورت کات هایی که تعریف شدند رو ببینید و از همونجا به برنامتون اضافه کنید و یا اینکه میتونید با سلکت یک موردی که زیاد توی رنامه تون ازش استفاده میکنید و بعد ازطریق گزینه creat va snippet یک شورت کات بهش اختصاص بدین و همچنین میتونید از طریق گزینه آخر تمام شورت کات های موجود رو ببینید و تغییرشون بدید

            برای اینکه بتونید vassist رو به صورت دلخواه خودتون مدیریت کنید می تونید گزینه آخر منوی vassist رو انتخاب کنید و وارد تنظیمات قسمت مورد نظرتون بشید و اون رو مطابق نظر خودتون تغییر بدید ، به قابلیت هاش اضافه کنید یا برخی موارد رو حذف کنید خوب اینکار رو میتونید به دوصورت انجام بدید : 1 . به صورت سریع از طریق قسمت Quick config که برای هر موردی دو یا سه حالت پیشنهاد داده 2 . از طریق زیر شاخه advanced به صورت منوآل تنظیماتتون رو با قدرت مانور بیشتری انجام بدید .

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

            همچنین میتونید برای ایجاد یک تابع روتین مورد نظرتون رو انتخاب کنید و سپس به گزینه refactor برید و بعد با انتخاب extract method... در پنجره باز شده اسم تابع تون رو انتخاب کنید و سپس با ok کردن تابع تعریف خواهد شد

            و البته کلی مورد دیگه که دیگه بهشون نمی پردازم چون خودمم زیاد بلد نیستم لطفا اگه کسی چیز دیگه ای میدونه و یا اگه اشتباهی در گفته هایه من میبینه حتما متذکر بشه !

            3. تنظیمات پروژه :
            برای انجام تنظیمات پروژه از منوی project گزینه آخر یعنی projet name propertis... رو انتخاب کنید و یا از کلید میانبر alt+f7 استفاده کنید ، به این ترتیب یک سند دیگه به اسناد پروژتون اضافه میشه که اسمش همون اسم پروژتون خواهد بود

            در تمام برگه های این قسمت در بالای برگه باید تعیین کنید که تنظیماتی که انجام میدید مربوط به کدوم یک از خروجی های نرم افزار هست که خوب فعلا چون من چیز زیادی ازشون نفهمیدم همون گزینه پیشفرض رو انتخاب میکنیم
            توجه : بعد از انجام هر نوع تغییری در تنظیمات یک علامت ستاره در برگه ظاهر میشه که نشون دهنده ذخیره نشدن تنظیمات جدید هست

            برگه build :
            توی این برگه میتونید در قسمت اگر از قبل یک فایل میک برای پروژتون آماده کرید به بروژه الحاق کنید تا از تنظیمات اون برای انجام عمل کامپایل و لینک استفاده بشه ، برای اینکار خوب همونطور که مشخصه چک باکس use exter... رو تیگ میزنید و بعد از طریق بروزر فابل میکتون رو به برنامه اضافه میکنید
            توجه کنید از اونجا که تمام تنظیمات پروژه اعم از نوع خروجی های برنامه و پیکره بندی فضای داده و حافظه فلش و تنظیمات لینک در فایل میک قید میشن بعد از انتخاب فایل میک برگه های memory و toolchain غیر فعال خواهند شد

            در قسمت پایین این برگه میتونید فایل های خروجی کامپایلر رو مشخص کنید
            اگر برنامه ای که مینویسید میخواهید از اون خروجی های برای اجرا برنامه تون رو میکرو استفاده کنید در قسمت Build Artifact ، کرکره رو روی حالت executable قرار بدین و اکه می خواهید که برنامه ای که می نویسید برای تولید یک کتابخونه استفاده کنید کرکره روی حالت static library قرار بدین
            اگر مورد اول رو انتخاب کنبد میتونید خروجی های برنامه رو انتخاب کنید تا کامپایلر براتون تولید کنید ، فایل hex که داخل حافظه فلش ریخته میشه فایل eep هم که در صورت مقداردهی اولیه به فضای eeprom در داخل فضای eeprom ریخته میشه فایل map یک نمای کلی از بخش بندی کله فضای داده و لینک های استفاده شده در بر نامه رو نشون میده فایل lss هم خروجی اسمبلی برنامه هست

            برگه Build events :
            من هیچ چیزی ازش نفهمیدم

            برگه toolchain :
            توی این برگه میتونید تنظیمات مربوط به عملیات کامپایل و لینک رو انجام بدین
            خوب از اونجا که ن با بیشتر تنظیمات این بخش آشنا نیستم فقط به چند تاچیزی که برای انجام پروژه مون بهش نیاز داریم اشاره میکنم
            توی قسمت کامپایلر برید به شاخه symbol :تو اینجا میتونید مثل کدویژن یکسری سیمبل رو تعریف کنید و در برنامه از اونها استفاده کنسد و یا میتونید سیمبل هایی که تعریف شده اند رو تعریف نشده کنید

            مثلا فرض کنیم که از تابع delay توی برنام تون استفاده کردید خوب همونطور که میدونید محاسباتروتین این تابع باید با توجه به فرکانس کاری میکرو تنظیم بشه و گرنه در عمل زمان بندیش اشتباه از آب درمیاد خوب از اونجا که توی فایل هدر delay سیمبل F_CPU به عنوان مقدار فرکانس کاری میکرو تعریف شده بیاین توی قسمت defined symbols بعد روی گزینه add کلیک کنید و در پنجره باز شده بنویسید : F_CPU 8000000


            حالا برای اینکه نوع بهینه سازی رو انتخاب کنیم برید به شاخه optimization :
            توی این قسمت از طریق کرکره موجود میتونید حالت بهینه سازی کد رو انتخاب کنید
            توجه کنید که هر شکل از بهینه سازی بایک فلگ مشخص میشه که اینجا فقط چهار نوع اون در دسترس هستند :
            1. O 0- : در این حالت هیچگونه عمل بهینه سازی در رابطه با کد تولیدی توسط کامپایلر انجام نمیشود
            2. O1- : در این حالت کامپایلر کد را به لحاظ سرعت اجرا در سطح یک بهینه تولید میکنه
            3. O2- : در این حالت کامپایلر کد را به لحاظ سرعت اجرا در سطح دو بهینه تولید میکنه
            4. O3- : در این حالت کامپایلر کد را به لحاظ سرعت اجرا در سطح سه بهینه تولید میکنه
            5. Os- : در این حالت کامپایلر کد را به لحاظ حجم کد تولیدی در بهینه ترین سطح تولید میکنه
            هر کدوم از این موارد شامل بهینه سازی در موارد مختلف میشن که با انتخاب یکی از اون ها بهینه سازی در اون موارد خاص انجام میشه اگر شکل بهینه سازی که مد نظرتون هست و اون ترکیب مورد نظرتون توی هیچکدوم از موارد فوق نیست میتونید فلگ های مربوط به بهینه سازی موردنظر تون رو در فیلد other optimization flag وارد کنید ، همچنین میتونید از طریق چک باکس موجود 4 تا فلگ دیگه رو با توجه به نیازتون هم فعال و یا غیر فعال کنید
            برای اطلاعات بیشتر در مورد فلگ های بهینه سازی در avrgcc به لینک زیر که منوآل خود gcc هست مراجعه کنید : http://gcc.gnu.org/onlinedocs/gcc-4....timize-Options

            برگه MEMORY :
            توی این برگه می تونید فضای حافظه فلش و فضای داده و EEPROM رو بخش بندی کنید و همچنین مقدار اولیه SP یا همون استک پوینتر رو تعیین کنید که البته به صورت پیشفرض در با لاترین قسمت SRAM واقع شده
            تا اونجا که من فهمیدم AVRGCC مثل codvision و iar دیگه sram رو بخش بندی نمیکنه و باید خودمون این کارو براش انجام بدیم ، خوب از اونجا که من زیاد به این مورد تسلط ندارم فعلا ازش میگذریم و در اولین فرصت که اطلاعاتم در این مورد تکمیل شد ، همین جا قرارش میدم

            برگه device :
            توی این برگه میتونید میکرویی رو که باهش کار میکنید رو دوباره انتخاب کنید
            و البته اطلاعاتی در مورد اون میکرو هم بدست بیارید

            برگه debugging :
            توی این برگه میتونید نوع دیباگری که میخواهید باهش کار کنید رو انتخاب کنید مثلا اگر رابط jatge استفاده میکنید در صورت تشخیص اون توسط نرم افزار یتونید اون رو انتخاب کنید و یا اینکه برای انجام دیباگ نرم افزاری گزینه avr simulator رو انتخاب کنید


            برگه Advanced :
            من فقط در همین حد فهمیدم :
            توی این برگه میتونید toolchain مورد نظرخودتون رو به جای toolchain پیشفرض نرم افزار انتخاب کنید

            خوب فکر میکنم این یعنی که مثلا ما یک toolchain برای خودمون تعریف میکنیم و اون رو یک جایی ذخیره میکنیم و توی پروژه های دیگه بجای انجام تنظیمات toolchain به صورت مشابه همون toolchain قبلی رو import میکنیم !


            پایان قسمت دوم

            دیدگاه


              #7
              پاسخ : آموزش ( avrstudio5 ( AVRGCC

              قبل از هرچیزی یک معذرت خواهی به شما دوستان بدهکارم ، (گفته بودم خودمم چیزی بلد نیستم تازه دارم یاد میگیرم :read: ) اشتباهی که رخ داده در رابطه با تعیین SYMBOL هست به این ترتیب که برای مقدار دهی باید بین متغیر و مقدار عددی یک مساوی هم قرار دهید ! مثلا F_CPU=8000000 امیدوارم کمتر از این اشتباها بکنم :icon_razz:

              4. کامپایل و ساخت فایل HEX

              بعد از این که برنامه تون رو نوشتید برای اونکه اون رو (فقط) کامپایل کنید بردید به منوی BUILD و گزینه اخر یعنی COMPILE رو انتخاب کنید یا اینکه از کلید میانبر CTRL+F7 استفاده کنید
              و برای انجام عمل کامپایل و ساخت فایل های HEX , EEP , MAP, LSS می تونید برید به منوی BUILD و گزینه اول رو انتخاب کنید و یا اینکه از کلید ممیانبر F7 استفاده کنید
              برای انجام عمل کامپایل و بیلد بعد ایجاد تغییرات در برنامه می تونید برید به منوی BUILD و گزینه دوم رو انتخاب کنید یا اینکه از کلید میانبر CTRL+ALT+F7 استفاده کنید
              برای پاک کردن فایل های ساخته شده بعد از عمل BUILD می تونید برید به منوی BUILD و گزینه سوم رو انتخاب کنبد .

              خوب حالا برای استفاده از اونچه که تاحلا گفته شد یک برنامه ساده چشمک زن رو با هم مینویسیم :
              1. یک پروژه جدید ایجاد کنید و میکرو تون رو هم انتخاب کنید، من از میکرو MEGA16 استفاده میکنم .
              2. فایل C. رو اگز باز نشده باز کنید .
              3. کلید میانبر ALT+F7 رو بزنید تا سند تنظیمات پروژه باز بشه حالا تنظیمات زیر رو انجام بدید :
              3-1- برید به برگه TOOLCHAIN و سپس از چارت درختی مربوط به تنظیمات کامپایلر برید به قسمت SYMBOL و در قسمت تعریف یک ثابت بر روی ADD کلیک کنید و مقدار فرکانس کلاک سی پی یو را به صورت زیر برابر با 8مگ کنید : F_CPU=8000000
              3-2 - برید به قسمت OPTIMIZATION و نوع بهینه سازی رو بر روی حالت Os- قرار بدید .
              3-3- برای ثبت تنظیمات انجام شده اخیر بروی
              4.حالا برگرید به فایل c و برنامه زیر رو بنویسید :

              #include <avr/io.h>
              #include <util/delay.h>

              int main(void)
              {
              DDRA=(1<<DDA0);

              while(1)
              {
              //TODO:: Please write your application code

              PORTA^=(1<<PA0);
              _delay_ms(1000);

              }
              }


              5. حالا با استفاده از کلید میانبر F7 عمل BUILD رو اجرا کنید ، به این ترتیب بعد از این کار فایل های HEX ، EEP , LSS , MAP تولید خواهند شد ، حالا میتونید برید توی محیط پرتئوس و برنامه رو روی میکرویی که انتخاب کرده بودید تست کنید

              توجه : دوستان حتما خطوط اضافه رو بنویسید کپی پیست نکنید تا لذت برنامه نویسی رو توی محیط avrstudio5 رو بچشید

              خوب اگر قبلا با winavr کار کرده باشید در مورد فهم برنامه هیچ مشکلی نخواهید داشت اما برای اون دسته از دوستانی که با winavr نکردن یا خوب به هر دلیلی متوجه نشدن عارضم که :
              1. در خط اول برنامه فایل سرایند io.h که در دایرکتوری avr در داخل پوشه include برنامه قرار گرفته به برنامه الحاق میشه که توی این فایل برای تمام رجیستر های io میکرویی که انتخاب کردید یک سیمبل تعریف شده بعلاوه سیمبل هایی که برای وقفه تعریف شده و چند مورد دیگه ؛ برای توضیحات بیشتر حتما فایلش رو بعد از انجام عمل build یک مطالعه اجمالی بکنید
              2. در خط دوم فایل هدر delay.h که در دایرکتوری util در پوشه include قرار گرفته به برنامه الحاق میشه ، بعد از انجام عمل بیلد برید و فایلش رو از قسمت solution explorer و از پوشه Dependencies با دبل کلیک کردن باز کنید ، خوب همونطور که میبیند در اوایل فایل نوشته شده :

              #ifndef F_CPU
              /* prevent compiler error by supplying a default */
              # warning "F_CPU not defined for <util/delay.h>"
              #define F_CPU 4000000UL
              #endif

              خوب این یعنی اینکه اگر F_CPU تعریف نشده بود کاپایلر در قالب یک WARNING با مضمون اینکه مقدار فرکانس کلاک تعیین نشده به کاربر هشدار بده و خودش مقدار F_CPU رو برابر با 4 مگ کنه ، خوب این خیلی مسئله مهمی چون اگه به ادامه فایل توجه کنید می بینید که مقدار کلاک در محاسبه تابع delay تاثیر گذاره و اگر شما مثلا بیایید فیوزبیت های میکروتون رو روی فرکانس 8 مگ تنظیم کنید اما در برنامه مقدار فرکانس کلاک چیز دیگه ای باشه اگر از تابعی مثل delay که مقدار کلاک به عنوان یک ثابت عددی در محاسبه مدت اجرای تاخیر در اون اثر گذار خواهد بود استفاده کرده باشید برنامه شما در عمل با زمان بندی اشتباهی اجرا خوهد شد
              3. داخل تابع main در خط اول بیت 0 از رجیستر ddra یک خواهد شد تا پایه PA0 به صورت خروجی تعریف گردد
              4.در داخل حلقه WHILE در خط اول بیت 0 از رجیستر PORTA معکوس خواهد شد .
              5. در خط دوم از این حلقه تابع _delay_ms() فراخونی میشه با مقدار آرگومان برابر با 1000 به منظور ایجاد تاخیر یک ثانیه ای
              توجه 1 : همونطور که توی فایل delay.h ملاحظه میکنید تابع _delay_us() هم مثل codvision , iar موجود هست
              توجه 2 : می توانید به جای تعریف F_CPU از طریق SYMBOL در TOOLCHAIN اون رو در برنامه تعریف کنید و البته باید توجه داشته باشید که تعریف این مقدار قبل از اینکلود کردن فایل هدر delay باشد به عنوان مثال :

              #include <avr/io.h>
              #define F_CPU 8000000UL
              #include <util/delay.h>


              ااا اینو یادم رفته بود : پایان قسمت سوم

              دیدگاه


                #8
                پاسخ : آموزش ( avrstudio5 ( AVRGCC

                5. استفاده از تابع sprintf برای تبدیل مقادیر اعشاری(flaot) به رشته :
                خوب اگر قبلا با avr studio کار کردید حتما میدونید که باید چیکار کنید ، اما من رو که خیلی سرکار گزاشت تا اینکه با کمک یکی از دوستان در انجمن ایران میکرو به نام " صادق محمدی "تونستم مشکلم رو حل کنم گفتم بد نیست که این مسئله رو توی این تایپیک هم عنوان کنم .
                به جزئیات اشاره نمیکنم چون خودمم زیاد نمیدونم ؛
                فرض کنید می خواهیم عدد 13.2634124 رو که در یک متغیر از نوع float هست رو با استفاده از دستور sprintf تبدیل به رشته و در ادامه بر روی lcd نمایش بدیم ، برای این کار برنامه زیر رو در نظر بگیرید :

                #include <avr/io.h>
                #include <util/delay.h>
                #include <avr/pgmspace.h>
                #include <stdio.h>
                #include "lcd.h"

                void main(void)
                {
                char buffer[7];
                float num=13.2634124;


                lcd_init(LCD_DISP_ON);
                lcd_clrscr();
                lcd_home();
                sprintf(buffer,"%6.3f", num);
                lcd_puts(buffer);
                _delay_ms(4000);

                while(1);
                }

                خوب برنامه که کاملا مشخصه چی به چیه ، اما یکسری تنظیمات رو باید مثل codvision و iar انجام بدیم تا بتونیم متغیر های از نوع float رو تبدیل به رشته کنیم ، کار هایی که باید انجام بدیم به ترتیب زیر هست :

                1. alt+f7 رو بزنید تا وارد سند تنظیمات برنامه بشید .
                2. برید به برگه toolchain
                3. حالا از شاخه avr/gnu c linker برید به زیر شاخه libraries بعد با کلیک بر روی add در قسمت بالایی و به ترتیب موارد libprintf_flt.a و libm.a اضافه کنید ،به ترتیبی که در شکل زیر مشاهده می کنید :


                4. حالا از شاخه avr/gnu c linker برید به زیر شاخه miscellaneous و سپس در فیلد other linker flags فلگ های : -Wl,-u,vfprintf -lprintf_flt به ترتیبی که در شکل زیر مشاهده میکنید وارد کنید :


                5. تغییرات انجام شده رو سیو کنید و برنامه رو دوباره کامپایل کنید .


                پایان قسمت چهارم

                دیدگاه


                  #9
                  پاسخ : آموزش ( avrstudio5 ( AVRGCC

                  6. دسترسی به حافظه فلش :
                  برای ذخیره مقادیر ثابت داخل حافظه فلش در avrgcc نیازمند به اینکلود کردن فایل هدر pgmspace.h هستیم پس از اینکلود کردن این فایل سرایندی میتونیم با استفاده از ماکرو های PROGMEM و const متغیر مورد نظرمون رو در حافظه فلش ذخیره میکنیم و سپس با استفاده از ماکروهای زیر مقادیر رو از داخل حافضه فلش با توجه به آدرس متغیر میخونیم :

                  pgm_read_byte(address_short)
                  pgm_read_word(address_short)
                  pgm_read_dword(address_short)
                  pgm_read_float(address_short)


                  نحوه تعریف ثابت در حافظه فلش :

                  const "اسم ثابت" "نوع ثابت" PROGMEM


                  نحوه خوندن ثابت از داخل حافظه فلش :

                  "اسم ثابت"&amp "ماکروی مناسب با نوع ثابت &quot



                  به عنوان مثال :
                  تعریف ثوابت در حافظه فلش :

                  const unsigned char nom[] PROGMEM=
                  {
                  /* 0 1 2 3 4 5 6 7 8 9 */
                  0X3F , 0X06 , 0X5B , 0X4F , 0X66 , 0X6D , 0X7D , 0X07 , 0X7F , 0X6F ,
                  /* 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */
                  0XBF , 0X86 , 0XDB , 0XCF , 0XE6 , 0XED , 0XFD , 0X87 , 0XFF , 0XEF
                  };


                  خوندن ثوابت از حافظه فلش :

                  DATA = pgm_read_byte(&nom[0]);


                  روش جایگزین برای تعریف ثابت در حافظه فلش:

                  const prog_ "اسم متغیر" "نوع متغیر "


                  به تعاریف زیر که در فایل pgmspace.h آمده دقت کنید :

                  typedef void PROGMEM prog_void;
                  typedef char PROGMEM prog_char;
                  typedef unsigned char PROGMEM prog_uchar;
                  typedef int8_t PROGMEM prog_int8_t;
                  typedef uint8_t PROGMEM prog_uint8_t;
                  typedef int16_t PROGMEM prog_int16_t;
                  typedef uint16_t PROGMEM prog_uint16_t;
                  typedef int32_t PROGMEM prog_int32_t;
                  typedef uint32_t PROGMEM prog_uint32_t;
                  typedef int64_t PROGMEM prog_int64_t;


                  مثال :


                  const prog_char nom[]
                  {
                  /* 0 1 2 3 4 5 6 7 8 9 */
                  0X3F , 0X06 , 0X5B , 0X4F , 0X66 , 0X6D , 0X7D , 0X07 , 0X7F , 0X6F ,
                  /* 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */
                  0XBF , 0X86 , 0XDB , 0XCF , 0XE6 , 0XED , 0XFD , 0X87 , 0XFF , 0XEF
                  };


                  پایان قسمت پنجم

                  دیدگاه


                    #10
                    پاسخ : آموزش ( avrstudio5 ( AVRGCC

                    7. استفاده از حافظه فلش برای ذخیره سازی و نمایش رشته :

                    خوب اگه برای نمایش یک رشته مثلا روی lcd بیاییم به صورت زیر عمل کنیم :

                    lcd_puts("INTER YOU'R KEYS"


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

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


                    #include <avr/io.h>
                    #include <avr/pgmspace.h>
                    #include "lcd.h"

                    const char FlashString[] PROGMEM = "INTER YOU'R KEYS";
                    void SendSTR_P(const char *FlashSTR);

                    void main(void)
                    {
                    .
                    .
                    .
                    lcd_clrscr(); //Clear display and set cursor to home position
                    lcd_gotoxy(0, 0); //Set cursor to specified position
                    SendSTR_P(FlashString); //Display character at current cursor position
                    .
                    .
                    .
                    while(1);
                    }

                    void SendSTR_P(const char *FlashSTR)
                    {
                    uint8_t j;
                    for (j= 0; pgm_read_byte(&FlashSTR[j]); j++)
                    {
                    lcd_putc(pgm_read_byte(&FlashSTR[j]));
                    }
                    }


                    اما یک روش دیگه ای هم وجود داره که دیگه نیازی به اون تعریف اولیه نداره در واقع این کار با استفاده از ماکروی PSTR صورت میگره برای مثال :


                    #include <avr/io.h>
                    #include <avr/pgmspace.h>
                    #include "lcd.h"

                    void main(void)
                    {
                    .
                    .
                    .
                    lcd_clrscr(); //Clear display and set cursor to home position
                    lcd_gotoxy(0, 0); //Set cursor to specified position
                    SendSTR_P(PSTR("INTER YOU'R KEYS&quot); //Display character at current cursor position
                    .
                    .
                    .
                    while(1);
                    }

                    void SendSTR_P(const char *FlashSTR)
                    {
                    uint8_t j;
                    for (j= 0; pgm_read_byte(&FlashSTR[j]); j++)
                    {
                    lcd_putc(pgm_read_byte(&FlashSTR[j]));
                    }
                    }


                    توجه : میتونید بجای تابع SendSTR_P برای نمایش روی lcd از تابع lcd_puts_p هم استفاده کنید .


                    پایان قسمت ششم

                    دیدگاه


                      #11
                      پاسخ : آموزش ( avrstudio5 ( AVRGCC

                      سلام خدمت همگی
                      من تازه کار با avr stdio 5 رو شروع کردم. وقتی باهاش کار می کنم هر چند لحظه یک بار این پیغام روی صفحه نمایش داده میشه

                      مشکل از کجا هست؟

                      دیدگاه


                        #12
                        پاسخ : آموزش ( avrstudio5 ( AVRGCC

                        میشه برای این نرم افزار plug in ساخت؟؟؟
                        مثلا یه چیزی تو مایه codewizard بسازیم که دیگه وقتمون صرف خوندن دیتاشیت و یادآوری تلف نشه؟

                        دیدگاه


                          #13
                          پاسخ : آموزش ( avrstudio5 ( AVRGCC

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

                          دیدگاه


                            #14
                            پاسخ : آموزش ( avrstudio5 ( AVRGCC

                            دوستان در مورد سازماندهی حافظه توی avr studio سوال دارم کسی میدونه به چه صورت هست چیزی که خودم متوجه شدم اینکه اینکار رو انجام نمیده و باید خودمون اینکار رو بکنیم ولی خوب بهر حال اگر هم این طور باشه بالاخره مثلا وقتی یک متغیر گلوبال رو تعریف میکنیم از یک جای خاصی شروع میکنه میخوام ببینم چجوری میشه این رو تعریف کرد که کجا ذهیره بشه اگر اینطور هست
                            و
                            سوال بعدی هم اینکه شکل دسترسی به رجیستر های عمومی به چه صورت هست مثلا وقتی یک تابع تعریف میکنیم مقادیر ورودی و خروجی تابع توی کدوم رجیستر ها قرار میگیرند

                            ممنون از توجهتون

                            دیدگاه


                              #15
                              پاسخ : آموزش ( avrstudio5 ( AVRGCC

                              میبخشین. من داشتم رد میشدم دستم به این تاپیک خورد!
                              من این برنامه رو یکبار نصب کردم اما خیلی ازش خوشم نیومد با همون AvrStudio بیشتر حال میکنم. اما چند نکته رو به خاطرم اومد گفتم شاید بدردتون بخوره:

                              رگه Build events :
                              من هیچ چیزی ازش نفهمیدم
                              در Visual Studio برای مدیریت خاص پروژه های حجیم این امکان هست که قبل و بعد از کامپایل کردن پروژه ها فرمان خاصی انجام بشه. مثلا بخوایین قبل از اجرا یک backup از فایلها بگیرین. یا توسط یک برنامه کمکی تغییری در فایل هگز نهایی انجام بدین. این event ها میتونه به شما این امکان رو بده که برنامه ای رو در حین یا بعد کامپایل اجرا کنین.

                              توی این حالت کامپایلر میاد قبل از اجرای تابع اصلی رشته مورد نظر رو داخل حافظه sram لود میکنه و...
                              جناب آقا مجتبی! این فرمی که شما فرمودین فقط یکجا درست هست و اونهم موقعی هست که متغیری درون برنامه تعریف بشه و مساوی با یک مقدار ثابت قرار بگیره. وگرنه تمامی اطلاعات ثابت درون برنامه؛ داخل فلش قرار دارند. اما چیزی که شما رو به این اشتباه انداخته اینه که آدرس قرار گرفتن اطلاعات به تابع شما عوضی پاس میشه. در فلش که بر مبنای word کار میکنه آدرس ها بصورت پیش فرض بر اساس word هستن. و این با آدرس اطلاعات رم که بایتی هستن فرق میکنه. با استفاده از ماکروی PSTR این ذخیره سازی نیست که عوض میشه؛ بلکه دید کامپایلر نسبت به این اشاره گر (یا رشته) عوض میشه. بخاطر همین هم هست که وقتی به ماکروی مربوطه رجوع میکنیم میبینیم که فقط نوع اشاره گر رو به *const char عوض کرده تا کامپایلر برای تشخیص نوع اشاره گر اشتباه نکنه.

                              دوستان در مورد سازماندهی حافظه توی avr studio سوال دارم...
                              بنظر میاد تمامی عملیات این نسخه از AvrStudio بر اساس GCC پایه گذاری شده و بر این اساس با WinAVR مشترک هست. بنا براین نحوه پاس کردن پارامتر ها و کلا نحوه کامپایل برنامه عینا مطابق اطلاعات ارائه شده برای WinAVR هست.
                              ضمنا قاعدتا جز در مواقع خاصی؛ احتیاجی نیست که بدونین یک متغیر عمومی کجا ذخیره میشه. ولی من باب اطلاعتون اطلاعات از آدرس پایین حافظه شروع میشه و به سمت آخر حافظه رشد میکنه. اما استک از آخر به اول رشد میکنه.

                              دیدگاه

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