Přístup do EEPROM AT89C51ED2 - nelze zapsat data z XRAM

Zdravim,

resim ted problem zapisu do interni EEPROM, mam kod, kterej funguje, ale nemuzu zapsat data ktery jsou v promenne, ktera je v XRAM (aspon si to myslim :slight_smile: )

[code]void write_eeprom(unsigned int adr,unsigned char value){
bit ea_help;
while(EECON & 0x01){

}
ea_help=EA;	//ulozime si bit ea
EA=0;
EECON |= 0x02;
*(unsigned char xdata*)adr=value;
EECON |= ~0x02;
EA=ea_help;

}[/code]

Takhle vypada funkce, tohle funguje:

write_eeprom(0x00,0x99);

tohle taky funguje:

unsigned int x; x=0x00; write_eeprom(x,0x99);

tohle uz nefunguje:

unsigned char xdata coords[3][2][10]; unsigned int x; coords[0][0][0]=0x99; x=0x00; write_eeprom(x,coords[0][0][0]);

Respektive funguje to pouze pro prvni clen toho pole (zapisuju ty data v cyklu), pro
coords[0][0][1];

uz mi to zapise pouze 0xFF, zkousel jsem vytvorit pomocnou promenou ktera neni v XRAM a prevest do ni hodnotu z coords a pote ji zapsat ale taky nejde.

URcite to bude jenom nejaka kravinka ale resim to tady cely odpoledne :slight_smile:

:arrow_right: administrator: přejmenováno z "Přístup do interní EEPROM at89C51ED2"

S tou pomocnou proměnnou by to chodit mělo. Zkus ji deklarovat jako volatile aby ji překladač nemohl vyhodit.

Zkus ještě přidat závorky ((unsigned int xdata)adr)=value;

Diky, ted nemam sanci vyzkouset ale ve stredu dam vedet jak jsem dopad.

BTW. Ta stabilita serveru je posledni dobou desna, hodne casto se mi stranky vubec nenactou.

Tak jsem to dnes testoval a bohuzel se nepodarilo :frowning: Zkousel jsem jak zavorky tak pouzit to volatile.

Nasel sem tento link kde se pise mimo jine:

The instruction EECON = 0x02 disables the on-chip XDATA RAM, so it is no longer available. Therefore the code may fetch unpredictable values from the overlaying EEPROM space.

Takze opravdu bude asi nutne prevest tu hodnotu do RAM, ale nedari se mi na to prijit :frowning:

Co je dost divne je ze kdyz to zapisuju timto cyklem, prvni hodnota se na pozici 0x00 vzdy zapise pote uz nic:

[code]
unsigned int x;
unsigned char p;
x=0x00;
for(i=0;i<coords_count;i++){
for(j=0;j<2;j++){
for(k=0;k<coords_num;k++){
//pokud neni souradnice zadana
if(coords*[j][k]==0x00){
write_eeprom(x,0xFF);
}
else{
p=coords*[j][k];
write_eeprom(x,p);

						}
						x+=1;
				}
			  }
			}[/code]**