Hi, Sorry, num should be STRU_SIZE.
But that's not the error I'm getting, It's just a typo while pasting a sample code here. In my actual code I did use STRU_SIZE (not num). On Wed, 10 Jun 2020 at 00:27, Dave Hansen <i...@hotmail.com> wrote: > You wrote > >>> eeprom_read_block((void *)&setPgm, (const void *)eepLoc, num) ; > > What is num? > > -=Dave > ------------------------------ > *From:* AVR-GCC-list <avr-gcc-list-bounces+iddw=hotmail....@nongnu.org> > on behalf of Royce Pereira <royc...@gmail.com> > *Sent:* Tuesday, June 9, 2020 8:18 AM > *To:* avr-gcc-list@nongnu.org <avr-gcc-list@nongnu.org> > *Subject:* Saving & retreiving a structure in eeprom > > Hi, > > The MPU is ATMega8. AVR-GCC version is 9.1.0 > I have a structure that I'm trying to save (& retrieve in eeprom). > Furthermore, it is to be saved in an indexed location in the eeprom from 0 > to 29. > The structure is 4 bytes in size. So total 127 bytes are used in EEPROM > //----------------------------------------- > #define EEP_START 7 //offset in EEPROM where my structure storage > starts. > > typedef struct > { > int temp ; > unsigned int time ; > } _pgm ; > > #define STRU_SIZE (sizeof(_pgm)) > > _pgm setPgm ; //create struct in RAM. > uint16_t eepLoc ; //holds address of EEPROM > uint8_t index ; //index to read from in EEPROM... > //---------------------------------------------------------- > //save struct from RAM to an indexed location in EEPROM... > void savPgm(char idx) > { > eepLoc = EEP_START + ((uint16_t)idx * STRU_SIZE) ; > > eeprom_write_block((const void *)&setPgm, (void *)eepLoc, STRU_SIZE) ; > > return ; > } > //------------------------------------------------------- > //Retreive struct from an indexed location in EEPROM.... > void getPgm(char idx) > { > eepLoc = EEP_START + ((uint16_t)idx * STRU_SIZE) ; > > eeprom_read_block((void *)&setPgm, (const void *)eepLoc, num) ; > > return ; > } > //------------------------------------------ > int main(void) > { > index = 5 ; > > setPgm.temp = 50 ; > setPgm.time = 10 ; > > savPgm(index) ; //example .. save in 6th location in EEPROM; > > //Now read the saved struct back from eeprom... > > // this reads back correctly.:- > setPgm.temp = eeprom_read_word((const uint16_t *)eepLoc) ; //eepLoc was > set before. > setPgm.time = eeprom_read_word((const uint16_t *)eepLoc + 1) ; > > //But this reads 0xFFFF for both elementss. (Why?):- > getPgm(index) ; //uses block-read function > > return 0 ; > } > //--------------------------------------------------------------- > The getPgm function uses the read block api but retreives garbage(0xFFFF); > What am I doing wrong ? > > Thank you! > -- > Best Regards, > > -- Royce Pereira > > -- > Best Regards, > > -- Royce Pereira > -- Best Regards, -- Royce Pereira