Structure Array ins EEPROM

OP #842414
Hallo zusammen,

ich möchte ein zweidimensionales Array Feld für Feld (Indizees [Rx][Ry]) 
ins EEPROM Mega128 schreiben und wieder Feld für Feld lesen:
--------------------------------------------------------------------

#define PBMP_X (2*134+1)
#define PBMP_Y (2*179+1)

extern  int16_t Rx, Ry;

struct Railway
    {uint8_t GlbNr;
     uint8_t Valid;
    };

extern struct Railway RailPointer [PBMP_X/15+1][PBMP_Y/15+1];
struct Railway eeRailPointer [PBMP_X/15+1][PBMP_Y/15+1] EEMEM;

void EEPROM_RP_write (struct Railway RailPointer[Rx][Ry])
{
eeprom_write_block(&RailPointer[Rx][Ry],&eeRailPointer[Rx][Ry],sizeof(st 
ruct  Railway));
}

void EEPROM_RP_read (struct Railway RailPointer[Rx][Ry])
{
  eeprom_read_block(&RailPointer[Rx][Ry],&eeRailPointer[Rx][Ry],sizeof(str 
uct  Railway));
}

-------------------------------------------------------

Irgendwie funzt das aber nicht - liegt der Fehler vielleicht irgendwo 
hier im Code ?

Vielen Dank für Eure Hilfe
Gast
@ Martin

extern struct Railway RailPointer [18.93333][24.93333];

Ach komm das sieht doch scheisse aus.
Möglicherweise wollte er [19][25], aber das kommt da
bei den Berechnungen halt nicht raus.
holger wrote:

> Ach komm das sieht doch scheisse aus.
> Möglicherweise wollte er [19][25], aber das kommt da
> bei den Berechnungen halt nicht raus.

Eigentlich hast Du recht. Aber andererseits: vielleicht hat Charly 
deshalb "+1" bei der Definition der Arraygröße angegeben?
Ohne weitere Info ist es jedenfalls ein Blick in die Glaskugel.
-Was "funzt" nicht?
-Was sollen diese Variablen abbilden (wie kommt man auf die Definition 
dieser Arraygröße)?
OP
Hallo,

erst mal Danke für die ersten Inputs. Die Indizees (deinitiv Integer) 
sind o.k. - das ist es nicht.

Mir kommt es mehr auf das Verständnis an, ob ich die EEPROM Strukturen 
richtig deklariert habe. Geht das so mit der Structure und dem Array 
bzw. seiner Felder ?

Kann ich also ein Array Feld für Feld ansprechen ? Stimmt dann die 
sizeof Abfrage ? Sind die EEPROM function calls richtig ?
> Kann ich also ein Array Feld für Feld ansprechen ?
Ja, denn das ist der Zweck eines Arrays.

> Stimmt dann die sizeof Abfrage ?
Ein "sizeof(Typname)" gibt die Größe des Typs zurück. Wenn die Funktion 
das an dieser Stelle erwartet: ja.

> Sind die EEPROM function calls richtig ?
Keine Ahnung. Kommt auf die Signatur der Funktionen und den Zweck an. 
Wenn die Funktionen Zeiger auf Elemente des Typs struct Railway erwarten 
und Rx, Ry vorhanden und initialisiert sind: ja.

Wie ist denn das genaue Fehlverhalten (Compilerfehler, 
LAufzeitfehler...)?

Außerdem habe ich ein Verständnisproblem mit der Definition von
> struct Railway eeRailPointer [PBMP_X/15+1][PBMP_Y/15+1] EEMEM;

Wofür steht das EEMEM: ohne das EEMEM wäre dies einfach ein 2-dim. Array 
namens eeRailPointer mit Elementen des Typs struct Railway. (Liegt 
vielleicht daran, daß ich selber selten mit Arrays of struct arbeite...)
OP
Also der Compiler zeigt 0 warnings und 0 errors. Programm läuft. Aber 
das, was ich speichere kann ich nicht wieder lesen (scheint verloren). 
Entweder habe ich fehlerhaft gespeichert, oder der Lesevorgang funzt 
nicht oder beides.

Muss man was an den Fuses verändenr ?
OP
Hallo zusammen,

vielleicht liest noch mal jemand mein Problem:

Witzigerweise klappt das Programm in der Simulation Studio einwandfrei 
(in den EEPROM Strukturen wird gespeichert) - nur der Mega128 tut nicht 
das was ich will.

Definitiv hat das EEPROM noch keine 100.000 Speicherzyklen hinter sich - 
mit dem EEPROM arbeite ich zum ersten Mal.

Was könnte das sein ? Soweit ich weiss werden die Interrupts doch in der 
AVR Library während der Schreib und Lesezyklen ausgeschaltet - oder ?

Bin echt ratlos - hatte schon jemand dieses Problem ?

Grüsse
OP
Also,

das Problem ist definitiv ein Problem des function Aufrufs - Übergabe 
Parameter !
Wenn ich ein einzelnes Byte ins EEPROM abspeichere und wieder lese, dann 
funzts.

Also, was ist bei der Structure Übergabe bei den function calls falsch ?

Leider bin ich mit structures wenig geübt. Ist die size-of Abfage o.k. - 
ich frage ja lediglich die Breite des Records ab - nicht die gesamte 
Array - Grösse - ist das o.k. so oder muss ich die gesamte Arraygrösse 
in size-of übergeben ?

Grüsse
OP
Charly Grosse wrote:
> Hallo zusammen,
>
> ich möchte ein zweidimensionales Array Feld für Feld (Indizees [Rx][Ry])
> ins EEPROM Mega128 schreiben und wieder Feld für Feld lesen:
> --------------------------------------------------------------------
>
> #define PBMP_X (2*134+1)
> #define PBMP_Y (2*179+1)
>
> extern  int16_t Rx, Ry;
>
> struct Railway
>     {uint8_t GlbNr;
>      uint8_t Valid;
>     };
>
> extern struct Railway RailPointer [PBMP_X/15+1][PBMP_Y/15+1];
> struct Railway eeRailPointer [PBMP_X/15+1][PBMP_Y/15+1] EEMEM;
>
> void EEPROM_RP_write (struct Railway RailPointer[Rx][Ry]) //<= Fehler !!
> {
> eeprom_write_block(&RailPointer[Rx][Ry],&eeRailPointer[Rx][Ry],sizeof(st ruct
> Railway));
> }
>
> void EEPROM_RP_read (struct Railway RailPointer[Rx][Ry]) //<= Fehler
> {
>   eeprom_read_block(&RailPointer[Rx][Ry],&eeRailPointer[Rx][Ry],sizeof(str uct
> Railway));
> }
>
> -------------------------------------------------------
>
> Irgendwie funzt das aber nicht - liegt der Fehler vielleicht irgendwo
> hier im Code ?
>
> Vielen Dank für Eure Hilfe

Fehler gefunden: (siehe Markierung <= Fehler (oben))

Offensichtlich wird hier ein neuer Speicherbereich im Funktionsaufruf 
vereinbart(der natürlich leer ist).
Wenn ich nämlich Pointer auf den externen Speicherbereich übergebe, 
funzt es.

Andere Möglichkeit (ungetestet) würde wahrscheinlich so lauten:
   void EEPROM_RP_read (extern struct Railway RailPointer[Rx][Ry])

Danke für Eure Mithilfe & Grüsse

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.