NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3760 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید

نمایش نتیجه های نظرسنجی ها: آیا زبان ++C برای میکرو کنترلرهای AVR مناسب است؟

رأی دهندگان
10. شما نمی توانید در این نظرسنجی رای دهید.
  • بله

    7 70.00%
  • خیر

    3 30.00%
نمایش نتایج: از 1 به 15 از 15

موضوع: زبان ++C با Atmel Studio

  1. #1
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض زبان ++C با Atmel Studio

    سلام.
    اکثر برنامه هایی که برای میکرو کنترلرها نوشته میشن معمولا به زبان سی هستند. اما زبان CPP قالبیتهای زیادی داره که اگه بشه ازش در برنامه نویسی میکروکنترلرها استفاده کرد خیلی کار با اون راحت تر و جذاب تر خواهد بود.
    میخواهیم یک کتابخونه کامل شامل کلاسهای همه Peripheralهای AVR رو جمع آوری کنیم.
    اگه تمایل دارید که باهم این کار رو شروع کنیم، یا اگه نظری دارید که مثلا این کار بیهوده است یا زبان CPP مناسب نیست اینجا اعلام کنید.
    متشکرم.
    ویرایش توسط mansoory : 06-01-2014 در ساعت 15:10

  2. تشکرها از این نوشته :


  3. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  4. #2
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    یک سایتی هست که نویسنده اون کلاسهای پریفرالهای UART و SPI رو آماده کرده. البته برای تایمر هم نوشته ولی کامل نیست.
    http://www.jaxcoder.com/default.aspx

    مقدماتش رو اینجا بخونید:
    http://www.jaxcoder.com/PostPage.aspx?id=1024643519
    منتظر نظرات شما هستم!

  5. تشکرها از این نوشته :


  6. #3
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    کسی نمیخواد نظری بده؟

  7. تشکرها از این نوشته :


  8. #4
    مدیر انجمن Aghaeifar آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    علی آقائی فر
    نوشته ها
    751
    تشکر
    552
    تشکر شده 975 بار در 440 پست

    پیش فرض

    سی پلاس پلاس قاعدتا امکانات زیادی داره و کلاس هاش خیلی راه گشا هستن اما من نظر شخصی ام اینه خیلی اهمیتش برام مشخص نیست برای کاربرد در میکروکنترلرها. یعنی نیاز خاصی ندیدم که در کار با میکروها (در حد کارهای معمولی میکروکنترلری، نه اون بردهایی که سیستم عامل روشون نصب میشه) با خود c به تنهایی حل نشه.

    نظر شخصی من اینه فکر نمی کنم استفاده از کلاس ها باعث سهولت چشمگیری در برنامه نویسی میکروکنترلها بشه.
    ما در انتظار رویت خورشیدیم ...

    اللهم عجل لولیک الفرج

  9. کاربران : 3 تشکر کرده اند از شما Aghaeifar برای ارسال این پست سودمند:


  10. #5
    مدیرکل انجمنها agape آواتار ها
    تاریخ عضویت
    Feb 2009
    نام
    Zeus
    نوشته ها
    1,235
    تشکر
    139
    تشکر شده 2,209 بار در 846 پست

    پیش فرض

    خیلی میتونه مفید باشه به نظر من !
    همین برد های اردوینو رو نگاه کنید ، همه آبجکتیو هستن و کل ملت دارن با c++ براش کد مینویسن!
    مهم اینه که کد نویسی درست رو بلد باشیم

  11. کاربران : 3 تشکر کرده اند از شما agape برای ارسال این پست سودمند:


  12. #6
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    سعی میکنم یه کلاس برای دسترسی به بیت ها و پورتها بنویسم . بعد امتحانش کنید. فکر کنم جالب باشه:
    مثلا یه همچین چیزی:
    [PHP]
    Port Port1(&PORTA,&DDRA,&PINA);
    Port1.Bit(0).Direction=Out;
    Port1.Bit(0)=1;[/PHP]

    الی آخر...

    یا مثلا فرض کنید یه کلکسیون به شکل زیر داشته باشیم:
    [PHP]
    System.Ports.PortA.Direction(0)=Out;
    System.Interfaces.SPI.Init(Master,CLK/16,CPOL_HIGH);[/PHP]
    ...
    ویرایش توسط mansoory : 08-01-2014 در ساعت 15:24

  13. کاربران : 5 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  14. #7
    کاربر فعال sarab1 آواتار ها
    تاریخ عضویت
    Jul 2008
    نوشته ها
    329
    تشکر
    139
    تشکر شده 172 بار در 100 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mansoory نمایش پست ها
    سعی میکنم یه کلاس برای دسترسی به بیت ها و پورتها بنویسم . بعد امتحانش کنید. فکر کنم جالب باشه:
    مثلا یه همچین چیزی:
    [php]
    port port1(&porta,&ddra,&pina);
    port1.bit(0).direction=out;
    port1.bit(0)=1;[/php]الی آخر...

    یا مثلا فرض کنید یه کلکسیون به شکل زیر داشته باشیم:
    [php]
    system.ports.porta.direction(0)=out;
    system.interfaces.spi.init(master,clk/16,cpol_high);[/php]...
    چیز جالبی شد اگه بتونید یکمی هم بیشتر از قابلیت های کد نویسی ++c توضیح بدید اولین حرکت رو فکر کنم شما در بین سایت های فارسی مطرح کردید افراد زیادی علاقهمند بشن!!

  15. کاربران : 3 تشکر کرده اند از شما sarab1 برای ارسال این پست سودمند:


  16. #8
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    آموزش CPP مفصله و از عهده من هم بر نمیاد. یه مختصری درباره کلاسها میگم و همینطور دلایل یکی از نویسندگان CPP رو ترجمه می کنم امیدوارم کافی باشه.
    در قدم اول این کتابها رو پیشنهاد میکنم:
    1- کتاب C++ جعفرنژاد قمی: پیشنهاد میکنم بخرید 10 تومن قیمتشه.
    2- کتاب رایگان:دانلود رایگان کتاب - دانلود کتابهای آموزش برنامه نویسی به زبان ++C. فصل کلاسها و یا شی گرایی این کتابها رو بخونید.
    3- اینم یک مرجع انگلیسی: http://www.persiadevelopers.com/book...s.aspx?id=1596
    ویرایش توسط mansoory : 09-01-2014 در ساعت 11:06

  17. کاربران : 2 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  18. #9
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    یافتم:
    نیازی به اختراع مجدد چرخ نیست.
    AVR C++ Library
    در این لینک میتونید کتابخانه AVRCPP رو ببینید.
    من این کتابخانه رو دانلود می کنم و انشالله کلاسهای یکی از میکروها رو تست میکنم و بعدش اینجا آموزش میدم.
    فعلا

  19. تشکرها از این نوشته :


  20. #10
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    ترجمه:
    متن اصلی: http://www.jaxcoder.com/Projects.aspx?id=788781549

    فایل PDF و سورس برنامه رو دانلود کنید
    فايل هاي پيوست شده فايل هاي پيوست شده
    • نوع فایل: pdf AVRCPP.pdf (470.8 کیلو بایت, 70 نمايش)
    • نوع فایل: zip Blink.zip (7.1 کیلو بایت, 26 نمايش)

  21. تشکرها از این نوشته :


  22. #11
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    توضیحات برنامه فوق:
    ابتدا کلاس رو توضیح میدم که چیه:
    بطور خیلی ساده، کلاس تقریبا چیزیه مثل struct در سی به اضافه اینکه کلاس میتونه تابع هم داشته باشه.
    استراکچرها در سی یک مجموعه ای از چند متغیر هستند که تحت یک نام بسته بندی شده اند:
    به این کدها توجه کنید:
    [PHP]
    struct mydata {
    int first;
    int second;
    };
    struct mydata data1;
    data1.first=3;
    data1.second=5;
    [/PHP]

    یک کلاس هم مانند استراکچرها ساخته و استفاده میشود. کلاس شامل دوبخش مهم است: public و private البته بخشهای دیگه ای هم ممکنه براش تعریف بشه ولی فعلا کاری باهاش نداریم.
    [PHP]
    class CBlink
    {
    public:
    //Constructor with the last parameter set to false as default.
    CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit=false);

    bool IsLedLit() { return m_isLedLit; }
    void SetLitState(bool state);
    void ToggleLitState();

    private:
    bool m_isLedLit;

    volatile uint8_t* m_port;
    volatile uint8_t* m_ddr_port;
    uint8_t m_pin;
    };
    [/PHP]

    تعریف کلاس CBlink رو مشاهده می کنید. وقتی یک کلاس ساخته میش با ساختن نمونه میشه ازش استفاده کرد.
    در تابع Main یک نمونه از کلاس CBlink ساخته شده :

    [PHP]CBlink blink(&PORTD, PD0);[/PHP]

    public بخشی از کلاسه که پس از ساخت نمونه در دسترس کاربر کلاس قرار میگیره. private بخشی از کلاسه که در اون توابع و متغیرها از دید کاربر مخفی می مونه و خود کلاس ازش استفاده می کنه. این یکی از تفاوتهای struct با کلاسه. در استراکچر همه متغیرها در دید کاربر قرار داره و با "." بهشون دسترسی پیدا میکنه. ولی در کلاس پس از نوشتن "." فقط اعضای public در دسترس خواهند بود.
    در تابع main یکی از توابعی که در قسمت public کلاس CBlink هست فراخوانی شده:
    [PHP]blink.ToggleLitState();[/PHP]
    یک نکته مهم اینه که وقتی شما یک نمونه از کلاس ایجاد میکنید در واقع یک سری از تمام متغیرهای public و private اون ایجاد خواهد شد.
    ویرایش توسط mansoory : 09-01-2014 در ساعت 12:33

  23. کاربران : 3 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  24. #12
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    یک کلاس حداقل باید دارای بخش public باشه. در کلاس CBlink این بخش شامل چند تابع شده و متغیری هم تعریف نشده.
    این توابع به این شرح هستند:
    [PHP]CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit=false);

    bool IsLedLit() { return m_isLedLit; }
    void SetLitState(bool state);
    void ToggleLitState();[/PHP]
    تابعی همنام کلاس به نام CBlink وجود داره. این تابع اسمش سازنده کلاس یا Constructor هست. مهمترین تابع هرکلاسی همین تابع هست و همیشه هم باید وجود داشته باشه. وقتی شما یک نمونه از کلاس می سازید در واقع این تابع فراخوانده میشه. در اینجا ما از این تابع برای پیکربندی و مشخص کردن یک پورت و یک پایه برای چشمک زن استفاده کرده ایم. همینطور که میدونید توابع باید نوعشون معلوم باشه )int, void,...( ولی تابع سازنده نوع نداره. به این موضوع توجه کنید.
    بقیه توابع، نکته مهمی ندارند. در اینجا تابع IsLedLit به منظور اطلاع از روشن بودن LED نوشته شده. تابع SetLitState برای روشن یا خاموش کردن LED و تابع ToggleLitState هم وضعیت LED رو معکوس می کنه. توضیح واضحات بود.

  25. کاربران : 2 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  26. #13
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    یک کلاس حداقل باید دارای بخش public باشه. در کلاس CBlink این بخش شامل چند تابع شده و متغیری هم تعریف نشده.
    این توابع به این شرح هستند:
    [PHP]CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit=false);

    bool IsLedLit() { return m_isLedLit; }
    void SetLitState(bool state);
    void ToggleLitState();[/PHP]
    تابعی همنام کلاس به نام CBlink وجود داره. این تابع اسمش سازنده کلاس یا Constructor هست. مهمترین تابع هرکلاسی همین تابع هست و همیشه هم باید وجود داشته باشه. وقتی شما یک نمونه از کلاس می سازید در واقع این تابع فراخوانده میشه. در اینجا ما از این تابع برای پیکربندی و مشخص کردن یک پورت و یک پایه برای چشمک زن استفاده کرده ایم. همینطور که میدونید توابع باید نوعشون معلوم باشه )int, void,...( ولی تابع سازنده نوع نداره. به این موضوع توجه کنید.
    بقیه توابع، نکته مهمی ندارند. در اینجا تابع IsLedLit به منظور اطلاع از روشن بودن LED نوشته شده. تابع SetLitState برای روشن یا خاموش کردن LED و تابع ToggleLitState هم وضعیت LED رو معکوس می کنه. توضیح واضحات بود.

  27. کاربران : 2 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  28. #14
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    بخش دوم private هست. در این بخش این متغیرها تعریف شده اند:
    bool m_isLedLi[PHP]t;

    volatile uint8_t* m_port;
    volatile uint8_t* m_ddr_port;
    uint8_t m_pin;[/PHP]
    متغیر اولی برای نگهداری وضعیت LED ، دومی برای نگهداری آدرس پورت، سومی برای نگهداری آدرس DDR پورت و آخری هم برای نگهداری شماره پین پورت مذکور استفاده می شوند.
    خب تموم شد. این شد تعریف کلاس. همونطور که می بینید بطور کلی تعریف کلاسها در فایل هدر قرار میگیرند و از نظر عملکرد مثل پیش نویس توابع هستند که ما معمولا بالای تابع main یا در یک فایل هدر اونها رو قرار میدیم و اصل تابع رو جای دیگه ای می نویسیم. کلاس هم همینطوره. توابع اصلی کلاس در فایلی همنام فایل هدر کلاس و باپسوند cpp قرار می گیرند.

    به تابع Cblink.cpp بروید.

    [PHP]#include <avr/io.h>
    #include "CBlink.h"

    CBlink::CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit/* =false */)
    {
    //Set the port addresses for the DDR and PORT values
    m_port = port;
    //NOTE: If you expand the Dependencies leaf in the Solution Explorer
    // and open the corresponding io???.h file (for the ATMega1280
    // this file is iomxx0_1.h) and look for the PORT you are using you
    // will see that the values are PINn followed by DDRn and then PORTn
    // so given the PORTn as a parameter the corresponding DDRn is PORTn - 1.
    m_ddr_port = port - 1;

    //Set the DDRn.pin as output
    *m_ddr_port = _BV(pin);

    m_pin = pin;
    m_isLedLit = initiallyLit;

    //Set initial state of the LED
    SetLitState(m_isLedLit);
    }

    void CBlink::SetLitState(bool state)
    {
    m_isLedLit = state;

    if (m_isLedLit)
    *m_port |= _BV(m_pin);
    else
    *m_port &= ~_BV(m_pin);
    }

    void CBlink::ToggleLitState()
    {
    SetLitState(!m_isLedLit);
    }[/PHP]

    به نوحه نوشتن توابع توجه کنید. برای اینکه تابع یک کلاس رو بنویسیم باید نام اون کلاس رو به همراه:: قبلش بیاریم
    تابع اول همون تابع سازنده است:

    [PHP]
    CBlink::CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit/* =false */)
    {
    //Set the port addresses for the DDR and PORT values
    m_port = port;
    //NOTE: If you expand the Dependencies leaf in the Solution Explorer
    // and open the corresponding io???.h file (for the ATMega1280
    // this file is iomxx0_1.h) and look for the PORT you are using you
    // will see that the values are PINn followed by DDRn and then PORTn
    // so given the PORTn as a parameter the corresponding DDRn is PORTn - 1.
    m_ddr_port = port - 1;

    //Set the DDRn.pin as output
    *m_ddr_port = _BV(pin);

    m_pin = pin;
    m_isLedLit = initiallyLit;

    //Set initial state of the LED
    SetLitState(m_isLedLit);
    }[/PHP]

    آرگومانهای این تابع یک اشاره گر و یک متعیر ساده هستند.
    [PHP]CBlink::CBlink(volatile uint8_t* port, uint8_t pin, bool initiallyLit/* =false */)[/PHP]
    در این تابع متغیرهای خصوصی بوسیله آرگومانها آدرس دهی و مقدار دهی شده اند. توضیح داده که در این میکروی خاص آدرس DDR یکی کمتر از آدرس پورته و همینطور هم مقدارش رو داده. این مهمترین قسمت کار بوده. و در توابع دیگه فقط با این متغیرهای خصوصی کار کرده و نتیجه رو به آدرس پورت فرستاده. اونها رو مطالعه کنید و اگه سوالی بود من در خدمتتون هستم
    ویرایش توسط mansoory : 09-01-2014 در ساعت 13:09

  29. کاربران : 3 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


  30. #15
    مدیر انجمن
    تاریخ عضویت
    Dec 2009
    نام
    غلامحسن منصوری
    نوشته ها
    359
    تشکر
    408
    تشکر شده 819 بار در 248 پست

    پیش فرض

    ظاهرا خبری نیست. کلا 4 نفر رای دادن که یکیش خودم بودم و یکنفر هم مخالف و دونفر دیگه هم موافق بودن. و کسی هم یه خط پست نداده!
    با عذرخواهی از دونفر عزیزی که موافق بودن، بعلت عدم استقبال دوستان، این بحث رو خاتمه میدم. خودم این کار رو ادامش میدم.
    موفق باشید
    ویرایش توسط mansoory : 16-01-2014 در ساعت 11:57

  31. کاربران : 3 تشکر کرده اند از شما mansoory برای ارسال این پست سودمند:


موضوعات مشابه

  1. قدم به قدم آموزش Atmel Studio
    توسط vahid0561 در انجمن AVR
    پاسخ: 59
    آخرين نوشته: 12-02-2015, 09:26
  2. Atmel Studio 6
    توسط pooriya در انجمن پرسش و پاسخ (نرم افزارهای تخصصی)
    پاسخ: 56
    آخرين نوشته: 22-05-2014, 14:30
  3. مشکل stk200/300 با atmel studio 6
    توسط Deadman در انجمن AVR
    پاسخ: 1
    آخرين نوشته: 26-11-2013, 23:54
  4. آرم LPC چه برتری ای نسبت به آرم Atmel داره؟
    توسط beroz در انجمن LPC series (NXP)
    پاسخ: 9
    آخرين نوشته: 05-04-2013, 00:54
  5. نحوه تنظیم مقدار Stack در Atmel Studio 6
    توسط mansoory در انجمن AVR
    پاسخ: 0
    آخرين نوشته: 31-01-2013, 09:33

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •