اطلاعیه

Collapse
No announcement yet.

EEPROM داخلی NVM ) XMEGA )

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

    #16
    پاسخ : EEPROM داخلی NVM ) XMEGA )

    با سپاس ، بله درست متوجه شده اید آیا به غیر از آرایه روش دیگری در زبان c برای میکرو وجود دارد که بهتر از آرایه باشد چون نیاز به نام های متفاوت جهت خوانایی برنامه می باشد که ظاهرا در آرایه چنین امکانی وجود ندارد .(اگر امکان دارد لطفا یک مثال بنویسید ).
    مثلا میتوان نوشت a@0x2000 , b@0x2002 , c@2004

    دیدگاه


      #17
      پاسخ : EEPROM داخلی NVM ) XMEGA )

      شما می توانید متغیرهای با نام های مختلف را در یک Structure تعریف کنید که اعضای آن بصورت پشت سر هم در حافظه قرار می گیرند و نیازی به تعیین آدرس نیست. از نظر مثال هم در مراجعه بعدی به انجمن مثالی را ذکر خواهم کرد.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #18
        پاسخ : EEPROM داخلی NVM ) XMEGA )

        پیرو پست قبل به عنوان مثالی برای ارتباط مستقیم با NVM Controller (در صورت استفاده از سری A3)، اگر 4 متغیر در یک struct ذخیره شده باشند:

        کد:
        struct {
        unsigned char a;
        unsigned char b; 
        unsigned char c;
        unsigned int d;
        }Mystruct;


        برای ذخیره این 5 بایت در بافر eeprom می توان از الگوی تابع EEPROM_LoadPage در AVR1315 استفاده کرد:

        کد:
         #define PAGE_ADDR 0
         unsigned char *ptr;
         ptr=&Mystruct.a;
         EEPROM_FlushBuffer();
         EEPROM_WaitForNVM();
         NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
         NVM.ADDR1 = 0x00;
         NVM.ADDR2 = 0x00;
         for (unsigned char i = 0; i <5; ++i) 
         {
         NVM.ADDR0 = i;
         NVM.DATA0 = *ptr++; 
         }
         EEPROM_ErasePage(PAGE_ADDR);
         EEPROM_SplitWritePage(PAGE_ADDR);
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #19
          پاسخ : اخبار جدید درباره خانواده XMEGA

          جناب کی نژاد میخواستم بپرسم در xmega مشکلاتی که برای eeprom وجود دارد را باز هم مشاهده میکنید؟
          بعد از مدتی مقادیر درون eeprom در avrهای معمولی پاک میشود.(!)
          بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
          موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
          نلسون ماندلا

          دیدگاه


            #20
            پاسخ : EEPROM داخلی NVM ) XMEGA )

            (پست شما به تاپیک مناسب منتقل شد)
            تاکنون حتی یکبار هم مسئله پاک شدن eeprom در AVR را در استفاده از تعداد بسیار زیادی از این میکروکنترلر مشاهده نکرده ام. البته این مسئله با رعایت مدار مناسب برای تغذیه و قرار دادن سطح Brown out detection در بالاترین ولتاژ برقرار بوده است. در مورد XMEGA هم تاکنون به چنین موردی برخورد نکرده ام.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #21
              پاسخ : EEPROM داخلی NVM ) XMEGA )

              اگر برنامه نویسی cیا++c وارد باشی میتونی با struct (استراکچر) هرنوع متغیر دلخواهی بسازی

              دیدگاه


                #22
                پاسخ : EEPROM داخلی NVM ) XMEGA )

                آدرس data که در کتابخانه EEPROM اتمل به تابع زیر ارسال میکنیم آدرس دیتای مربوط به همان PAGE است یا آدرسی است که میتواند از ابتدای آدرس تا انتهای eeprom را شامل شود ؟ ( مثلا ادرس صفر فقط مربوط به page 0 که درحقیقت ابتدای eeprom می باشد یا برای هر page می باشد ؟ )
                void read_multibyte_eeprom(uint8_t page,uint16_t *address,uint8_t count_read)

                دیدگاه


                  #23
                  پاسخ : EEPROM داخلی NVM ) XMEGA )

                  این تابع در AVR1315 وجود ندارد. منظور شما از کتابخانه Atmel تابع موجود در کدام Application note است؟
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #24
                    پاسخ : EEPROM داخلی NVM ) XMEGA )

                    با عرض پوزش دوباره
                    void EEPROM_WriteByte( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )

                    دیدگاه


                      #25
                      پاسخ : EEPROM داخلی NVM ) XMEGA )

                      پاسخ سوال شما، در ابتدای متن تابع توضیح داده شده که نشان دهنده این است که آدرس ارسال شده، آدرس در page است:

                      byteAddr EEPROM Byte address, between 0 and EEPROM_PAGESIZE.
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        #26
                        پاسخ : EEPROM داخلی NVM ) XMEGA )

                        نوشته اصلی توسط طراح
                        اگر منظور از نوشتن هر سه با هم، نوشتن در یک page است، چنین کاری میسر است و در این رابطه می توانید به توابع و روش های موجود در AVR1315 مراجعه کنید. البته در مورد خانواده A3 باید ماکرو اسمبلی () NVM_EXEC در برنامه تغییر داده شود و وارد شدن به مد sleep هم برای بعضی عملیات به آن اضافه شود. در صورتی که قصد انجام این کار را دارید و موفق نشدید تغییر لازم را انجام دهید، به من اعلام کنید تا سورس لازم را در اختیار شما قرار دهم.
                        کد زیر را از AVR1008 استفاده کردم بعضی مواقع داده های نادرستی در eeprom ذخیره می گردد ، لطفا کدهای زیر بررسی نمایید که آیا درست می باشند یا خیر؟
                        ضمنا شماره میکرو ATXMEGA64A3 می باشد . با سپاس
                        void EEPROM_WriteByte( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )
                        {
                        EEPROM_FlushBuffer();
                        NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
                        uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
                        |(byteAddr & (EEPROM_PAGESIZE-1));
                        NVM.ADDR0 = address & 0xFF;
                        NVM.ADDR1 = (address >> 8) & 0x1F;
                        NVM.ADDR2 = 0x00;
                        NVM.DATA0 = value;
                        NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
                        //NVM_EXEC();
                        eeprom_sleep();
                        }


                        //--------------------------------------------------------------
                        void eeprom_sleep(void)
                        {
                        uint8_t sleepCtr = SLEEP.CTRL;/* Save the Sleep register */
                        SLEEP.CTRL = (SLEEP.CTRL & ~SLEEP.CTRL) | SLEEP_SMODE_IDLE_gc; /* Set sleep mode to IDLE */

                        /* Save the PMIC Status and control registers */
                        uint8_t statusStore = PMIC.STATUS;
                        uint8_t pmicStore = PMIC.CTRL;

                        /* Enable only the highest level of interrupts */
                        PMIC.CTRL = (PMIC.CTRL & ~(PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm)) | PMIC_HILVLEN_bm;
                        uint8_t globalInt = SREG;/* Save SREG for later use */
                        sei();/* Enable global interrupts */
                        SLEEP.CTRL |= SLEEP_SEN_bm; /* Set sleep enabled */
                        uint8_t eepromintStore = NVM.INTCTRL;/* Save eeprom interrupt settings for later */

                        /* Write the "safety code" to the CCP regiter */
                        /* EEPROM write has to be executed within 4 cycles */
                        CCP = CCP_IOREG_gc;
                        NVM.CTRLA = NVM_CMDEX_bm;/* Execute command to write buffer page to EEPROM */
                        NVM.INTCTRL = NVM_EELVL0_bm | NVM_EELVL1_bm;/* Enable EEPROM interrupt */
                        __sleep();/* Sleep before 2.5uS has passed */


                        SLEEP.CTRL = sleepCtr;/* Restore sleep settings */
                        PMIC.STATUS = statusStore;/* Restore PMIC status and control registers */
                        PMIC.CTRL = pmicStore;
                        NVM.INTCTRL = eepromintStore;/* Restore EEPROM interruptsettings */
                        SREG = globalInt;/* Restore global interrupt settings */
                        }


                        و کد زیر در تابع main استفاده شده :
                        //------------------------------------------------------
                        ISR(NVM_EE_vect)
                        {
                        NVM.INTCTRL = (NVM.INTCTRL & ~NVM_EELVL_gm);
                        }

                        دیدگاه


                          #27
                          پاسخ : EEPROM داخلی NVM ) XMEGA )

                          شما کدهای AVR1315 و AVR1008 را با هم ترکیب کرده اید که با توجه به اینکه بررسی دقیق کد و یافتن اشکال آن مستلزم صرف وقت است، برای حل مشکل از همان چارچوب کد AVR1315 و به جای کتابخانه های آن از دو فایل اصلاح شده ای که ضمیمه می کنم، استفاده کنید.
                          فایل های پیوست شده
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #28
                            پاسخ : EEPROM داخلی NVM ) XMEGA )

                            1-اگر در هنگام عملیات write ولتاژ تغدیه تغییر کند مثلا از 3.3 به 2.5 کاهش یابد آیا مشکلی در عملیات write ایجاد میآ‌شود؟
                            2- write در ولتاژ 3.3 یا مثلا 2.5 یا... تفاوتی دارد(مثلا زمان write افزایش می یابد)؟
                            3- آیا در دیتاشیت توضیحاتی داده شده؟( اینجانب پیدا نکردم)
                            با سپاس

                            دیدگاه


                              #29
                              پاسخ : EEPROM داخلی NVM ) XMEGA )

                              در AVR این مسئله وجود داشت که در ولتاژهای پائین تغذیه محتوای eeprom ممکن است پاک شود یا تغییر کند که برای جلوگیری از این وضعیت، Brown out detection باید در سطح مناسب فعال باشد. در مورد XMEGA اشاره ای در Manual شده که واحد NVM Controller دارای حفاظتی است که در ولتاژهای بسیار پائین به منظور صحت عملکرد آن فعال می شود.اما برای شرایط مطرح شده در سوال و اینکه تاثیری در صحت نوشتن یا زمان آن داشته باشد، در datasheet یا manual مورد خاصی را مشاهده نکردم.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


                                #30
                                پاسخ : EEPROM داخلی NVM ) XMEGA )

                                با سلام
                                بنده در خصوص استفاده ار eeprom داخلی xmega اخیرا موردی را مشاهده کردم که خواستم هم در اینجا مطرح کنم و هم اینکه از راهنمایی دوستان مخصوصا جناب استاد کی نژاد بهره مند شوم
                                اخیرا یک سخت افزار بر مبنای xmega طراحی کردم و داخل دستگاهی گذاشتم و این دستگاه به یکی از استان ها جهت کاربری ارسال شد . عملکرد اولیه دستگاه بدین صورت است که پس از روشن شدن یک عدد را از داخل یک آدرس مشخص از eeprom را خوانده و در صورتی که با عدد مشخصی برابر نباشد پیغام خطایی را بر روی صفحه نمایشگر ظاهر می کند و منتظر وارد کردن کد و نوشتن آن داخل eeprom توسط دستورات atomic write می ماند . متاسفانه پس از مدتی استفاده از دستگاه , پیغامی بر روی صفحه نمایش ظاهر شد که بیانگر حالتی می باشد که قبلا داخل eeprom عدد صفر نوشته شده است . با توجه به اینکه در برنامه داخلی میکروکنترلر گزینه ای تحت عنوان نوشتن عدد صفر داخل eeprom وجود ندارد می خواستم ببینم علت این مشکل چیه ؟ و راه حل چیست؟
                                لازم به ذکر است که در فیوز بیت ها مد brown out فعال شده و بر روی مقدار 2.4 ولت تنظیم شده است
                                با تشکر از راهنمایی دوستان
                                مشخصات من در لینک زیر
                                http://www.eca.ir/forum2/index.php?topic=1721.msg698645#msg698645

                                www.********

                                دیدگاه

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