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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.