www.mikrocontroller.net

Forum: Compiler & IDEs EEPROM Offset


Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define   EE_DUMMY     0x000  // Dummyelement (Adresse 0 sollte nicht genutzt werden)
#define   EE_IP0        0x001  // Eine Bytevariable  
#define   EE_IP1        0x002 
#define   EE_IP2        0x003
#define   EE_IP3  0x004 
#define   EE_HOSTIP0  0x005
#define   EE_HOSTIP1  0x006
#define   EE_HOSTIP2  0x007
#define   EE_HOSTIP3  0x008
#define   EE_NETMASK0  0x009
#define   EE_NETMASK1  0x00A
#define   EE_NETMASK2  0x00B
#define   EE_NETMASK3  0x00C



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

//Etnernet IP
#define ENC28J60_IP1    eeprom_read_byte((unsigned char *)EE_IP0)
#define ENC28J60_IP2    eeprom_read_byte((unsigned char *)EE_IP1)
#define ENC28J60_IP3    eeprom_read_byte((unsigned char *)EE_IP2)
#define ENC28J60_IP4    eeprom_read_byte((unsigned char *)EE_IP3)
//Etnernet Host IP                 
#define ENC28J60_HIP1    eeprom_read_byte((unsigned char *)EE_HOSTIP0)
#define ENC28J60_HIP2    eeprom_read_byte((unsigned char *)EE_HOSTIP1)
#define ENC28J60_HIP3    eeprom_read_byte((unsigned char *)EE_HOSTIP2)
#define ENC28J60_HIP4    eeprom_read_byte((unsigned char *)EE_HOSTIP3)
//Etnernet Netmask                 
#define ENC28J60_NM1    eeprom_read_byte((unsigned char *)EE_NETMASK0)
#define ENC28J60_NM2    eeprom_read_byte((unsigned char *)EE_NETMASK1)
#define ENC28J60_NM3    eeprom_read_byte((unsigned char *)EE_NETMASK2)
#define ENC28J60_NM4    eeprom_read_byte((unsigned char *)EE_NETMASK3)

//main
char enc_ip_buff[16];                    
rs232_puts_P(eth_status);
rs232_puts_P(eth_status_ip);
strcpy(enc_ip_buff, "");
inttostring(ENC28J60_IP1, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_IP2, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_IP3, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_IP4, enc_ip_buff);
rs232_puts(enc_ip_buff);
rs232_puts_P(eth_status_hostip); 
strcpy(enc_ip_buff, "");
inttostring(ENC28J60_HIP1, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_HIP2, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_HIP3, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_HIP4, enc_ip_buff);
rs232_puts(enc_ip_buff);
rs232_puts_P(eth_status_netmask);
strcpy(enc_ip_buff, "");
inttostring(ENC28J60_NM1, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_NM2, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_NM3, enc_ip_buff); strcat(enc_ip_buff, ".");
inttostring(ENC28J60_NM4, enc_ip_buff);
rs232_puts(enc_ip_buff);

Was dann gelesen wird:
ENC28j60 konfiguriert mit:
IP:
192.168.0.110
HOST IP
0.0.0.0
NETMASK:
0.192.168.0

Verwirrend! Gibts da sowas wie nen Offset von 5 Adressen?

Autor: Werner B. (Gast)
Datum:

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

//Etnernet IP
#define ENC28J60_IP1    eeprom_read_byte(&eeIp[0])
#define ENC28J60_IP2    eeprom_read_byte(&eeIp[1])
#define ENC28J60_IP3    eeprom_read_byte(&eeIp[2])
#define ENC28J60_IP4    eeprom_read_byte(&eeIp[3])
//Etnernet Host IP                 
#define ENC28J60_HIP1    eeprom_read_byte(&eeHostip[0])
#define ENC28J60_HIP2    eeprom_read_byte(&eeHostip[1])
#define ENC28J60_HIP3    eeprom_read_byte(&eeHostip[2])
#define ENC28J60_HIP4    eeprom_read_byte(&eeHostip[3])
//Etnernet Netmask                 
#define ENC28J60_NM1    eeprom_read_byte(&eeNetmask[0])
#define ENC28J60_NM2    eeprom_read_byte(&eeNetmask[1])
#define ENC28J60_NM3    eeprom_read_byte(&eeNetmask[2])
#define ENC28J60_NM4    eeprom_read_byte(&eeNetmask[3])

...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir auffällt, ist, dass in dieser Zeile
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };
ein "[" fehlt.

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh. Das gehört da natürlich schon hin. Das war nur ein Copy&Paste 
Fehler. :)

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Wenn du es also auf die Art mit absoluten Adressen machen willst, darfst 
du nur ein einziges Array anlegen:
static uint8_t eeData[] EEMEM = { [EE_IP0] = 192, ... , [EE_NETMASK3] = 0 };

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso. Dachte, das funktioniert anders. Das erklärt aber die Ausgabe. 
Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.