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

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