اطلاعیه

Collapse
No announcement yet.

چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

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

    چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

    مخواهم داده های از نوع float را که از LM35 دریافت می کنم بر روی 24C512 ذخیره و بازیابی کنم.
    داده float تعداد 32 بیت را اشغال می کند، چه طوری می توان این 4 بیت را پشت سر هم فرستاد و در موقع فراخوانی آنها را به هم چسباند تا تشکیل یک عدد مشخص را بدن؟؟؟
    دوستانی که نمونه کد یا توضیحی دارند ممنون میشم ارائه بدن.

    #2
    پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

    کد:
    yo = yl|(xh << 8);

    دیدگاه


      #3
      پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

      نوشته اصلی توسط بنیامین خلیلی
      کد:
      yo = yl|(xh << 8);
      خیلی ممنون از پاسختون
      من تازه کارم :sad:
      اگر میشه یه مقدار توضیح بدید که دقیقا چه اتفاقی می افته

      دیدگاه


        #4
        پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

        چرا دیتا رو در کارت mmcنمی ریزی

        دیدگاه


          #5
          پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

          سلام

          منم مشکل شما رو داشتم و با اقای خلیلی موافقم.کار کردن با EEPROM دردسر داره ک کلا من گذاشتمش کنار و رفتم سراغ MMC (مموری)

          هم از نظر اقتصادی بصرفس هم حافظه ی زیادی رو در اختیارتون میذاره،در آینده مجبورید از همین مموری ها استفاده کنید.

          تو این سایت هم تاپیک های زیاد و خوبی برای شروع هست بگردید چیزای خوبی پیدا میکنید

          دیدگاه


            #6
            پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

            نوشته اصلی توسط سمیرا محمدی 67
            مخواهم داده های از نوع float را که از LM35 دریافت می کنم بر روی 24C512 ذخیره و بازیابی کنم.
            داده float تعداد 32 بیت را اشغال می کند، چه طوری می توان این 4 بیت را پشت سر هم فرستاد و در موقع فراخوانی آنها را به هم چسباند تا تشکیل یک عدد مشخص را بدن؟؟؟
            دوستانی که نمونه کد یا توضیحی دارند ممنون میشم ارائه بدن.
            توی ساختمان داده های حافظه، همه چیز به ترتیبِ ارزش کمتر ذخیره می شه. مثلاً اگه یه عدد 2 بایتی داریم، اول بایتِ پایین، و بعد بایت بالا ذخیره و فراخوانی می شه. برای متغیر float 4 بایت داریم که باز هم به همین ترتیبه.
            برای ذخیره کردن کافیه به ترتیب از بایت کم ارزش، تک بایت تک بایت توی حافظه خارجی بنویسید. موقع خوندن هم به همین منوال. فقط می مونه درست کردن اشاره گر به آدرسِ تک بایتی از یه متغیر 4 بایتی توی حافظه که توضیحش یه کم سخته!
            این نمونه کدیه که من همیشه توی کارها ازش استفاده می کنم:
            کد:
            void SendFloat(float num )
            {
            OUTPUT = *((unsigned char *) &num);
            OUTPUT = *((unsigned char *) &num+1);
            OUTPUT = *((unsigned char *) &num+2);
            OUTPUT = *((unsigned char *) &num+3);
            }
            بیایید با Google آشتی کنیم!

            دیدگاه


              #7
              پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

              نوشته اصلی توسط بنیامین خلیلی
              چرا دیتا رو در کارت mmcنمی ریزی
              اتفاقا به ذهن خودم هم رسید، یه کم باهاش کار کردم دیدم خیلی دردسر داره :sad:

              دیدگاه


                #8
                پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟








                کد:
                $regfile = "m64def.dat"
                 $crystal = 8000000
                $baud = 1200
                $hwstack = 128 $swstack = 128 $framesize = 128
                Config Portb.7 = Output
                Led Alias Portb.7
                
                 $include "Config_MMC.bas" $include "Config_AVR-DOS.BAS"
                Dim B As Byte
                B = Initfilesystem(1)
                If B <> 0 Then
                Led = 1
                
                Stop
                End If
                Dim P As Byte
                Dim File As String * 10
                Dim Size As Long
                Dim Size_str As String * 50 Dim Free As Long
                Size = Disksize()
                Free = Diskfree()
                Size_str = "mmc" + Str(free) + " èç " + Str(size) + File = "log.txt"
                Open File For Output As #1
                Print #1 , "ben"
                
                Close #1
                
                Do
                Led = 1
                Open File For Append As #1
                Print #1 , P
                Close #1
                Incr P þ
                Waitms 100
                Led = 0
                Wait 1
                Loop
                End

                دیدگاه


                  #9
                  پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

                  نوشته اصلی توسط بنیامین خلیلی






                  کد:
                  $regfile = "m64def.dat"
                   $crystal = 8000000
                  $baud = 1200
                  $hwstack = 128 $swstack = 128 $framesize = 128
                  Config Portb.7 = Output
                  Led Alias Portb.7
                  
                   $include "Config_MMC.bas" $include "Config_AVR-DOS.BAS"
                  Dim B As Byte
                  B = Initfilesystem(1)
                  If B <> 0 Then
                  Led = 1
                  
                  Stop
                  End If
                  Dim P As Byte
                  Dim File As String * 10
                  Dim Size As Long
                  Dim Size_str As String * 50 Dim Free As Long
                  Size = Disksize()
                  Free = Diskfree()
                  Size_str = "mmc" + Str(free) + " èç " + Str(size) + File = "log.txt"
                  Open File For Output As #1
                  Print #1 , "ben"
                  
                  Close #1
                  
                  Do
                  Led = 1
                  Open File For Append As #1
                  Print #1 , P
                  Close #1
                  Incr P þ
                  Waitms 100
                  Led = 0
                  Wait 1
                  Loop
                  End
                  خیلی ممنون
                  ولی من زبان C کار میکنم
                  کد C رو هم دارید؟

                  دیدگاه


                    #10
                    پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

                    بلدی با proteusکار کنی :nerd:

                    http://s5.picofile.com/file/8134696884/11_mmc.rar.html

                    دیدگاه


                      #11
                      پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و ب&#1575

                      بهترین راه استفاده از at24c16 هستش
                      قیمت 450 تومان
                      ضرفیت حافظه 16 kb


                      پروتکل ارتباطیtwi یا همون i2c

                      بهتیرین راه قبل نوشت عدد در 24c16 ضرب عدد در عدد صد هست

                      فرض: 23.22 که با ضرب در صد میشه 2322 بعد در 24c16 ذخیرش میکنیم.

                      موقع خوندن هم تقسیم بر صد میکنیم که میشه 23.22


                      محدودیت: ایسی 24c16 تنها یک میلیون بار میشه روش نوشت اما تعداد خوندن از روی اون بی نهایته.

                      .The best question deserves a better answer
                      =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
                      «پناه»می برم «به خدا»
                      از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
                      محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

                      دیدگاه


                        #12
                        پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

                        دوستمون یه راه خیلی ساده پیشنهاد دادن؛ شما اعداد اعشاری رو ضرب در 100 کنید و به صورت عدد صحیح در بیارید و بعد توی حافظه ذخیره ش کنید. خیلی هم آسونه. فکر نمی کنم هیچ سنسوری 0.01 درجه سانتیگراد رزولوشن دمایی داشته باشه!
                        بیایید با Google آشتی کنیم!

                        دیدگاه


                          #13
                          پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

                          راه که برای این کار زیاد هست .ولی نه ضرب در 100 !

                          یک راه ساده و شفاف استفاده از union و structure هست .

                          شما به عنوان یک برنامه نویس c خیلی کم پیش میاد که از استراکچر استفاده نکنید (اگر اینطور نیست تجدید نظر کنید)
                          حتی متغییر های بیتی هم میشه با بیت فیلد فقط یک بیت از حافظه eeprom شما بگیره

                          کد:
                          union {
                           struct {	
                               char   bit1:1;						
                               char   bit2:1;
                               float  fval1;
                               }mem;					
                          		char data[6];			
                          }mydata;
                          حالا با متغیر data به تمام اعضا دسترسی دارید;
                          از جمله ی رفتگان این راه دراز
                          باز آمده ای کو که به ما گوید راز
                          هان بر سر این دو راهه از روی نیاز
                          چیزی نگذاری که نمی آیی باز

                          دیدگاه


                            #14
                            پاسخ : پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و با

                            نوشته اصلی توسط •.´™ مَسِِــــح`.•
                            بهترین راه استفاده از at24c16 هستش
                            قیمت 450 تومان
                            ضرفیت حافظه 16 kb


                            پروتکل ارتباطیtwi یا همون i2c

                            بهتیرین راه قبل نوشت عدد در 24c16 ضرب عدد در عدد صد هست

                            فرض: 23.22 که با ضرب در صد میشه 2322 بعد در 24c16 ذخیرش میکنیم.

                            موقع خوندن هم تقسیم بر صد میکنیم که میشه 23.22


                            محدودیت: ایسی 24c16 تنها یک میلیون بار میشه روش نوشت اما تعداد خوندن از روی اون بی نهایته.
                            داده دریافتی از LM35 را باید در یک متغیر float بریزم
                            حالا من این داده رو ضربدر 100 کنم یا نکنم این عدد همچنان float میمونه و 4 بایت رو اشغال میکنه!

                            دیدگاه


                              #15
                              پاسخ : چگونه می توان یک عدد float را در 24C512 EEPROM ذخیره و بازیابی کرد؟

                              خوب اولا که وقتی ضرب کردید می تونید توی یه متغییر int کپی کنید !

                              و دوما کد های مورد نیاز تون که قول داده بودم :

                              کد:
                              #define MAX_TRIES 50
                              #define DS1307_ID  0xD0    // I2C DS1307 Device Identifier
                              #define DS1307_ADDR 0x00    // I2C DS1307 Device Address
                              #define I2C_START 0
                              #define I2C_DATA 1
                              #define I2C_DATA_ACK 2
                              #define I2C_STOP 3
                              #define ACK 1
                              #define NACK 0
                              
                              
                              
                              
                              
                              #define HOUR_24 0
                              #define HOUR_12 1
                              
                              #define EEPROM_ID  0xA0    // I2C 24AA128 EEPROM Device Identifier
                              #define EEPROM_ADDR 0x00    // I2C 24AA128 EEPROM Device Address
                              
                              
                              
                              void ShowDateTime();
                              
                              void FirstTime();
                              
                              
                              void EEpromWrite_Byte(unsigned int Address,char Data);
                              char EEpromRead_Byte(unsigned int Address);
                              void EEpromWrite_int(unsigned int Address,unsigned int Number);
                              unsigned int EEpromRead_int(unsigned int Address);
                              void EEpromWrite_float(unsigned int Address,float Number);
                              float EEpromRead_float(unsigned int Address);
                              int DataWrite(clsDataRecord objclsDataRecord,int& OutRad);
                              unsigned char i2c_transmit(unsigned char type);
                              char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type);
                              void i2c_stop(void);
                              char i2c_write(char data);
                              char i2c_read(char *data,char ack_type);
                              char *num2str(char number);
                              void Write_DS1307(void);
                              void Read_DS1307(void);
                              char bcd2dec(char num);
                              char dec2bcd(char num);
                              int i2c_writebyte(unsigned int i2c_address, unsigned int dev_id,unsigned int dev_addr,char data);
                              int i2c_readbyte(unsigned int i2c_address, unsigned int dev_id,unsigned int dev_addr, char *data);
                              void USARTInit(uint16_t ubrr_value);
                              
                              
                              
                              
                              
                              unsigned int CounterTimeView = 0;
                               
                              char ds1307_addr[7];
                              
                              char sdigit[3]={'0','0','\0'};
                              
                              char hour_mode, ampm_mode;
                              
                              
                              
                              int main(void)
                              {
                              
                              	LCD.LCDinit();
                              	LCD.LCDcursorOFF();
                              
                              
                              
                              	while(1)
                              	{
                              
                              		
                              			
                              
                              		{
                              			//FirstTime();  // for reset ds1307
                              
                              		
                              			ShowDateTime();
                              		}
                              
                              
                              
                              }
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              void ShowDateTime()
                              {
                              	// show date and time
                              	Read_DS1307();
                              	
                              	
                              	LCD.LCDclr();
                              	LCD.LCDGotoXY(0,0);
                              	LCD.LCDstring("Time : ");
                              	LCD.LCDGotoXY(8,0);
                              	LCD.LCDstring(num2str(ds1307_addr[2]));
                              	LCD.LCDGotoXY(10,0);
                              	LCD.LCDstring(":");
                              	LCD.LCDGotoXY(11,0);
                              	LCD.LCDstring(num2str(ds1307_addr[1]));
                              	
                              	LCD.LCDGotoXY(0,1);
                              	LCD.LCDstring("Date : ");
                              	LCD.LCDGotoXY(8,1);
                              	LCD.LCDstring(num2str(ds1307_addr[6]));
                              	LCD.LCDGotoXY(10,1);
                              	LCD.LCDstring("-");
                              	LCD.LCDGotoXY(11,1);
                              	LCD.LCDstring(num2str(ds1307_addr[5]));
                              	LCD.LCDGotoXY(13,1);
                              	LCD.LCDstring("-");
                              	LCD.LCDGotoXY(14,1);
                              	LCD.LCDstring(num2str(ds1307_addr[4]));
                              	fcpu_delay_ms(3000);
                              }
                              
                              
                              
                              
                              
                              
                              
                              
                              unsigned char i2c_transmit(unsigned char type)
                              {
                              	switch(type) {
                              		case I2C_START:  // Send Start Condition
                              		TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
                              		break;
                              		case I2C_DATA:   // Send Data with No-Acknowledge
                              		TWCR = (1 << TWINT) | (1 << TWEN);
                              		break;
                              		case I2C_DATA_ACK: // Send Data with Acknowledge
                              		TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
                              		break;
                              		case I2C_STOP:   // Send Stop Condition
                              		TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
                              		return 0;
                              	}
                              	// Wait for TWINT flag set on Register TWCR
                              	while (!(TWCR & (1 << TWINT)));
                              	// Return TWI Status Register, mask the prescaller bits (TWPS1,TWPS0)
                              	return (TWSR & 0xF8);
                              }
                              
                              char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type)
                              {
                              	unsigned char n = 0;
                              	unsigned char twi_status;
                              	char r_val = -1;
                              	i2c_retry:
                              	if (n++ >= MAX_TRIES) return r_val;
                              	// Transmit Start Condition
                              	twi_status=i2c_transmit(I2C_START);
                              
                              	// Check the TWI Status
                              	if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
                              	if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
                              	// Send slave address (SLA_W)
                              	TWDR = (dev_id & 0xF0) | (dev_addr & 0x07) | rw_type;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
                              	if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
                              	r_val=0;
                              	i2c_quit:
                              	return r_val;
                              }
                              
                              void i2c_stop(void)
                              {
                              	unsigned char twi_status;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_STOP);
                              }
                              
                              char i2c_write(char data)
                              {
                              	unsigned char twi_status;
                              	char r_val = -1;
                              	// Send the Data to I2C Bus
                              	TWDR = data;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              	r_val=0;
                              	i2c_quit:
                              	return r_val;
                              }
                              
                              char i2c_read(char *data,char ack_type)
                              {
                              	unsigned char twi_status;
                              	char r_val = -1;
                              
                              	if (ack_type) {
                              		// Read I2C Data and Send Acknowledge
                              		twi_status=i2c_transmit(I2C_DATA_ACK);
                              		if (twi_status != TW_MR_DATA_ACK) goto i2c_quit;
                              		} else {
                              		// Read I2C Data and Send No Acknowledge
                              		twi_status=i2c_transmit(I2C_DATA);
                              		if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
                              	}
                              	// Get the Data
                              	*data=TWDR;
                              	r_val=0;
                              	i2c_quit:
                              	return r_val;
                              }
                              
                              // Convert Decimal to Binary Coded Decimal (BCD)
                              char dec2bcd(char num)
                              {
                              	return ((num/10 * 16) + (num % 10));
                              }
                              
                              // Convert Binary Coded Decimal (BCD) to Decimal
                              char bcd2dec(char num)
                              {
                              	return ((num/16 * 10) + (num % 16));
                              }
                              
                              // Implementing integer value from 00 to 99
                              char *num2str(char number)
                              {
                              	unsigned char digit;
                              
                              	digit = '0';            // Start with ASCII '0'
                              	while(number >= 10)        // Keep Looping for larger than 10
                              	{
                              		digit++;             // Increase ASCII character
                              		number -= 10;          // Subtract number with 10
                              	}
                              
                              	sdigit[0]='0';           // Default first Digit to '0'
                              	if (digit != '0')
                              	sdigit[0]=digit;         // Put the Second digit
                              	sdigit[1]='0' + number;
                              	return sdigit;
                              }
                              
                              void Read_DS1307(void)
                              {
                              	char data;
                              	// DS1307 Register Address
                              	// Second: ds1307_addr[0]
                              	// Minute: ds1307_addr[1]
                              	// Hour : ds1307_addr[2]
                              	// Day  : ds1307_addr[3]
                              	// Date : ds1307_addr[4]
                              	// Month : ds1307_addr[5]
                              	// Year : ds1307_addr[6]
                              	
                              	// First we initial the pointer register to address 0x00
                              	// Start the I2C Write Transmission
                              	i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
                              	// Start from Address 0x00
                              	i2c_write(0x00);
                              	// Stop I2C Transmission
                              	i2c_stop();
                              
                              	// Start the I2C Read Transmission
                              	i2c_start(DS1307_ID,DS1307_ADDR,TW_READ);
                              	// Read the Second Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	ds1307_addr[0]=bcd2dec(data & 0x7F);
                              	// Read the Minute Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	ds1307_addr[1]=bcd2dec(data);
                              	// Read the Hour Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	if ((data & 0x40) == 0x40) {
                              		hour_mode = HOUR_12;
                              		ampm_mode=(data & 0x20) >> 5;  // ampm_mode: 0-AM, 1-PM
                              		ds1307_addr[2]=bcd2dec(data & 0x1F);
                              		} else {
                              		hour_mode = HOUR_24;
                              		ampm_mode=0;
                              		ds1307_addr[2]=bcd2dec(data & 0x3F);
                              	}
                              	// Read the Day of Week Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	ds1307_addr[3]=bcd2dec(data);
                              	// Read the Day of Month Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	ds1307_addr[4]=bcd2dec(data);
                              	// Read the Month Register, Send Master Acknowledge
                              	i2c_read(&data,ACK);
                              	ds1307_addr[5]=bcd2dec(data);
                              	// Read the Year Register, Send Master No Acknowledge
                              	i2c_read(&data,NACK);
                              	ds1307_addr[6]=bcd2dec(data);
                              	// Stop I2C Transmission
                              	i2c_stop();
                              }
                              
                              void Write_DS1307(void)
                              {
                              	unsigned char i, hour_format;
                              	// Make sure we enable the Oscillator control bit CH=0 on Register 0x00
                              	ds1307_addr[0]=ds1307_addr[0] & 0x7F;
                              	// Start the I2C Write Transmission
                              	i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
                              	// Start from Address 0x00
                              	i2c_write(0x00);
                              	// Write the data to the DS1307 address start at 0x00
                              	// DS1307 automatically will increase the Address.
                              	for (i=0; i<7; i++) {
                              		if (i == 2) {
                              			hour_format=dec2bcd(ds1307_addr[i]);
                              			if (hour_mode) {
                              				hour_format |= (1 << 6);
                              				if (ampm_mode)
                              				hour_format |= (1 << 5);
                              				else
                              				hour_format &= ~(1 << 5);
                              				} else {
                              				hour_format &= ~(1 << 6);
                              			}
                              			i2c_write(hour_format);
                              			} else {
                              			i2c_write(dec2bcd(ds1307_addr[i]));
                              		}
                              	}
                              	// Stop I2C Transmission
                              	i2c_stop();
                              }
                              
                              int i2c_writebyte(unsigned int i2c_address, unsigned int dev_id,unsigned int dev_addr,char data)
                              {
                              	unsigned char n = 0;
                              	unsigned char twi_status;
                              	char r_val = -1;
                              	i2c_retry:
                              	if (n++ >= MAX_TRIES) return r_val;
                              	// Transmit Start Condition
                              	twi_status=i2c_transmit(I2C_START);
                              
                              	// Check the TWI Status
                              	if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
                              	if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
                              	// Send slave address (SLA_W)
                              	TWDR = (dev_id & 0xF0) | ((dev_addr & 0x07) << 1) | TW_WRITE;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
                              	if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
                              	// Send the High 8-bit of I2C Address
                              	TWDR = i2c_address >> 8;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              	// Send the Low 8-bit of I2C Address
                              	TWDR = i2c_address;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              	// Put data into data register and start transmission
                              	TWDR = data;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              	// TWI Transmit Ok
                              	r_val=1;
                              	i2c_quit:
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_STOP);
                              	return r_val;
                              }
                              
                              int i2c_readbyte(unsigned int i2c_address, unsigned int dev_id,unsigned int dev_addr, char *data)
                              {
                              	unsigned char n = 0;
                              	unsigned char twi_status;
                              	char r_val = -1;
                              	i2c_retry:
                              	if (n++ >= MAX_TRIES) return r_val;
                              	// Transmit Start Condition
                              	twi_status=i2c_transmit(I2C_START);
                              
                              	// Check the TWSR status
                              	if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
                              	if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
                              	// Send slave address (SLA_W) 0xa0
                              	TWDR = (dev_id & 0xF0) | ((dev_addr << 1) & 0x0E) | TW_WRITE;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
                              	if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
                              	// Send the High 8-bit of I2C Address
                              	TWDR = i2c_address >> 8;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              	// Send the Low 8-bit of I2C Address
                              	TWDR = i2c_address;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	// Check the TWSR status
                              	if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
                              
                              	// Send start Condition
                              	twi_status=i2c_transmit(I2C_START);
                              	// Check the TWSR status
                              	if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
                              	if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
                              	// Send slave address (SLA_R)
                              	TWDR = (dev_id & 0xF0) | ((dev_addr << 1) & 0x0E) | TW_READ;
                              	// Transmit I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              
                              	// Check the TWSR status
                              	if ((twi_status == TW_MR_SLA_NACK) || (twi_status == TW_MR_ARB_LOST)) goto i2c_retry;
                              	if (twi_status != TW_MR_SLA_ACK) goto i2c_quit;
                              	// Read I2C Data
                              	twi_status=i2c_transmit(I2C_DATA);
                              	if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
                              	// Get the Data
                              	*data=TWDR;
                              	r_val=1;
                              	i2c_quit:
                              	// Send Stop Condition
                              	twi_status=i2c_transmit(I2C_STOP);
                              	return r_val;
                              }
                              
                              
                              
                              void FirstTime()
                              {
                              	ds1307_addr[0] = 0;
                              	ds1307_addr[1] = 6;
                              	ds1307_addr[2] = 23;
                              	ds1307_addr[3] = 6;
                              	ds1307_addr[4] = 16;
                              	ds1307_addr[5] = 8;
                              	ds1307_addr[6] = 92;
                              	Write_DS1307();
                              }
                              
                              
                              
                              
                              
                              
                              float EEpromRead_float(unsigned int Address)
                              {
                              
                              	char i;
                              	float data;
                              	fcpu_delay_ms(60);
                              	for (i = 0; i < 4; i++)
                              	{
                              		*((char*)&data + i) = EEpromRead_Byte(i + Address);
                              		fcpu_delay_ms(60);
                              	}
                              	return(data);
                              
                              }
                              
                              
                              
                              
                              void EEpromWrite_float(unsigned int Address,float Number)
                              {
                              
                              
                              	char i;
                              	fcpu_delay_ms(60);
                              	for (i = 0; i < 4; i++)
                              	{
                              		EEpromWrite_Byte(i + Address, *((char*)&Number + i) ) ;
                              		fcpu_delay_ms(60);
                              	}
                              
                              }
                              
                              
                              
                              
                              unsigned int EEpromRead_int(unsigned int Address)
                              
                              {
                              	
                              char theByteArray[2];
                              	fcpu_delay_ms(60);
                              	i2c_readbyte(Address,EEPROM_ID,EEPROM_ADDR,&theByteArray[0]);
                              	fcpu_delay_ms(60);
                              	i2c_readbyte(Address+1,EEPROM_ID,EEPROM_ADDR,&theByteArray[1]);
                              	fcpu_delay_ms(60);
                              	return (unsigned int)(((theByteArray[0] << 8)) | (unsigned int)((theByteArray[1] << 0)));
                              
                              }
                              
                              
                              
                              void EEpromWrite_int(unsigned int Address,unsigned int Number)
                              {
                              
                              	char theByteArray[2] = {(char)(Number >> 8), (char)(Number >> 0)};
                              	fcpu_delay_ms(60);
                              	i2c_writebyte(Address,EEPROM_ID,EEPROM_ADDR,theByteArray[0]);
                              	fcpu_delay_ms(60);
                              	i2c_writebyte(Address+1,EEPROM_ID,EEPROM_ADDR,theByteArray[1]);
                              	fcpu_delay_ms(60);
                              
                              }
                              
                              
                              
                              char EEpromRead_Byte(unsigned int Address)
                              {
                              	
                              	char Data ;
                              	fcpu_delay_ms(60);
                              	i2c_readbyte(Address,EEPROM_ID,EEPROM_ADDR,&Data);
                              	return Data;
                              
                              }
                              
                              
                              
                              void EEpromWrite_Byte(unsigned int Address,char Data)
                              {
                              	fcpu_delay_ms(60);
                              	i2c_writebyte(Address,EEPROM_ID,EEPROM_ADDR,Data);
                              }
                              اگر جایی از کد ها نیاز به توضیح داشت بفرمائید . شما می تونید با این کد ها به راحتی از آی سی حافظه و ساعت استفاده کنید .
                              فقط کافی است که نمایش روی lcd اون رو با کد های خودتون مچ کنید و برای استفاده از حافظه و آدرس دهی نیز یک متغییر پوینتر حافظه درست کنید که آدرس آخرین محل پر شده حافظه رو همیشه نگه داره و می تونید اون رو توی یه آدرس مثلا خیلی پائین یا خیلی بالا ذخیره کنید بطوری که دیتا هیچ وقت اونو پاک نکنه .
                              امیدوارم مشکل حل بشه . در ضمن توابعی هم برای ذخیره عدد اعشاری براتون گذاشتم . موفق باشید
                              - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .

                              دیدگاه

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