Forum: Mikrocontroller und Digitale Elektronik Daten in EEprom (ATMega64) schreiben und lessen


von Michael_SS (Gast)


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

von Oliver (Gast)


Lesenswert?

Michael_SS schrieb:
> Über Tipps wäre ich sehr erfreut.

Ohne Kenntnis des verwendeten Compilers kann dir da niemand was anders 
raten als:

RTFM - Das Handbuch zu deinem Compiler/Entwicklungssystem. Das steht das 
alles drin. Garantiert.

Oliver

von Michael_SS (Gast)


Lesenswert?

Mein Compiler ist Codevision.

von MitLeser (Gast)


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.

von dfdff (Gast)


Lesenswert?

habe gerade abgespritzt

von Michael_SS (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.