-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: EEPROM - Adresse

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826

    EEPROM - Adresse

    Anzeige

    Moin

    Also folgendes Problem: Ich will auf den EEPROM schreiben und lesen (so ein zufall aber auch...)

    Jetzt will ich nach dem Neustart wieder auf die selben Daten zugreifen. Dafür muss ich aber wissen welche Adresse die Daten haben. Und mein Problem ist jetzt, dass ich nciht weiß wie das mit den Adressen aussieht. Das Datenblatt hat mir da irgendwie nicht wirklich geholfen.

    Achja und noch was: Wenn ich mit eeprom_wirte_byte(adresse, inhalt) einen Wert schreibe, dann muss doch vorher noch kein Platz definiert sein müssen, oder irre ich mich da? So versteh ich nämlich diese Sonderheiten des EEPROM.

    Also meine eigentlcih Frage ums mal auf den Punkt zu bringen: Ich will bei jedem Start zuerst die ersten beiden Bytes im Speicher auslesen, weil ich mir gedacht habe, in diesen zu speichern, wo ich hinten weiter machen kann mit schreiben.
    Wenn ich die Daten dann auslese, dann setzte ich diesen "Pointer" wieder auf den Anfang und ich kann den Speicher wieder voll schreiben.

    Ich hoffe ihr habt verstanden was ich von euch will. Also wo fängt denn jetzt der Speicher im EEPROM an? Einfach bei 0x00? und ist dann das 2. Byte bei 0x08? oder wie ist das zu verstehen?

    Danke

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Du kannst
    1) Dir die Adressen der Daten selber raussuchen, also etwa schreiben (void*) 0x123
    2) Du kannst Daten ins EEPROM lokatieren:

    Code:
    #define EEMEM __attribute__ ((section (".eeprom")))
    
    foo_t foo_sram;
    foo_t foo1 EEMEM; 
    foo_t foo2 EEMEM = 
    {
       .member1 = 1,
       .member2 = 2
    };
    
    eeprom_read_block (&foo_sram, &foo1, sizeof (foo_t));
    foo_sram.member1 = eeprom_read_word (&foo2.member1);
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Moin

    Danke schon mal für deine Antwort. Ich glaube die habe ich auch verstanden. Allerdings beantwortet das meine Frage glaub ich noch nicht ganz so gut. Das Problem was ich hab, ist dass ich ja auch nach nem RESET wieder auf die selben Daten zugreifen will. Dann hab ich im Speicher die adresse von foo1 und foo2 nicht mehr, oder?
    Deswegen dachte ich mir, ich schreib die Ausgangsadresse meiner Daten immer an Speicherposition 0.

    Dann les ich dort immer den Pointer aus, wo cih den nächsten Wert im EEPROM hinschreiben muss.

    Hab cih da nen Denkfehler drin, oder bin cih nur zu blöd zu merken, dass du mir das schon beantwortet hast?

    Danke

    Andun

    Nachtrag:
    Hier mal mein Code bis jetzt:

    Code:
    adress = eeprom_read_word(0x00);
    #if DEBUG  
    uart_puts("Ich werde bei "); PrintInt(adress); uart_puts(" anfangen in den EEPROM zu schreiben.");
    #endif
    eeprom_write_byte((uint8_t*)adress, sek[0]); adress += 8;
    eeprom_write_byte((uint8_t*)adress, min[0]); adress += 8;
    eeprom_write_byte((uint8_t*)adress, hour[0]); adress += 8;
    eeprom_write_byte((uint8_t*)adress, date[0]); adress += 8;
    eeprom_write_byte((uint8_t*)adress, mon[0]); adress += 8;
    eeprom_write_byte((uint8_t*)adress, Sensordaten.luftdruck); adress += 8;
    eeprom_write_byte((uint8_t*)adress, Sensordaten.feuchte_komp); adress += 8;
    eeprom_write_byte((uint8_t*)adress, Sensordaten.temperatur_lin); adress += 8;
    eeprom_write_word(0x00, adress);
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    foo1 und foo2 stehen im EEPROM, die Adressen werden zur Compilezeit festgelegt, oder was meinst du?

    Wenn du so was machen willst, würde ich dir anraten, ne Struktur zu machen, wo das ganze Zeug drin ist, anstatt die Daten überall zu verstreuen.

    Zudem belegt ein Byte nur ein Byte im EEPROM, nichte derer 8.

    Evtl musst du auch was für die Konsistenz überlegen, wenn mitten im Schreiben des Saft ausgeschaltet wird.

    Daten kannst du auch im SRAM einen RESET überstehen lassen, wenn es kein PowerOn-RESET oder so ist. Beispiele dazu gibt es im GCC-Artikel.
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Code:
    typedef struct
    {
       uint8_t sec;
       uint8_t min;
       uint8_t hour;
       uint8_t mon;
       uint8_t year;
    } time_t;
    
    typedef struct
    {
        uint16_t luftdruck;
        uint16_t feuchte_komp;   
        uint16_t temperatur_lin;
    } sensor_data_t
    
    typedef struct
    {
       time_t time;
       sensor_data_t sensor;
    } mess_data_t;
    
    mess_data_t data;
    mess_data_t * pdataEE;
    
    pdataEE = (mess_data_t*) 0x2;
    
    eeprom_write_block (&data, pdataEE, sizeof (data));
    pdataEE++;
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Also, stimmt. Das mit den 8 Byte war ein denkfehler ... ich hab irgendwie in Bit gedacht ... ???

    Ne Struktur zu machen, ginge auch, hast recht. Aber mir geht es im Moment gar nciht um Sicherheit, ich will eigentlcih erstmal nur was funktionierendes auf die Beine stellen, da ich es etwas eilig habe. (Normalerweise würde ich das auch ordentlicher machen)

    Also, die Daten im SRAM überleben zu lassen ist mir nicht sicher genug, da die Daten bzw. die Adressen der Daten auch nach einer kompletten Trennung vom Strom noch da sein sollen.

    Also generell die Frage: Ist das denn möglich, so einfach bei 0x00 die Adresse zu hinterlegen und dann so zu benutzen?

    (Achja, ist der cast zu den Pointern so richtig mit (uint8_t*)adress ?)

    Danke

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    SO wie du adress benutzt, sollte es ohnehin vom Typ uint8_t* sein. Ansonsten kannst du bös auf die Nase fallen mit adress++ oder adress+=10. Zwar merkst du das nicht, weil du den Fehler beim Lesen und Schreiben machst, aber du hast dann viele "Löcher" in der EEPROM-Nutzung.

    Den EE-Routinen sollte es egal sein, da müsste auch ein void* gehen.
    Disclaimer: none. Sue me.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Aha, ok. Ich werde das ganze jetzt erstmal in ein Struct bauen, scheint doch irgendwie sicherer, aber muss ich jetzt eigentlcih die adress immer um 1 weiter zählen um zum nächsten byte zu kommen oder um 8? Also geht das in Byte oder Bit?

    Ich werde das ganze, aber dann jetzt gleich auch einfach mit adress += sizeof(struct Messung) machen. Dass sollte doch dann gehen, oder?

    In die Struktur tu ich dann die 8Bytes mit der Uhrzeit und den Messdaten.

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Die Semantik von

    blah_t * pointer;
    int n;

    pointer += n; // Das ist (wenn man pointer als int ansieht) pointer += n*sizeof (blah_t)

    Ist Pointer also ein Zeiger auf long und steht pointer auf 0x9, dann steht er nach point++ auf 0xd (zumindest auf avr).
    Disclaimer: none. Sue me.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Achsoooooo, also zeigt der Pointer wenn ich ihn um 1 hochzähle auf den nächsten Wert, wenn man annimmt, dass alle gleich groß sind.

    (Mein Satz klingt wahrscheinlich bescheuert, aber ich bin mir sicher, dass ich es verstanden habe. Erklären können muss cih es ja nciht unbedingt )

    Gut, dann leg ich jetzt die Struktur an und speichere diese und erhöhe dann den Pointer (der ein Pointer auf diese Struktur ist) um 1. Dann zeigt der zeiger direkt hinter die Struktur im Speicher.

    So, das ist doch endlcih richitg verstanden oder?
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •