PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Permanent Speichern



blenderkid
21.05.2008, 14:15
Hi,

ich habe vor Daten zu speichern, die nach dem Neustart immer noch abrufbar sind. Geht das? Vielleicht mit dem EEprom? Ist der überhaupt schon drauf?

DIV blenderkid

sloti
21.05.2008, 15:11
Hi,

woeit ich weiß sollte das mit dem EEprom möglich sein, da er die daten behält auch wenn der Strom aus ist. Hier findest du eine beschreibung für eine AVR eeprom lib. http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

mfg
Erik

Dirk
21.05.2008, 15:56
Hallo blenderkid,

auf dem RP6 kann man Daten im EEPROM des ATMEGA32 speichern.
Auf der RP6Control M32 Platine kann man das auch und zusätzlich noch im externen SPI EEPROM (IC2).

Gruß Dirk

Besserwessi
21.05.2008, 18:16
Wenn es nur um einen Neustart durch den Reset pin geht, bleibt auch das normale RAM erhalten. Sonst ist das EEPROM die Lösung.

blenderkid
22.05.2008, 09:53
Ja, danke an alle.
Es klappt perfekt mit dem EEPROM

Danke blenderkid

blenderkid
22.05.2008, 15:35
hi, eine Frage noch,

kann ich keine größeren Zahlen als 255 in das EEPROM schreiben?

Dirk
22.05.2008, 18:08
kann ich keine größeren Zahlen als 255 in das EEPROM schreiben?
Doch, jede Größe die das EEPROM aufnehmen kann, also auch Int oder Long ...

Gruß Dirk

blenderkid
23.05.2008, 14:14
hi, nochmal ich habe noch ein Problem.
Kann man kein "int32_t"-Array machen, oder was ist hier das Problem



int32_t read_buffer[128];

void read_eeprom(void)
{SPI_EEPROM_readBytes(0, &read_buffer[0], 127);}


Ich bekomme beim Kompilieren den Fehler.

RP6Control_10_Move2.c: In function 'read_eeprom':
RP6Control_10_Move2.c:55: warning: passing argument 2 of 'SPI_EEPROM_readBytes' makes pointer from integer without a cast

Kann mir jemand weiter helfen?

DIV blenderkid

Dirk
23.05.2008, 19:41
Hallo blenderkid,

die RP6ControlLib Funktionen für das EEPROM können nur Bytes lesen oder speichern.
Wenn du 32-Bit Integer speichern willst, must du je Wert 4 Bytes abspeichern, d.h. den Int32_t-Wert zuerst in 4 Byte splitten und ins EEPROM speichern.
Zum Lesen must du die 4 Bytes nacheinander wieder aus dem EEPROM einlesen und in der 32-Bit-Variable ablegen.

Gruß Dirk

blenderkid
24.05.2008, 08:34
wie geht denn das?

DIV blenderkid

Dirk
24.05.2008, 12:13
Hallo blenderkid,

... wie geht denn das?
Z.B. mit einer Union:

union {
uint32_t bits;
struct {
unsigned byte_1 :8;
unsigned byte_2 :8;
unsigned byte_3 :8;
unsigned byte_4 :8;
};
} spi_transfer;

Damit würdest du mit:
spi_transfer.bits = meine32bitvar;
... deine 32-Bit-Variable in der Union ablegen.
Die 4 einzelnen Bytes (spi_transfer.byte_1 ... spi_transfer.byte_4) können dann ins EEPROM geschrieben werden.
Aus dem EEPROM können sie umgekehrt genauso wieder ausgelesen werden.

Eine andere Möglichkeit:
Schieben.
Byte_1 = meine32bitvar;
Byte_2 = (meine32bitvar >> 8 );
Byte_3 = (meine32bitvar >> 16);
Byte_4 = (meine32bitvar >> 24);

Gruß Dirk

blenderkid
24.05.2008, 19:15
Aus dem EEPROM können sie umgekehrt genauso wieder ausgelesen werden.


Wie macht man das umgekehrt? Anstatt ":8" muss jetzt was?

DIV blenderkid

Dirk
24.05.2008, 20:06
Wie macht man das umgekehrt? Anstatt ":8" muss jetzt was?
Die Union bleibt, wie sie ist.
Du tust nur die 4 Bytes aus dem EEPROM in spi_transfer.byte_x (x = 1..4) und kannst dann deinen 32-Bit-Wert so zurücklesen:
meine32bitvar = spi_transfer.bits;

Gruß Dirk