EEPROM Offset

OP #851428
Lesenswert?

Hallo,

heute muß ich aber wieder viel fragen :)

Ich versuche gerade ein paar Sachen im Eeprom zu speicher und wieder zu 
lesen. Leider klappt das nicht wirklich, aber hier erst mal der Code:
1
#define   EE_DUMMY     0x000  // Dummyelement (Adresse 0 sollte nicht genutzt werden)
2
#define   EE_IP0        0x001  // Eine Bytevariable  
3
#define   EE_IP1        0x002 
4
#define   EE_IP2        0x003
5
#define   EE_IP3  0x004 
6
#define   EE_HOSTIP0  0x005
7
#define   EE_HOSTIP1  0x006
8
#define   EE_HOSTIP2  0x007
9
#define   EE_HOSTIP3  0x008
10
#define   EE_NETMASK0  0x009
11
#define   EE_NETMASK1  0x00A
12
#define   EE_NETMASK2  0x00B
13
#define   EE_NETMASK3  0x00C
14

15

16

17
static uint8_t eeIp[] EEMEM = { [EE_IP0] = 192,  [EE_IP1] = 168, [EE_IP2] = 0, [EE_IP3] = 110 };
18
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };
19
static uint8_t eeNetmask[] EEMEM = { [EE_NETMASK0] = 255, [EE_NETMASK1] = 255, [EE_NETMASK2] = 255, [EE_NETMASK3] = 0 };
20

21
//Etnernet IP
22
#define ENC28J60_IP1    eeprom_read_byte((unsigned char *)EE_IP0)
23
#define ENC28J60_IP2    eeprom_read_byte((unsigned char *)EE_IP1)
24
#define ENC28J60_IP3    eeprom_read_byte((unsigned char *)EE_IP2)
25
#define ENC28J60_IP4    eeprom_read_byte((unsigned char *)EE_IP3)
26
//Etnernet Host IP                 
27
#define ENC28J60_HIP1    eeprom_read_byte((unsigned char *)EE_HOSTIP0)
28
#define ENC28J60_HIP2    eeprom_read_byte((unsigned char *)EE_HOSTIP1)
29
#define ENC28J60_HIP3    eeprom_read_byte((unsigned char *)EE_HOSTIP2)
30
#define ENC28J60_HIP4    eeprom_read_byte((unsigned char *)EE_HOSTIP3)
31
//Etnernet Netmask                 
32
#define ENC28J60_NM1    eeprom_read_byte((unsigned char *)EE_NETMASK0)
33
#define ENC28J60_NM2    eeprom_read_byte((unsigned char *)EE_NETMASK1)
34
#define ENC28J60_NM3    eeprom_read_byte((unsigned char *)EE_NETMASK2)
35
#define ENC28J60_NM4    eeprom_read_byte((unsigned char *)EE_NETMASK3)
36

37
//main
38
char enc_ip_buff[16];                    
39
rs232_puts_P(eth_status);
40
rs232_puts_P(eth_status_ip);
41
strcpy(enc_ip_buff, "");
42
inttostring(ENC28J60_IP1, enc_ip_buff); strcat(enc_ip_buff, ".");
43
inttostring(ENC28J60_IP2, enc_ip_buff); strcat(enc_ip_buff, ".");
44
inttostring(ENC28J60_IP3, enc_ip_buff); strcat(enc_ip_buff, ".");
45
inttostring(ENC28J60_IP4, enc_ip_buff);
46
rs232_puts(enc_ip_buff);
47
rs232_puts_P(eth_status_hostip); 
48
strcpy(enc_ip_buff, "");
49
inttostring(ENC28J60_HIP1, enc_ip_buff); strcat(enc_ip_buff, ".");
50
inttostring(ENC28J60_HIP2, enc_ip_buff); strcat(enc_ip_buff, ".");
51
inttostring(ENC28J60_HIP3, enc_ip_buff); strcat(enc_ip_buff, ".");
52
inttostring(ENC28J60_HIP4, enc_ip_buff);
53
rs232_puts(enc_ip_buff);
54
rs232_puts_P(eth_status_netmask);
55
strcpy(enc_ip_buff, "");
56
inttostring(ENC28J60_NM1, enc_ip_buff); strcat(enc_ip_buff, ".");
57
inttostring(ENC28J60_NM2, enc_ip_buff); strcat(enc_ip_buff, ".");
58
inttostring(ENC28J60_NM3, enc_ip_buff); strcat(enc_ip_buff, ".");
59
inttostring(ENC28J60_NM4, enc_ip_buff);
60
rs232_puts(enc_ip_buff);

Was dann gelesen wird:
1
ENC28j60 konfiguriert mit:
2
IP:
3
192.168.0.110
4
HOST IP
5
0.0.0.0
6
NETMASK:
7
0.192.168.0

Verwirrend! Gibts da sowas wie nen Offset von 5 Adressen?
Gast #851442
Lesenswert?

Die simpleste Lösung ist doch den Compiler (OK eigentlich den Linker) 
entscheiden zu lassen wo die Datem im  EEProm liegen.
1
static uint8_t eeDummy EEMEM = 0xFF
2
static uint8_t eeIp[] EEMEM = { 192,  168, 0, 110 };
3
static uint8_t eeHostip[] EEMEM = { 192, 168, 0, 254 };
4
static uint8_t eeNetmask[] EEMEM = { 255, 255, 255, 0 };
5

6
//Etnernet IP
7
#define ENC28J60_IP1    eeprom_read_byte(&eeIp[0])
8
#define ENC28J60_IP2    eeprom_read_byte(&eeIp[1])
9
#define ENC28J60_IP3    eeprom_read_byte(&eeIp[2])
10
#define ENC28J60_IP4    eeprom_read_byte(&eeIp[3])
11
//Etnernet Host IP                 
12
#define ENC28J60_HIP1    eeprom_read_byte(&eeHostip[0])
13
#define ENC28J60_HIP2    eeprom_read_byte(&eeHostip[1])
14
#define ENC28J60_HIP3    eeprom_read_byte(&eeHostip[2])
15
#define ENC28J60_HIP4    eeprom_read_byte(&eeHostip[3])
16
//Etnernet Netmask                 
17
#define ENC28J60_NM1    eeprom_read_byte(&eeNetmask[0])
18
#define ENC28J60_NM2    eeprom_read_byte(&eeNetmask[1])
19
#define ENC28J60_NM3    eeprom_read_byte(&eeNetmask[2])
20
#define ENC28J60_NM4    eeprom_read_byte(&eeNetmask[3])
21

22
...
#851524
Lesenswert?

1
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   [EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };

Das bedeutet: erzeuge ein Array, mit eeHostip[5] = 192, eeHostip[6] = 
168, etc.

Du hast also folgende Arrays:
eeIp:
0,192,168,0,110
eeHostip:
0,0,0,0,0,192,168,0,254
eeNetmask:
0,0,0,0,0,0,0,0,0,255,255,255,0

Und die werden hintereinander im EEPROM abgelegt.

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