اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    پاسخ : آموزش winavr و avrlib

    استفاده از حافظه EEPROM داخلی avr

    (_مطالبی رو که میگم تست کردم و جواب گرفتم...)


    همونطور که میدونین، متغیرهایی که تعریف میکنیم در حالت عادی در حافظه sram میکرو ذخیره میشن.
    نوع دیگه حافظه، eeprom که با قطع برق، اطلاعاتش پاک نمیشه. در میکروکنترلری مثل mega16 حافظه eeprom داخلی 512 کیلوبایت با امکان نوشتن و خواندن 100000 بار وجود داره.
    رجیسترهای EEARH/L و EEDR و EECR برای کار با حافظه eeprom داخلی هستن. در winavr کتابخونه eeprom.h برای راحتی ارتباط با eeprom درنظر گرفته شده.


    #include <avr/eeprom.h>


    با دستور EEMEM به کامپایلر میگیم که یه متغیر رو در حافظه eeprom ذخیره کنه.


    unsigned char EEMEM char_eeprom;
    unsigned int EEMEM int_eeprom;
    unsigned char EEMEM str_eeprom[12];


    متغیر اول یک بایت، متغیر دوم 2 بایت و آخری هم یک رشته 12 بایتی در حافظه eeprom ذخیره میشن.
    برای نوشتن روی این متغیرها در حافظه eeprom از توابع زیر استفاده می کنیم:


    void eeprom_write_byte (uint8_t *addr, uint8_t value)
    void eeprom_write_word (uint16_t *addr, uint16_t value)
    void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)


    تابع eeprom_write_byte یک بایت در حافظه eeprom مینویسه. پارامتر اولش یک آدرس از حافظه و پارامتر دوم مقداری که باید در مکان مورد نظر بنویسه. دقت کنید که طبق تعریف، آدرس باید از اشاره گر 1 بایتی باشه.
    تابع eeprom_write_word دو بایت تو حافظه eeprom مینویسه. مثل تابع قبل، با این تفاوت که پارامترهاش 2 بایتی هستن.
    تابه eeprom_write_block میتونه n بایت تو eeprom بنویسه. پارامتر اول آدرس مورد نظر از حافظه eeprom ، پارامتر دوم آدرسی از حافظه sram که شامل اطلاعاتی میشه که میخوایم رو eeprom بنویسیم (احتمالا flash هم بشه برای نوشتن مستقیم رشته). پارامتر سوم، تعداد بایتی که باید بخونه. همونطور که می بینید اشاره گرها از نوع void هستن. یعنی اهمیتی نداره که داده مورد نظر از چه نوعی (چند بایتی) باشه.
    کد نحوه استفاده از این توابع:


    #include <avr/io.h>
    #include <avr/eeprom.h>

    unsigned char EEMEM char_eeprom;
    unsigned int EEMEM int_eeprom;
    unsigned char EEMEM str_eeprom[12];

    int main()
    {
    unsigned char str_var[12] = "my str";

    eeprom_write_byte (&char_eeprom, 3);
    eeprom_write_word (&int_eeprom, 4);
    eeprom_write_block (str_eeprom, str_var, 12);
    return 0;
    }


    لازمه به این نکته اشاره کنم که در زبان C ، اپراتور & قبل از نام یک متغیر، آدرس اون رو برمیگردونه. ضمنا نام یک آرایه، خودش اشاره گر به اولین خانه اشغال شده حافظه است.
    برای خوندن حافظه eeprom از توابع زیر استفاده میکنیم:


    uint8_t eeprom_read_byte (const uint8_t *addr)
    uint16_t eeprom_read_word (const uint16_t *addr)
    void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n)


    عملکرد اینام دیگه مشخصه. دو تابع اول آدرس رو به عنوان پارامتر میگیرن و مقدار خونده شده رو برمیگردونن. تابع سوم، n بایت خونده شده از آدرس pointer_eeprom رو در آدرس pointer_ram برمیگردونه.
    کد قبل رو کامل میکنم:


    #include <avr/io.h>
    #include <avr/eeprom.h>

    unsigned char EEMEM char_eeprom;
    unsigned int EEMEM int_eeprom;
    unsigned char EEMEM str_eeprom[12];

    int main()
    {
    unsigned char char_sram;
    unsigned int int_sram;
    unsigned char str_sram[12];
    unsigned char str_var[12] = "my str";

    eeprom_write_byte(&char_eeprom, 3);
    eeprom_write_word(&int_eeprom, 4);
    eeprom_write_block(str_eeprom, str_var, 12);

    char_sram = eeprom_read_byte(&char_eeprom);
    int_sram = eeprom_read_word(&int_eeprom);
    eeprom_read_block(str_sram, str_eeprom, 12);

    return 0;
    }


    حرف آخر در مورد مقداردهی اولیه این متغیرها...


    unsigned char EEMEM char_eeprom = 1;
    unsigned int EEMEM int_eeprom = 2;
    unsigned char EEMEM str_eeprom[12] = "test str";


    متغیرها رو که به این صورت تعریف کردین، کامپایلر یه فایل با پسوند .eep میسازه. باید این فایل رو با استفاده از پروگرمر روی میکرو بنویسین. تصویر زیر رو ببینید ...

    https://www.linkedin.com/in/mohammadhosseini69

    http://zakhar.blog.ir

    دیدگاه


      پاسخ : آموزش winavr و avrlib

      اگر واقعا نشه یک پایه را not کرد واقعا کار سخت میشه،حتما یک راه حلی وجود داره.در ضمن من در مورد نحوه تعریف یک متغیر ثابت درون فلش میکرو به نتیجه نرسیدم.
      هنوزم هم برای من سواله که آیا بعد از این همه سال کار به کدویژن میشه به راحتی ازش گذشت؟کار با winavr با خطاهای خاصی که میده هنوز برای من سخته!!! :cry:

      دیدگاه


        پاسخ : آموزش winavr و avrlib

        نوشته اصلی توسط alireza.s
        اگر واقعا نشه یک پایه را not کرد واقعا کار سخت میشه،حتما یک راه حلی وجود داره.در ضمن من در مورد نحوه تعریف یک متغیر ثابت درون فلش میکرو به نتیجه نرسیدم.
        هنوزم هم برای من سواله که آیا بعد از این همه سال کار به کدویژن میشه به راحتی ازش گذشت؟کار با winavr با خطاهای خاصی که میده هنوز برای من سخته!!! :cry:
        تو این avr های 8 بیتی امکان دسترسی مستقیم به یک بیت وجود نداره و اون کاری که شما تو کدویژن میکنین در نهایت به همون کدی تبدیل میشه که ما اینجا بدون دسترسی مستقیم به بیت مینویسیم. (تو یه سری از میکروکنترلرهای آرم مثل at91sam7 با توجه به جدا بودن رجیسترهای فعال/غیرفعال کننده در مواردی میشه مستقیم رو بک بیت کار کرد...)
        چند روز پیش تو یه فروم دیگه در مورد عملیات بیتی نوشته بودم، شاید جمع و جورش کردم و اینجام گذاشتم...
        ضمنا این چه حرفیه که این همه سال کدویژن کار کردی و ...
        معطل نکن... winavr چه خطای خاصی میده؟!!
        https://www.linkedin.com/in/mohammadhosseini69

        http://zakhar.blog.ir

        دیدگاه


          پاسخ : آموزش winavr و avrlib

          واقعا که آقای حسینی دستتون درد نکنه که به امید راهنماییها و آموزشهای شما پا تو راه یادگیری winavr گذاشتم وگر نه شاید باور نکنید که دیگه امروز حتی مشکل بعضی از کتابخانه های کدویژن را هم میدونم و شاید استفاده از اون برام خیلی راحت تر باشه.حق با شماست باید یاد گرفت.
          من از این خطا چیزی نمیفهمم:
          ../font.h:3: warning: missing braces around initializer
          اخطار هم مربوط به فایل هدری میشه که فونتها را درون فلش به صورت زیر تعریف کردم:

          #include <avr/pgmspace.h>
          const prog_uint8_t Tahoma[95][5]={
          0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x5F, 0x00, 0x00,
          0x00, 0x07, 0x00, 0x07, 0x00,
          0x14, 0x7F, 0x14, 0x7F, 0x14
          ...سایر اعداد
          };

          دیدگاه


            پاسخ : آموزش winavr و avrlib

            به امید من؟! من کی باشم! خودم تحت تعلیمم! خیلی حرفه ای تر اینجا هستنا رو نمیکنن!
            در مورد فلش که تو همین تاپیک بحث شد ( چون از اون به بعد استفاده نکردم یادم نمیاد!)
            سورس پروژه رو کامل بذار شاید من و بقیه دوستان بتونیم مشکل رو حل کنیم
            https://www.linkedin.com/in/mohammadhosseini69

            http://zakhar.blog.ir

            دیدگاه


              پاسخ : آموزش winavr و avrlib

              نوشته اصلی توسط alireza.s
              اگر واقعا نشه یک پایه را not کرد واقعا کار سخت میشه،حتما یک راه حلی وجود داره.در ضمن من در مورد نحوه تعریف یک متغیر ثابت درون فلش میکرو به نتیجه نرسیدم.
              هنوزم هم برای من سواله که آیا بعد از این همه سال کار به کدویژن میشه به راحتی ازش گذشت؟کار با winavr با خطاهای خاصی که میده هنوز برای من سخته!!! :cry:
              برای not کردن یه پایه کافیه از عملگر ^ استفاده کنی مثل :
              کد:
              PORTD ^= 1 << PIN0;

              با این دستور پین اول پورت D رو not میآ‌کنه.

              برای فلش هم اینطوری میتونی تعریف کنی :
              [
              کد:
              const char flashtest PROGMEM = -12;


              وبرای خوندنشم از دستور
              کد:
              memcpy_P( mem, src, size);

              استفاده میآ‌کنی که mem اسم متغییره؛ src ثابتی که توی فلشه و size هم اندازهآ‌ی ثابتی که توی فلش گذاشتی.

              کد:
              char i;
              memcpy_P(&i, &flashtest, sizeof(char));

              دیدگاه


                پاسخ : آموزش winavr و avrlib

                نوشته اصلی توسط alireza.s
                من از این خطا چیزی نمیفهمم:
                ../font.h:3: warning: missing braces around initializer
                اخطار هم مربوط به فایل هدری میشه که فونتها را درون فلش به صورت زیر تعریف کردم:

                #include <avr/pgmspace.h>
                const prog_uint8_t Tahoma[95][5]={
                0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x5F, 0x00, 0x00,
                0x00, 0x07, 0x00, 0x07, 0x00,
                0x14, 0x7F, 0x14, 0x7F, 0x14
                ...سایر اعداد
                };
                از خصوصیات gcc اینه که زیاد به استانداردها گیر میده...
                آکولادها رو کامل بذار و سطر و ستون های آرایه رو از هم جدا کن که warning نده
                اینطوری:

                int array[3][2] = {{1,2},{3,4},{5,6}};
                https://www.linkedin.com/in/mohammadhosseini69

                http://zakhar.blog.ir

                دیدگاه


                  پاسخ : آموزش winavr و avrlib

                  من ساده ترین راه حل برای اینکه بتوانیم به یکی از پینهای میکرو دسترسی داشته باشیم و بتوانیم عملیات بیتی را روی پورت انجام بدیم پیدا کردم و با ویرایش کتابخانه avrlibdefs.h آمادش کردم و میتونید دانلودش کنید و ازش استفاده کنید.

                  لینک دانلود:
                  http://www.4shared.com/file/RuyTBzUr/avrlibdefs.html

                  روش استفاده:
                  1. فایل قرار داده شده را بدون تغییر نام،جایگزین فایل هم نام خودش در کتابخانه avrlib کنید.ساده تر بگم،دیگه از این avrlibdef.h استفاده کنید.
                  2. کتابخانه global.h را اضافه کنید.یعنی اول برنامه بنویسید :
                  #include <global.h>

                  (توی آموزش های آقای حسینی تو همین بخش روش اضافه کردن یک کتابخانه آموزش داده شده است،اما یکی از مواردی که توجه نشده اینه که وقتی global.h را اضافه میکنید دیگر نیازی به اضافه کردن avrlib.def.h و avrlibtypes.h نیست چون این دو هدر توی همان کتابخانه global.h اضافه میشوند.)
                  3. با دستورات زیر به راحتی میتوانید به پین مورد نظر دسترسی داشته باشید،(البته به راحتی کدویژن)
                  avr(PORTB).P0=1; //PORTB.0=1;

                  دستور فوق پین صفر از پورت B را یک میکند.

                  a=avr(PINB).P1; //a=PINB.1;

                  دستور فوق مقدار PINB.1 را در متغیر a قرار میدهد.

                  avr(PORTB).P0=!avr(PINB).P0; //PORTB.0=!PORTB.0;

                  دستور فوق مقدار پورت B را not میکند.

                  خب هر عملیات بیتی که روی یک پین میخواهید انجام بدید دیگه امکان پذیر است و لازم نیست من همه را بگم.
                  [glow=red,2,300]نکته آخر : هیچ کاری امکان ناپذیر نیست. :wow:[/glow]

                  دیدگاه


                    پاسخ : آموزش winavr و avrlib

                    سلام به همگی مخصوصا اقای حسینی با این تاپیک خوبشون. آقا من قبلا bascom کار میکردم ولی به توسیه دوستان و مزایایی که زبان C داشت winavr رو شروع کردم اول کار اومدم از کتابخونه های خود winavr استفاده کردم و برنامه نوشتم.(اکثرا با avrlib ) حالا مثلا میخوام خودم با winavr یه lib برا مثلا کیپدهای 3*4 و 4*4 بنویسم اما نمیدونم چجوری و گیج شدم.(البته میتونم تابع کیپدها رو بنویسم اما تو این موندم که چجوری تبدیلش کنم به کتابخونه. آخه میخوام همه تابع هایی که مینویسم رو تو یک کتابخونه بنویسم و ازشون استفاده کنم.). در این حد میدونم که یه فایل هدر مسازیم و تو تابع main.c و قبل شروع برنامه مثل همه تابع ها با دستور include به اون رجوع میکنیم.و تو فایل ارجاعی فکر کنم باید از دستورات پیش پردازنده استفاده کنم. این هم میدونم که دستورات پیش پردازنده شامل موارد زیر هستند:
                    #include
                    #define
                    #ifndef
                    #ifdef
                    #if
                    #endif
                    #else
                    #error
                    #undef
                    #pragma
                    حالا اگه میشه من رو در این مورد راهنمایی کنید. راستی این دستور آخری pragma این رو هم خوب متوجه نشدم اگه میشه این رو هم یه توضیح کامل بدین. ممنون میشم.




                    اگر روزی هیچ مشکلی سر راهم نبود ؛ میفهمم که راه را اشتباه رفته ام!

                    دیدگاه


                      پاسخ : آموزش winavr و avrlib

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

                      چشم! سعی میکنم بزودی نکاتی رو که میدونم بگم. هرچند چیز خاصی نداره... اگه یه سوژه راحت باشه که واسش یه کتابخونه بنویسیم بهتره...
                      https://www.linkedin.com/in/mohammadhosseini69

                      http://zakhar.blog.ir

                      دیدگاه


                        پاسخ : آموزش winavr و avrlib

                        چند وقتی میشه که اظهار فضل نکردم!

                        نکاتی راجع به پیش پردازش:

                        اولا پیش پردازش عبارتست از پردازش اولیه سورس شما و ایجاد یک سورس جدید برای ارائه به کامپایلر طبق قواعدی که برنامه نویس مشخص میکنه. بنا بر این میشه گفت دستورات پیش پردازش به نوعی قبل از کامپایل برنامه شما "اجرا" میشن. تمامی خطوطی که با کاراکتر # شروع میشه جزء دستورات پیش پردازش تلقی میشه. این دستورات به طور عام شامل موارد زیر هستن:

                        include: که برای اضافه کردن یک سورس در محل این خط در سورس شما استفاده میشه و دو فرم عمومی داره.


                        1) #include "afile"
                        2) #include <afile>


                        در فرم اول دایرکتوری و اسم فایل مورد نظر قید میشه. در این حالت دو نکته حائز اهمیته. اولا بر خلاف رشته های زبان C کاراکتر های خاص مثل n\ و \\ وجود خارجی نداره و رشته ها عینا مثل basic استفاده میشه. ثانیا اگر فرم fullpath استفاده نشه مبنای آدرس دهی فایل مورد نظر از دایرکتوری اصلی پروژه یا سورس اصلی محسوب میشه.

                        در حالت دوم دایرکتوری پایه دایرکتوریی هست که در option های کامپایلر در قسمت include directories مشخص شده باشه یا اینکه در بعضی موارد در لیست دایرکتوری هایی که در متغیر محیطی INCLUDE قید شده باشه. مثلا وقتی مینویسیم:


                        #include <stdio.h>


                        یعنی فایل stdio.h از دایرکتوری پیش فرض کامپایلر در این محل وارد بشه. توجه کنین که در این حالت و حالت قبلی میشه مثل موقعی که با سیستم عامل unix کار میکنیم بجای \ از / استفاده کرد.
                        ....

                        دیدگاه


                          پاسخ : آموزش winavr و avrlib

                          سلام به همه دوستان
                          لطفا اگه کسی در مورد ساخت makefile چیزی میدونه اینجا مطرح کنه
                          مشکلم اینه که وقتی میخوام با avrlib کار کنم نمیتونم درست makefile و ادیت کنم و همش تو کامپایل error میده
                          makefile هایی که تو خود example های avrlib هست خیلی خوب و بدون نیاز به کپی کردن همه فایل ها کنار پروژه اونها را کامپایل میکنه
                          لطفا کمک کنید

                          دیدگاه


                            پاسخ : آموزش winavr و avrlib

                            چطور میتونیم تو AVR Studio فارسی بنویسیم؟
                            وقتی فارسی تایپ میکنم کاراکترهای دیگه ای نمایش داده میشه!

                            دیدگاه


                              پاسخ : آموزش winavr و avrlib

                              نوشته اصلی توسط hamidrx7
                              سلام به همه دوستان
                              لطفا اگه کسی در مورد ساخت makefile چیزی میدونه اینجا مطرح کنه
                              مشکلم اینه که وقتی میخوام با avrlib کار کنم نمیتونم درست makefile و ادیت کنم و همش تو کامپایل error میده
                              makefile هایی که تو خود example های avrlib هست خیلی خوب و بدون نیاز به کپی کردن همه فایل ها کنار پروژه اونها را کامپایل میکنه
                              لطفا کمک کنید
                              من درگیر makefile نمیشم. اگه با avrstudio کار کنی خودش makefile رو میسازه.

                              نوشته اصلی توسط alireza.s
                              چطور میتونیم تو AVR Studio فارسی بنویسیم؟
                              وقتی فارسی تایپ میکنم کاراکترهای دیگه ای نمایش داده میشه!
                              الان امتحان کردم فارسی نوشت! (واسه چی میخوای فارسی بنویسی؟!)
                              https://www.linkedin.com/in/mohammadhosseini69

                              http://zakhar.blog.ir

                              دیدگاه


                                پاسخ : آموزش winavr و avrlib

                                من از کتابخانه lcd گرافیکی با قابلیت فارسی نویسی استفاده میکنم،به همین خاطر میخوام فارسی بنویسم.
                                احتمالا اگر شما میتونید فارسی بنویسید،اشکال از تنظیمات ویندوز من میتونه باشه!!!

                                دیدگاه

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