Daten in EEprom (ATMega64) schreiben und lessen

Gast #2362300
Lesenswert?

Hallo zusammen.

Ich habe eine generelle Frage zur Vorgehensweise beim Daten- Speichern 
und Lesen in / aus dem internen EEprom eines ATMega64.

Ich habe folgende Struktur angelegt die ich im EEprom speichern möchte:

#include <stdio.h>

eeprom struct teMesswerte1{
            unsigned int  counter;
            unsigned char Wert1;
            unsigned char Wert2;
            unsigned char Wert3;
            unsigned char Wert4;
            unsigned char Wert5;
            unsigned char Wert6;
            unsigned char Wert7;
            unsigned char Wert8;
        };

// Danach lege ich die Adresse im EEprom fest auf der diese
// Daten gespeichert werden sollen und wie oft:

// Variablen im internen EEPROM

#asm
        .eseg
        .org 0x0000
#endasm
eeprom struct teMesswerte1 Messwerte1[20]={0}; // Anzahl der zu
                                               //speichernden Strukturen
eeprom byte index = 0;                         // Anzahl der Messwerte
                                               //dahinder

void Datenspeichern()
{
 Messwerte1[index].counter = index;
 Messwerte1[index].Wert1 = a;
 Messwerte1[index].Wert2 = b;
 Messwerte1[index].Wert3 = c;
 Messwerte1[index].Wert4 = d;
 Messwerte1[index].Wert5 = e;
 Messwerte1[index].Wert6 = f;
 Messwerte1[index].Wert7 = g;
 Messwerte1[index].Wert8 = h;
 index++;
 if (index > 20) index = 0;             // bei erreichtem Maximum werden
                                        // die ersten Daten wieder
                                        // überschrieben (Ringpuffer)

}

void main ()
{
 .....
 // irgendwo hier werden die Messwerte erzeugt
 Datenspeicner();  // und dann abegspeichert
}

///////////////////////////////////////////////

Nun meine Frage.
Wenn ich die Daten aus dem EEprom per PC / Schnittstelle nun auslesen 
möchte, ist es möglich die Daten direkt zu lesen?
Z.B.:

UDR0 = Messwerte1[index].counter;

Oder kann ich das nur indirekt machen per Pointer?

byte *Pointer;
Pointer = &Messwerte1[0];
do{ UDR0 = Pointer;
    Pointer++;
}
while(1);

Oder muss die Struktur erst in den RAM geladen werden?
Weiß hier jemand bescheid?
Über Tipps wäre ich sehr erfreut.
Danke
Gast #2362334
Lesenswert?

du hast die Frage eigentlich schon selbst beantwortet.
In der Fkt. Datenspeichern() legst Du die Werte direkt im Eeprom ab.
Also kannst Du sie auch direkt aus dem Eeprom lesen, z.Bsp. mit
UDR0 = Messwerte1[index].counter;
Der Compiler macht die ganzen Eeprom Schreib- bzw. Lesevorgänge
im "Hintergrund". Kannst ja mal im Assemblerfile nachsehen was der
Compiler daraus macht.
Gast #2362369
Lesenswert?

@MitLeder

Ok, danke.
Ja hast du eigentlich recht. Werde ich dann auch so machen.

@dfdff: danke das wollte keiner wissen. Dafür gibt es genug andere 
Möglichkeiten im Netz - oder du bist p genug um in diesem Forum solche 
Bemerkugen zu machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren