čtení a zápis do eeprom u Atmegy128

Zdravim programátoři,
potřeboval bych poradit s eeprom pamětí u atmegy128.
Pro zápis do eeprom a čtení z eeprom používám tyto funkce, které jsou napsaná v datasheetu atmegy128.

//cteni z eeprom
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write /
while(EECR & (1<<EEWE));
/
Set up address register /
EEAR = uiAddress;
/
Start eeprom read by writing EERE /
EECR |= (1<<EERE);
/
Return data from data register */
return EEDR;
}

// zapis do eeprom
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write /
while(EECR & (1<<EEWE));
/
Set up address and data registers /
EEAR = uiAddress;
EEDR = ucData;
/
Write logical one to EEMWE /
EECR |= (1<<EEMWE);
/
Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

no a když pak v hlavní smyčce napíšu
EEPROM_write(0x00,0x01); // skoc na zacatek pameti a zapis 0x01
delay_ms(100);
x = EEPROM_read(0x00); // uloz do x hodnotu dat pameti na pozici 0x00

a pak chci vytisknout x na display ale porad mi to vypisuje hodnotu 255
jako by nefungoval vubec ten zapis do eeprom
nevedel by nekdo kde je problem?
diky za rady

Zasilam priklad ktery funguje pro ATMega8, nevidim duvod, proc by nemel fungovat pro tvoje AVR.
Bohuzel je tam implementovana knihovna pro 2-radkove LCD, ktera se mi nechce vykopavat.
Knihovna je stazena ze stranek od Petera Fleuryho.
Principem je pouziti knihovny eeprom.h, ktera je obsazena v AVR studiu.

#define F_CPU 8000000UL

#include <avr/eeprom.h>;
#include <util/delay.h>
#include "lcd.h"


unsigned char i;

//store initial byte to eeprom

uint8_t EEMEM eeprombyte=0x10;

//store initial word to eeprom

uint16_t EEMEM eepromword=0x5555;

//store string to eeprom

uint8_t EEMEM eepromstring[5]={"Test\0"};

int main(void)

{

//RAM byte variable

uint8_t RAMbyte;

//RAM word variable

uint16_t RAMword;

//RAM array of bytes

uint8_t RAMstring[5];

//read byte from EEPROm and store to RAM

RAMbyte = eeprom_read_byte(&eeprombyte);

//read word from EEPROM and store to RAM

RAMword = eeprom_read_word(&eepromword);

//copy string fro mEEPROM to RAM

eeprom_read_block ((void *)&RAMstring, (const void *)&eepromstring,5);
	char buffer[8];
	lcd_init(LCD_DISP_ON); /* initialize display, cursor off */
	lcd_clrscr();
	lcd_gotoxy(0,0);
	lcd_puts("RoBoProG");
	lcd_gotoxy(0,1);
	lcd_puts("Run:");
	for (i=3;i>0;i--)
	{
		sprintf(buffer,"%2i",i);
		lcd_gotoxy(4,1);
		lcd_puts(buffer);
		_delay_ms(1000);
	}
	lcd_clrscr();

	lcd_puts(RAMstring);
	sprintf(buffer,"%i",RAMbyte);
	lcd_gotoxy(5,0);
	lcd_puts(buffer);
	sprintf(buffer,"%i",RAMword);
	lcd_gotoxy(0,1);
	lcd_puts(buffer);


return (0);

}

Zapis do EEprom se prirozene provede prikazem

    	eeprom_write_word(&eepromword,servo);

kde v promenne servo je hodnota word.

Toby:
unsigned int je 16bit neznaménkové číslo. Zkoušel jsi adresu 0x0000? Případně si tam můžeš zkusit něco zapsat programátorem a v programu to jen přečíst nebo obráceně na vyzkoušení funkcí. DS jsem zatím nezkoumal…

Zkusil jsem ručně zapsat do eeprom paměti a následně přečíst hodnotu a podařilo se.
Bohužel když to zadám v programu tak to vypíše hodnotu , která je nastavená v eeprom při programování součástky. :frowning:

Keby si cital dadta sheet nedoporucuje sa pouzivat ADresu eeprom 0x00 to len na okraj.

Ta adresa je ohrožena jen přepsáním při startu mcu, když ji použije v rámci jednoho běhu programu, měla by makat…

jo to jsem četl, že se přitom resetu něco děje, ale ono to nazapisuje ani na jinou adresuv eeprom

bylo to špatnou optimalizací překladače a pomohla náhrada výrazů
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);

za

#asm
SBI 0x1C,2
SBI 0x1C,1
#endasm