EEPROM Verständnis

Gast #4782294
Lesenswert?
• ▲
▼
Guten Abend,

während ich so für mich hin programmiere, stelle ich seltsames Verhalten 
beim Speichern und Lesen ins und aus dem EEPROM fest. Es geht um 
ATmega644PA mit 2048 Byte EEPROM. Ich habe den EEPROM ausgelesen um mir 
die eep Datei anzuschauen. Dabei stelle ich fest, dass die Daten, die 
ich ab Speicherstelle 0 speichere, tatsächlich erst ab Speicherstelle 32 
gespeichert werden.
Weil ich mit dem Intel Hex Format nicht vertraut bin, habe ich mir eine 
Routine geschrieben, die den EEPROM ausliest und über UART an den lieben 
Computer ausgibt.
Daten angeguckt, wieder dasselbe: Die Daten, die ich an Speicherstelle 0 
vermute, lungern an Speicherstelle 32 rum.

Muss das so sein? Sind die ersten 32 Bytes vielleicht ein Bootsektor? 
Oder reserviert für einen Bootmanager? Oder hat die NSA die Hände im 
Spiel und kann alle ersten 32 Bytes aller jemals gebauten 
Mikrocontroller auslesen, oder, die unwahrscheinlichste Variante, habe 
ich nur keine Ahnung?
Angehängte Dateien:
Gast #4782306
Lesenswert?
• ▲
▼
1
          case COMMAND_SAVE:
2

3
            F1 = parameter - 1;    /* Welcher Wert (OFF-Value oder Standard Value oder Alternative Value! */
4
            F2 = LAMP_Number -1;  /* Welche Lampe */
5
                      
6
            for (uint8_t i = 0; i < 6; i++)
7
            {
8
              int adr = F1 * 18 + F2 * 6 + i;
9
              uint8_t value = receivedBytes[i + 4];
10
              eeprom_update_byte(adr, value);
11
            }
12
                      
13
            eeprom_read_block (PWM_Values_OFF, 0x00, sizeof(PWM_Values_OFF));
14
            eeprom_read_block (PWM_Values_STD, 0x12, sizeof(PWM_Values_STD));
15
            eeprom_read_block (PWM_Values_AKT, 0x24, sizeof(PWM_Values_AKT));
16

17
            SendToLamps();
18

19
          break;

Wobei F1 die Werte 0, 1, 2 annehmen kann und F2 die Werte 0, 1, 2.

Adresse = F1*18 + F2*6 + i, für F1 = F2 = i = 0 wird Adresse = 0
Gast #4782333
Lesenswert?
• ▲
▼
/** \ingroup avr_eeprom
    Update a byte \a __value to EEPROM address \a __p.
 */
void eeprom_update_byte (uint8_t *__p, uint8_t __value);

Die Funktion verlangt einen Pointer auf eine EEPROM Variable
die du sinngemäss (z.B.) wie folgt definieren müsstest:

uint8_t  EEMEM  eeprom_byte[32];

Das klappt mit int addr sicherlich nicht.
Gast #4782346
Lesenswert?
• ▲
▼
Du hast fast Recht! Bein kompilieren kommen regelmäßig Hinweise, dass 
hier ein Zeiger das Mittel der Wahl wäre! Aber wenn man damit leben 
kann, dass man Hinweise überhört geht es trotzdem. (Bin ich übrigens 
dank eines Schreibfehlers draufgekommen!)

Aber: ich werde es freilich ändern, nur hat es nichts mit meinem Problem 
zu tun!
Gast #4782352
Lesenswert?
• ▲
▼
Im Übrigen: Die Daten tauchen ab Stelle 36 auf, was die Sache jetzt 
schlagartig erklärbar macht. Die receivedValues sind bei F1 = 0 oder 1 
tatsächlich 0xFF. Wer richtig zählt ist klar im Vorteil.

Danke dennoch für Euer mitdenken.

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.