اطلاعیه

Collapse
No announcement yet.

مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

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

    مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

    سلام
    من در برنامه که در کدویژن هست زیر می خوام یک عدد را که بیشتر از یک بایت هست رو در eeprom خارجی بریزم و بخونم ولی عدد رو درست نمایش نمی دهد
    من از ال سی دی شیشه ای استفاده می کنم و تابع dispaly برای نوشتن در ال سی دی هست
    برنامه

    [left]
    void write_eeprom(unsigned char data,unsigned int address);
    unsigned char read_eeprom(unsigned int address);
    void display(void);
    int t; //main & lcd function
    int x[12]; //main & lcd function
    //unsigned char read_data; // eeprom fanction
    long int m,n;
    int d;
    // Declare your global variables here

    void main(void)
    n=3000;
    d=n;
    i2c_init();
    write_eeprom(0,0);
    write_eeprom(n&0xff000000>>24,0);
    write_eeprom(0,1);
    write_eeprom(n&0x00ff0000>>16,1);
    write_eeprom(0,2);
    write_eeprom(n&0x0000ff00>>8,2);
    write_eeprom(0,3);
    write_eeprom(n&0x000000ff,3);
    //write_eeprom(250,3);


    while (1)
    {
    t=0;

    [right][pre]
    [center][center][center]m=(long int)(read_eeprom(0)<<24)|(read_eeprom(1)< <16)|(read_eeprom(2)<<8)|(read_eeprom(3)) ;


    x[t]=m%10; // Unit number
    display();
    t++;
    for (t=1;t<=7;t++) // until last position lcd
    {
    m=m/10;
    if (m<10)
    {
    x[t]=m;
    }
    else
    {
    x[t]=m%10;
    }
    display();
    }
    t=0;

    }

    }

    void write_eeprom(unsigned char data,unsigned int address)
    {
    i2c_start();
    i2c_write(0xAE);
    i2c_write(address& 0xFF00>>8);
    i2c_write(address & 0X00FF);
    i2c_write(data);
    i2c_stop();
    delay_ms(10);
    }

    unsigned char read_eeprom(unsigned int address)
    {
    unsigned char data_read;
    i2c_start();
    i2c_write(0xAE);
    i2c_write(address& 0xFF00>>8);
    i2c_write(address & 0X00FF);
    i2c_start();
    i2c_write(0xAF);
    data_read=i2c_read(0);
    i2c_stop();
    return data_read;
    }
    من وقتی عدد رو می خونم 987 نشون می دهد!!!!!
    وقتی عدد یک بایت رایت می کنم و به این صورت رایت می کنم و می نویسم
    write_eeprom(250,3);
    m=(read_eeprom(3));
    درست رایت می کند ونمایش مدهد
    ولی عدد مثل 10رو 778 نمایش می دهد
    یعنی خانه های 0و1و2 را با اعدد 256 و خانه 3 را با عدد 10 پر می کند
    امیدوارم بتونید کمکم کنید

    #2
    پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

    با سلام،

    این کدها در چه محیط برنامه نویسی هستند؟
    اگر در کدویژن نوشته شدند، برای استفاده از eeprom به شکل زیر عمل کنید :
    کد:
    Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the eeprom or __eeprom memory attributes.
    Example:
    /* The value 1 is stored in the EEPROM during chip programming */
    eeprom int alfa=1;
    eeprom char beta;
    eeprom long array1[5];
    /* The string is stored in the EEPROM during chip programming */
    eeprom char string[]=”Hello”;
    void main(void) {
    int i;
    /* Pointer to EEPROM */
    int eeprom *ptr_to_eeprom;
    /* Write directly the value 0×55 to the EEPROM */
    alfa=0×55;
    /* or indirectly by using a pointer */
    ptr_to_eeprom=&alfa;
    *ptr_to_eeprom=0×55;
    /* Read directly the value from the EEPROM */
    i=alfa;
    /* or indirectly by using a pointer */
    i=*ptr_to_eeprom;
    }
    Pointers to the EEPROM always occupy 16 bits in memory.

    اگر در WinAVR هستند که از این هم راحت تره!

    کد:
    .
    .
    .
    
    long  						Ltemp;
    long		EEMEM			temp;
    
    .
    .
    .
    .
    
    eeprom_write_dword(&temp, Ltemp);
    .
    .
    .
    
    Ltemp = eeprom_read_dword(&&temp);
    
    .
    .
    .
    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

    Sh_Nourbakhsh@Yahoo.com

    http://s2.picofile.com/file/7170362468/_Wall_e_.jp

    دیدگاه


      #3
      پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

      ممنون از پاسخ تون
      من رایت کردن اعداد کمتر از یک بایت و خواندن از حافظه خارجی مشکلی ندارم
      در رایت وخوندن اعداد بیشت از یک بایت مثلا از نوع double مشکل دارم

      دیدگاه


        #4
        پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

        با معذرت، گرفتم!!!

        شما میخوای توی یه eeprom خارجی بنویسی، نه eeprom میکرو!!! راستش به اون کلمه خارجی دقت نکردم و کد شما هم خیلی شلوغ بود، متوجه موضوع نشدم......
        مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

        Sh_Nourbakhsh@Yahoo.com

        http://s2.picofile.com/file/7170362468/_Wall_e_.jp

        دیدگاه


          #5
          پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

          خوب، شما در روند نوشتن و خوندن باید یک بایت یک بایت بنویسی و بخونی.
          حالا قبل از نوشتن باید اون سه یا چهار بایت رو هشت بیت هشت بیت از هم جدا کنی و توی سه یا چهار تا متغییر بریزی و بعد بنویسیش و در زمان خوندن هم یک بایت یک بایت بخونی و بعد از خوندن، هشت بیت هشت بیت به هم بچسبونی و بریزی توی یه متغییر، با توجه به اینکه توی نوشتن و خوندن یک بایتی مشکلی نداری، قاعدتا نباید مشکلی پیش بیاد......

          به اینجا هم یه سری بزن :
          http://extremeelectronics.co.in/avr-tutorials/easy-24c-i2c-serial-eeprom-interfacing-with-avr-microcontrollers/
          مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

          Sh_Nourbakhsh@Yahoo.com

          http://s2.picofile.com/file/7170362468/_Wall_e_.jp

          دیدگاه


            #6
            پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

            در این که یکم شلوغ تایپ شد شکی نیست
            من روشم رو عوض کرده از بایت پر ارزش یه بایت کم ارزش رایت کردم مشکلم حل شد اما الان یک مشکل دیگه دارم من متعییر n رو از نوع long int تعریف کردم اما تا محدوده short int داده ها رو درست رایت میکنه؟؟؟؟؟؟؟؟؟؟؟؟؟
            چرا؟

            دیدگاه


              #7
              پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

              void write_eeprom(long int data,unsigned int address);
              unsigned char read_eeprom(unsigned int address);
              void display(void);
              int t;
              int x[12];

              long int m,n;
              long int d,a0,a1,a2,a3;


              void main(void)
              {
              n=32768;
              d=n;
              i2c_init();
              a0=n&0xff;
              write_eeprom(a0,0);
              a1=n&0xff00;
              a1=a1>>8;
              write_eeprom(a1,1);
              a2=n&0x0ff0000;
              a2=a2>>16;
              write_eeprom(a2,2);
              a3=n&0xff000000;
              a3=a3>>24;
              write_eeprom(a3,3);
              while (1)
              {
              t=0;

              m=(read_eeprom(0))|(read_eeprom(1)<<8)|(read _eeprom(2)<<16)|(read_eeprom(3)<<24);

              x[t]=m%10; // Unit number
              display();
              t++;
              for (t=1;t<=7;t++) // until last position lcd
              {
              m=m/10;
              if (m<10)
              {
              x[t]=m;
              }
              else
              {
              x[t]=m%10;
              }
              display();
              }
              t=0;
              }

              void write_eeprom(long int data,unsigned int address)
              {
              i2c_start();
              i2c_write(0xAE);
              i2c_write(address& 0xFF00>>8);
              i2c_write(address & 0X00FF);
              i2c_write(data);
              i2c_stop();
              delay_ms(10);
              }
              //__________________________________________________ ________________________________________
              unsigned char read_eeprom(unsigned int address)
              {
              unsigned char data_read;
              i2c_start();
              i2c_write(0xAE);
              i2c_write(address& 0xFF00>>8);
              i2c_write(address & 0X00FF);
              i2c_start();
              i2c_write(0xAF);
              data_read=i2c_read(0);
              i2c_stop();
              return data_read;
              }

              دیدگاه


                #8
                پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

                یعنی این سئوال این همه آسون هست که کسی علاقه ندره جواب بده!!!!!!!!!!!!!!!!!!!!!

                دیدگاه


                  #9
                  پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

                  سلام
                  خوب کدویژن همینه دیگه زود گیج میشه.
                  به نظر من از optimizer هستش.
                  شما اینطوری بنویسید


                  کد:
                  volatile int t;     
                  volatile int x[12];   
                  
                  volatile long int m,n;
                  volatile long int d,a0,a1,a2,a3;


                  اگه نشد


                  کد:
                  void write_eeprom(long int data,unsigned int address);
                  unsigned char read_eeprom(unsigned int address);
                  void display(void);
                  
                  volatile int t;     
                  volatile int x[12];   
                  
                  volatile long int m,n;
                  volatile long int d,a0,a1,a2,a3;
                  
                  
                  void writeLong(long num , int addr)
                  {
                  	write_eeprom(num,0);
                  	write_eeprom(num>>8,1);
                  	write_eeprom(num>>16,2);
                  	write_eeprom(num>>24,3);
                  }
                  
                  long readlong(int addr)
                  {
                  	long ret;
                  	ret = read_eeprom(3);
                  	ret = ret << 8;
                  	ret |= read_eeprom(2);
                  	ret = ret << 8;
                  	ret |= read_eeprom(1);
                  	ret = ret << 8;
                  	ret |= read_eeprom(0);
                  	ret = ret << 8;
                  	return ret;
                  }
                  
                  void main(void)
                  {
                  
                  i2c_init();
                  writeLong(23123 , 0);
                  
                  while (1)
                     {  
                      t=0;
                  
                     m=readlong(0);
                  
                         x[t]=m%10;       // Unit number
                            display();             
                            t++;   
                            for (t=1;t<=7;t++)        // until last position lcd
                            { 
                            m=m/10;
                            if (m<10)
                             {
                             x[t]=m;
                             }
                            else
                             {
                             x[t]=m%10;
                             }
                            display();
                            }
                           t=0;
                     }
                  }
                  
                   void write_eeprom(long int data,unsigned int address)
                    {
                    i2c_start();
                    i2c_write(0xAE);
                    i2c_write(address& 0xFF00>>8);
                    i2c_write(address & 0X00FF);
                    i2c_write(data);
                    i2c_stop();
                    delay_ms(10);
                    }
                   //__________________________________________________________________________________________
                    unsigned char read_eeprom(unsigned int address)
                    {
                    unsigned char data_read;
                    i2c_start();
                    i2c_write(0xAE);
                    i2c_write(address& 0xFF00>>8);
                    i2c_write(address & 0X00FF);
                    i2c_start();
                    i2c_write(0xAF);
                    data_read=i2c_read(0);
                    i2c_stop();
                    return data_read;
                    }
                  بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                  اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                  دیدگاه


                    #10
                    پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

                    سلام
                    نه
                    نشد
                    این کار رو قبلا انجام داده بودم!!!!!!!!!!!!
                    درست نشد
                    واقعا کسی نمی تونه کمک کنه!!!!!!!!!!

                    دیدگاه


                      #11
                      پاسخ : مشکل در نوشتن بیشتر از یک بایت در eeprom خارجی

                      فایلهای پروژه و شبیه سازی رو بدید تا بشه دقیقتر بررسی کرد.
                      بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
                      اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست

                      دیدگاه

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