اطلاعیه

Collapse
No announcement yet.

نوشتن روی EEPROM داخلی میکرو

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

    نوشتن روی EEPROM داخلی میکرو

    سلام
    برای کار با EEPROM داخلی میکرو من متغییر های مورد نیازمو با پیشون eeprom تعریف کردم .مثلا :

    unsigned char eeprom Phone_Book_E[ 21 ][ 17 ] = {" ",.....};

    حالا واسه ریختن تو اینا(Write) یا خوندن(Read) مگه یه تاخیری لازم نیست ؟
    مخصوصا اگه بخواهیم یه رشته رو منتقل کنیم به eeprom یا از eeprom بخونیم ؟
    تو سایت سرچ زدم دوستان از 4 میلی ثانیه تا 10 پیشنهاد کردن !
    خود دیتا شیت هم برای دسترسی به صورت آدرسی این رو استفاده کرده :

    while(EECR & (1<<EEWE)); //Wait for completion of previous write

    از همین تو کدویژن هم استفاده کرد ؟

    ممنون
    زمان تنها واحد حقیقی اندازه گیریه
    زمان وجود ماده رو اثبات میکنه
    بدون زمان هیچکدوم ما وجود نخواهیم داشت
    زمان یکتاست

    #2
    پاسخ : نوشتن روی EEPROM داخلی میکرو

    با سلام
    میتونید از این ماکرو برای خوندن استفاده کنید :

    #define _EEGET(VAR,ADR) /* Read data in EEPROM address ADR into variable VAR
    */ \
    { \
    while(EECR & 0x02); /* Check if EEPROM is ready*/ \
    EEAR = (ADR); /* Write EEPROM address register*/ \
    EECR |= 0x01; /* Set the read strobe*/ \
    (VAR) = EEDR; /* Read the data into variable in the next cycle */ \
    }


    و از این ماکرو برای نوشتن :
    #define _EEPUT(ADR,VAL) /* Write data in VAL into EEPROM address ADR*/\
    {\
    while(EECR&0x02); /* Check if EEPROM is ready*/ \
    EEAR = (ADR); /* Write EEPROM address register*/ \
    EEDR = (VAL); /* Write EEPROM data register*/ \
    EECR |= 0x04; /* Set master write enable signal*/ \
    EECR |= 0x02; /* Set write strobe*/ \
    }

    اینم یه مثال :


    #define EE_ADDRESS 0x010 /* Define address constant for EEPROM data*/
    void main(void){
    unsigned char temp; /* Local variable for temporary storage */
    UDR=0X44;
    _EEPUT(EE_ADDRESS,0x55);
    _EEGET(temp,EE_ADDRESS); /* Read data from EEPROM*/
    temp += UDR; /* Add UART in m8515 data to temp variable */
    _EEPUT(EE_ADDRESS,temp); /* Write data to EEPROM*/

    while(1){
    };
    }


    در اینجا در ابتدا مقدار 0X55 در خانه به آدرس EE_ADDRESS یعنی 0X010 نوشته شده سپس مقدار همین خانه خوانده و در متغیر temp ریخته میشود و سپس مقدار temp+UDR یعنی 0X99 در همین خانه از EEPROM ذخیره می شود .

    البته ؛

    توجه : در هنگام نوشتن داده در EEPROM باید اینتراپت ها غیر فعال باشند چرا که تنها به مدت 4 سیکل که بیت EEMWE یک میشود فرصت هست تا اطلاعات با یک کردن بیت EEWE در EEPROM ثبت شوند که اگر در این حن یک وقفه رخ دهد دیگر این زمان تمام شده و باید منتظر سیکل بعدی برای نوشتن بود همچنین اگر در برنامهوقفه فعال باشد و بخواهیم اطلاعات را از داخل EEPROM بخوانیم بهتر است برای جلوگیری از خراب شدن آدرس خانه حافظه EEPROM ، در رجیستر EEDR اینتراپت سراسری را غیر فعال کنیم این کار ار میتوان با استفاده از دستور اسمبلی CLI انجام داد .



    دیدگاه


      #3
      پاسخ : نوشتن روی EEPROM داخلی میکرو

      ممنون
      اما من نمیخوام با آدرس های EEPROM سرو کار داشته باشم 1
      خود کدوییزن این رمان رو مد نظر نمیگیره ؟
      فقط میخوام بدونم بعد از هر بار Write چقدر باید صبر کنم (با چک کردن چی؟)
      زمان تنها واحد حقیقی اندازه گیریه
      زمان وجود ماده رو اثبات میکنه
      بدون زمان هیچکدوم ما وجود نخواهیم داشت
      زمان یکتاست

      دیدگاه


        #4
        پاسخ : نوشتن روی EEPROM داخلی میکرو

        آره تا اونجا که من میدونم خودش در نظر میگیره ، راستی کلمه کلیدی eeprom قبل از نوع متغیر باید نوشته بشه ، مثلا :


        eeprom char e_n_remut


        در واقع این روتینیه که کامپایلر cv ازش برای اینکار استفاده میکنه :


        __EEPROMWRB:
        SBIS EECR,EEWE
        RJMP __EEPROMWRB1
        WDR
        RJMP __EEPROMWRB

        دیدگاه


          #5
          پاسخ : نوشتن روی EEPROM داخلی میکرو

          دیتا شیت زمان تقریبا 8.2 میلی ثانیه رو براش در نظر گرفته.ولی من خودم تاخیر نزاشتم مشکل هم تا حالا پیش نیومده :biggrin:
          تو این جهان 7 میلیاردی من معنی ندارد و اگه تو این دنیا فقط 1 نفر وجود داشت باز هم من معنی نداشت

          دیدگاه

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