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?
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.
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
/** \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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
