eeprom_read_XXXX( addresse + n )

Gast #2720856
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
}
Gast #2720863
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
Gast #2720957
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.
Gast #2722804
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

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