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?
von
Werner B. (Gast)
24.04.2008 15:39
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.
Oh. Das gehört da natürlich schon hin. Das war nur ein Copy&Paste
Fehler. :)
@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 };
Achso. Dachte, das funktioniert anders. Das erklärt aber die Ausgabe.
Danke!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.