Forum: Mikrocontroller und Digitale Elektronik eeprom_read_XXXX( addresse + n )


von Schiko (Gast)


Lesenswert?

Moin moin,

ich bin etwas überrascht, dass die variable Adressangabe
in eeprom_read_dword nicht funktioniert:
Wenn sequenzNr==0 bekomme ich die den richtigen Wert
aus dem Eeprom, ansonsten -1 !?
Die Daten im Eeprom werden mit dem AVR-Studio geschrieben.

Hat jemand eine Erklärung dafür?
(Tiny13A)
1
#define MAX_SEQUENZEN 8
2
3
...
4
5
EEMEM  uint8_t m_SequenzNr ;
6
EEMEM  uint8_t m_Dummy_3;
7
EEMEM  uint32_t m_Sequenz0 ;
8
EEMEM  uint32_t m_Sequenz1 ;
9
EEMEM  uint32_t m_Sequenz2 ;
10
EEMEM  uint32_t m_Sequenz3 ;
11
EEMEM  uint32_t m_Sequenz4 ;
12
EEMEM  uint32_t m_Sequenz5 ;
13
EEMEM  uint32_t m_Sequenz6 ;
14
EEMEM  uint32_t m_Sequenz7 ;
15
16
...
17
18
static inline void ReadEEPROM()
19
{
20
   uint32_t* pAdd;
21
   g_nSequenzNr = eeprom_read_byte(&m_SequenzNr);
22
   if( g_nSequenzNr >= MAX_SEQUENZEN )
23
      g_nSequenzNr = 0;
24
//   pAdd = &m_Sequenz0 + g_nSequenzNr*4;    //liefert Müll
25
//   g_curSequenz = eeprom_read_dword(pAdd); //
26
27
// die Alternative per switch funktioniert:
28
   switch( g_nSequenzNr )
29
   {
30
     case 0: g_curSequenz = eeprom_read_dword(&m_Sequenz0);break;
31
     case 1: g_curSequenz = eeprom_read_dword(&m_Sequenz1);break;
32
     case 2: g_curSequenz = eeprom_read_dword(&m_Sequenz2);break;
33
     case 3: g_curSequenz = eeprom_read_dword(&m_Sequenz3);break;
34
     case 4: g_curSequenz = eeprom_read_dword(&m_Sequenz4);break;
35
     case 5: g_curSequenz = eeprom_read_dword(&m_Sequenz5);break;
36
     case 6: g_curSequenz = eeprom_read_dword(&m_Sequenz6);break;
37
     case 7: g_curSequenz = eeprom_read_dword(&m_Sequenz7);break;
38
   }
39
}

von Oliver (Gast)


Lesenswert?

Schiko schrieb:
> ich bin etwas überrascht, dass die variable Adressangabe
> in eeprom_read_dword nicht funktioniert:

Variable Adressangabe funktioniert schon, aber nicht so, wie du das 
versucht hast.

Lies die nochmals genau durch, was eeprom_read_byte macht. Wenn du einen 
Wert aus dem eeprom als Eingangsparameter für eeprom_read_byte verwenden 
möchtest, musst du den vorher auch aus dem eeprom auslesen, natürlich 
ebenfalls mit eeprom_read_byte ...

Oliver

von Achim M. (minifloat)


Lesenswert?

Schiko schrieb:
> ansonsten -1

0xFFFFFFFF ist im Zweierkomplement -1.
In einem jungfräulichen, gelöschten EEPROM steckt in jeder Speicherzelle 
eine 1. Also wird brav 0xFFFFFFFF gelesen, wenn du das einfach in eine 
Signed-Variable speicherst, ergibt das eben -1.
mfg mf

von Rolf Magnus (Gast)


Lesenswert?

Schiko schrieb:
> EEMEM  uint32_t m_Sequenz0 ;
> EEMEM  uint32_t m_Sequenz1 ;
> EEMEM  uint32_t m_Sequenz2 ;
> EEMEM  uint32_t m_Sequenz3 ;
> EEMEM  uint32_t m_Sequenz4 ;
> EEMEM  uint32_t m_Sequenz5 ;
> EEMEM  uint32_t m_Sequenz6 ;
> EEMEM  uint32_t m_Sequenz7 ;

Wieso machst du daraus kein Array?

> //   pAdd = &m_Sequenz0 + g_nSequenzNr*4;    //liefert Müll

Warum *4? Damit überspringst du ja immer 3 Werte.

> // die Alternative per switch funktioniert:
>    switch( g_nSequenzNr )
>    {
>      case 0: g_curSequenz = eeprom_read_dword(&m_Sequenz0);break;
>      case 1: g_curSequenz = eeprom_read_dword(&m_Sequenz1);break;
>      case 2: g_curSequenz = eeprom_read_dword(&m_Sequenz2);break;
>      case 3: g_curSequenz = eeprom_read_dword(&m_Sequenz3);break;
>      case 4: g_curSequenz = eeprom_read_dword(&m_Sequenz4);break;
>      case 5: g_curSequenz = eeprom_read_dword(&m_Sequenz5);break;
>      case 6: g_curSequenz = eeprom_read_dword(&m_Sequenz6);break;
>      case 7: g_curSequenz = eeprom_read_dword(&m_Sequenz7);break;
>    }
> }

Hier überspringst du auch keine Werte.

von Schiko (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Wieso machst du daraus kein Array?

Weil ich mir so auf einfache Weise per Block-Copy und
mit 'nem anderen Programm von mir eine editierbare Eeprom-Hex-Datei 
erzeugen kann. Da im Speicher ja keine Padding-Bytes eingefügt
werden, kann ich ja trotzdem die Werte durchiterieren...
vorausgesetzt ich machs richtig :-)

>> uint32_t* pAdd;
>> ..
>> //   pAdd = &m_Sequenz0 + g_nSequenzNr*4;    //liefert Müll
> Warum *4? Damit überspringst du ja immer 3 Werte.

Weil ich Idiot die ganze Zeit einen Byte-Pointer im Kopf hatte!!
Das war es natürlich :-)

Grüße
Schiko

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.