PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eeprom 24C16 unverständliches problem



_maddin
06.08.2009, 08:54
hallo zusammen
ich hab ein seltsames problem beim schreiben eines 24C16 eeproms. mit diesem code


...
failed=0;
for(address=2047;address!=0;address--)
{
if(EEWriteByte(address,77)==0)
{
//Write Failed
uart0_puts("Write Failed !");
uart0_puts("Addess = ");
uart0_puts((char*)itoa(address,buf,10));
failed=1;
Wait();
break;
}
}

if(!failed)
uart0_puts("Written 2048bytes");

Wait();

uart0_puts("Verifying ...");

//Check if every location in EEPROM has
//number 77 stored
failed=0;
for(address=2047;address!=0;address--)
{
if(EEReadByte(address)!=77){
uart0_puts("Read Failed !");
uart0_puts("Addess = ");
uart0_puts((char*)itoa(address,buf,10));
failed=1;
Wait();
break;
}
}

if(!failed)
{
uart0_puts("Write Success !");
}
...

kann das komplette eeprom beschreiben und bekomme ein "Write Success!". wenn ich aber anstelle von
"for(address=2047;address!=0;address--)"
das hier schreibe:
"for(address=0;adress<2048;adress++)"
funktioniert es nicht. woran kann das liegen? ist doch dem eeprom egal ob ich ihn "von unten nach oben" so wie im beispielcode oder umgekehrt beschreibe...
was ist da los?
lg martin

sast
06.08.2009, 09:46
Du verwendest in der 2. For schleife zwei verschiedene Variablen (address und adress). Ist das nur hier ein Schreibfehler?

Wenn ja, wäre noch interessant was du in der Schleife machst.

Edit: sorry, habe irgendwie den Codeteil ignoriert. Bleibt also nur der erste Hinweis übrig

sast

_maddin
06.08.2009, 10:26
jo du hast recht aber das war nur nen schreibfehler beim tippen. im code hab ich address stehen. "adress" gibt es garnicht, da würde auch mein compiler meckern.
lg

sast
06.08.2009, 10:30
Was genau funktioniert denn nicht?
Kannst du mal genau den Code hier rein "kopieren", wenn es nicht funktioniert?

sast

_maddin
06.08.2009, 11:07
was nicht funktioniert? ich bekomme nicht die meldung vom mc "Write Success !". ich hab mir daraufhin mal den speicherinhalt des eeproms ausgeben lassen und gesehen, dass nur die letzten 256bytes beschrieben sind mit 77 und der rest mit 0xFF.
wenn ich
"for(address=2047;address!=0;address--)"
und nicht
"for(address=0;adress<2048;adress++)"
dann ist der gesamte speicherinhalt 77, so wie ich es möchte.

sast
06.08.2009, 11:14
Wie wäre es denn mal mit der "Copy and Paste" Kopie des fehlerhaften Codes?

Zur Zeit hab ich nur wieder die adress Variante

sast

_maddin
06.08.2009, 13:15
sry! hier kommt er.


int main(void)
{
char buf[5];
//Varriables
uint8_t failed;
short address;
uart0_init(BAUD(38400));
uart0_puts("uart0 ready");
//Init EEPROM
EEOpen();
_delay_ms(10);

failed=0;
for(address=0;address<2048;address++)
{
if(EEWriteByte(address,77)==0)
{
//Write Failed
uart0_puts("Write Failed !");
uart0_puts("Addess = ");
uart0_puts((char*)itoa(address,buf,10));
failed=1;
Wait();
break;
}
}

if(!failed)
uart0_puts("Written 2048bytes");

Wait();

uart0_puts("Verifying ...");

//Check if every location in EEPROM has
//number 77 stored
failed=0;
for(address=0;address<2048;address++)
{
if(EEReadByte(address)!=77){
uart0_puts("Read Failed !");
uart0_puts("Addess = ");
uart0_puts((char*)itoa(address,buf,10));
failed=1;
Wait();
break;
}
}

if(!failed)
{
uart0_puts("Write Success !");
}
else
for(address=0;address<2048;address++)
uart0_puts((char*)itoa(EEReadByte(address),buf,10) );

while(1);

sast
06.08.2009, 15:06
was kommt denn für eine Ausgabe bevor eigentlich das Write Success kommen müsste?
Read Failed ! Addess = 0

Kannst du die gesamte Ausgabe auch mal posten?

Der Code sieht bis auf das short, was sicher ein 16 Bit signed integer ist soweit nicht schlecht aus. Glaube zwar nicht, dass das eine Auswirkung hat, da du nicht über 32768 kommst, aber mach da mal ein unsigned int draus.

Man müsste wissen wie deine Funktionen EEWriteByte und EEReadByte aussehen. Vielleicht braucht der EEPROM die Adresse ja anders als du sie ihm gibst. Obwohl dann wenigstens Adresse 0 noch beschrieben werden sollte.

Beim Schreiben von 2047 bis 1 kannst du dir ja mal probeweise die Ausgabe von 1 nach 2047 geben lassen. Zum Test ob er wirklich alles geschrieben hat.

sast

lorcan
06.08.2009, 18:47
Wenn du rückwärts schreibst wird die Adresse 0x00 nicht beschrieben, da "address!=0", liegt es evtl. daran, dass das keine gültige Adresse ist?
Du also von 1 bis 2048 schreiben musst?
MfG Lorcan

sast
06.08.2009, 20:51
Dann sollte er aber wenigstens beim Schreiben eine Fehlermeldung bekommen. Deshalb wäre ja auch der Code zu den Funktionen mal interessant. Das ist auch der Grund warum ich ihn von 1 bis 2047 lesen lassen möchte nachdem von 2047 bis 1 geschrieben wurde.
Ich bin bisher noch nicht so recht überzeugt, das die Rückwertsvariante 100%ig funktioniert.

sast