اطلاعیه

Collapse
No announcement yet.

مشکل در کار با eeprom

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

    مشکل در کار با eeprom

    با سلام به همه عزیزان من یک eeprom 24c512 دارم که میخواهم عدد بزرگی رو مثلا 562400 درون اون بنویسم با اعداد زیر 512 مشکلی ندارم ولی اعداد بزرگ رو نمیتونم بنویسم وبخونم نمونه برنامه ام هم این است
    if(key_enter==0){
    rtc_get_time(&hour,&minute,&second);
    //time=minute*100+hour*10000;
    time=257;
    write_eeprom(time,1);
    rtc_get_date(&week_day,&day,&month,&am p;year);
    write_eeprom(day,2);


    }


    if(key_down==0){

    write_eeprom(20,1);
    delay_ms(50);
    }
    read_data=read_eeprom(1);

    if(key_up==0){
    lcd_clear();
    lcd_gotoxy(0,0);
    time=read_eeprom(1);
    //time=time/10000;
    sprintf(buffer,"Time:%02d",time);
    lcd_puts(buffer);
    delay_ms(100);
    }


    }
    }



    //------------------------
    void write_eeprom(unsigned long int data,unsigned int address)
    {
    i2c_start();
    i2c_write(write_address_bus);
    i2c_write((address & 0xff00)>>8); //high byte address
    i2c_write((address & 0x00ff)); //low byte address
    i2c_write(data);
    i2c_stop();
    delay_ms(10);

    }
    //--------------------------
    unsigned long int read_eeprom(unsigned int address)
    {
    unsigned long int data_read;
    i2c_start();
    i2c_write(write_address_bus);
    i2c_write((address & 0xff00)>>8); //high byte address
    i2c_write((address & 0x00ff)); //low byte address
    i2c_start();
    i2c_write(read_address_bus);
    data_read=i2c_read(0);
    i2c_stop();
    return data_read;

    }

    #2
    پاسخ : مشکل در کار با eeprom

    عزیز جان ، تابعی که داری استفاده میکنی یعنی i2c_write(data); برای نوشتن یک بایت هست، نه 4 بایت.
    شما دو تا راه داری.
    اول و ساده ترین راه تغییر توابع خواندن و نوشتن از long به byte.
    کد:
    //------------------------
    void write_eeprom(unsigned char data,unsigned int address)
    {
      i2c_start();
      i2c_write(write_address_bus);
      i2c_write((address & 0xff00)>>8); //high byte address
      i2c_write((address & 0x00ff));   //low byte address
      i2c_write(data);
      i2c_stop();
      delay_ms(10);
    
    }
    //--------------------------
    unsigned char int read_eeprom(unsigned int address)
    {
      unsigned char data_read;
      i2c_start();
      i2c_write(write_address_bus);
      i2c_write((address & 0xff00)>>8); //high byte address
      i2c_write((address & 0x00ff));   //low byte address
      i2c_start();
      i2c_write(read_address_bus);
      data_read=i2c_read(0);
      i2c_stop();
      return data_read;
    }
    بعد بیای متغیر long رو تبدیل به 4 بایت کنی و هر کدوم رو تو eeprom بنویسی.
    و اما راه دوم.
    اگر دیتاشیت رو نگاه کنی میبینی روشی رو معرفی کرده که 4 بایت یا بیشتر رو پشت سر هم بنویسی و بخونی.

    کد:
    //------------------------
    void write_eeprom(unsigned long data,unsigned int address)
    {
      i2c_start();
      i2c_write(write_address_bus);
      i2c_write((address & 0xff00)>>8); //high byte address
      i2c_write((address & 0x00ff));   //low byte address
      i2c_write(data & 0xFF);
      i2c_write((data>>8) & 0xFF);
      i2c_write((data>>16) & 0xFF);
      i2c_write((data>>24) & 0xFF);
      i2c_stop();
      delay_ms(10);
    }
    
    //--------------------------
    unsigned long int read_eeprom(unsigned int address)
    {
      unsigned long data_read = 0;
      i2c_start();
      i2c_write(write_address_bus);
      i2c_write((address & 0xff00)>>8); //high byte address
      i2c_write((address & 0x00ff));   //low byte address
      i2c_start();
      i2c_write(read_address_bus);
      data_read |= ((unsigned long) (i2c_read(1)));
      data_read |= ((unsigned long) (i2c_read(1)))<<8;
      data_read |= ((unsigned long) (i2c_read(1)))<<16;
      data_read |= ((unsigned long) (i2c_read(0)))<<24;
      i2c_stop();
      return data_read;
    }

    دیدگاه


      #3
      پاسخ : مشکل در کار با eeprom

      سلام منم دارم یه پروژه انجام می دم که لازمه به غیر از ساعت تقویم رو هم ذخیره کنم .اگه بخوام با روش شما انجام بدم ( که می خواستم و بعد پشیمون شدم...) 8بایتی میشه oo:
      تصمیم گرفتم از ارایه استفاده کنم :
      char cal[5]={23,59,11,30,1}; // hour - min - month - day -state
      اما حالا نمیدونم چطوری ذخیرش کنم. :eek:
      و من یه مشکل دیگه هم دارم و اون الگوریتم سرت کردن این آرایه هاست.
      اگه بخوام به روش تقسیم بایتی عمل کنم اطلاعات موقع سرت کردن گم میشه :NO:

      کسی پیشنهادی داره؟؟؟ :redface:

      دیدگاه

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