Forum: Mikrocontroller und Digitale Elektronik EEPROM Verständnis


von ArduStemmi (Gast)


Angehängte Dateien:

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?

von Arduinoquäler (Gast)


Lesenswert?

ArduStemmi schrieb:
> Dabei stelle ich fest, dass die Daten, die
> ich ab Speicherstelle 0 speichere, tatsächlich erst ab Speicherstelle 32
> gespeichert werden.

Das solltest du mit Programmcode belegen.

von ArduStemmi (Gast)


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

von Arduinoquäler (Gast)


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.

von ArduStemmi (Gast)


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!

von ArduStemmi (Gast)


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.

von TestX (Gast)


Lesenswert?

Die adresse sollte uint16_t sein und vorher explizit auf uint8_t* 
gecastet werden...
Schau dir außerdem mal die werte an, die dein programm erzeugt 
(debugausgabe...)

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.