Compiler & IDEs
›
Thread
EEPROM Offset
JK
Josef K.
(josefk)
OP
24.04.2008 15:21
#851428
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?
WB
Werner B.
Gast
24.04.2008 15:39
#851442
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 ...
Was mir auffällt, ist, dass in dieser Zeile 1 static uint8_t eeHostip [] EEMEM = { [ EE_HOSTIP0 ] = 192 , [ EE_HOSTIP1 ] = 168 , EE_HOSTIP2 ] = 0 , [ EE_HOSTIP3 ] = 254 };
ein "[" fehlt.
JK
Josef K.
(josefk)
OP
24.04.2008 16:13
#851472
Oh. Das gehört da natürlich schon hin. Das war nur ein Copy&Paste
Fehler. :)
JK
Josef K.
(josefk)
OP
24.04.2008 16:15
#851476
@Werner
Ich wollte mit der fixen Zuweisung erreichen, dass ich später die *.eep
Datei einfach austauschen kann und nicht immer im Quelltext rumwerken
muss bzw. compilieren muss.
Das werde ich dann bei der dynamischen Zuweisung verlieren, oder?
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.
Nachtrag:
Wenn du es also auf die Art mit absoluten Adressen machen willst, darfst
du nur ein einziges Array anlegen:
1 static uint8_t eeData [] EEMEM = { [ EE_IP0 ] = 192 , ... , [ EE_NETMASK3 ] = 0 };
JK
Josef K.
(josefk)
OP
25.04.2008 10:06
#852139
Achso. Dachte, das funktioniert anders. Das erklärt aber die Ausgabe.
Danke!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren