PIC18F97J60 -> MAC Adresse ändern

OP #6238814
Lesenswert?

Hallo Zusammen,

ich habe mein PIC18F97J60 Board entwas modifiziert. Um nicht jedesmal im 
Quellcode IP, Subnet oder MAC zu ändern habe ich ich ein 24AA025E48 
inkl. MAC Adresse nachgerüstet.

Die Daten von IP, Subnet Maske, Gateway, DNS Server, Port usw. sind 
bereits dort ausgelagert. Bei der MAC Adresse habe ich ein Problem. Die 
kann ich ohne Weiteres Einlesen und verarbeiten.

In der PIC Lite Vorlage wird die MAC Adresse logischerweise als cost -> 
sprich Read only deklariert. Ich habe es schon mit allen Tricks 
versucht, die mir meine Bücher, Google und Erfahrung weitergeholfen 
haben. Leider ohne Erfolg.

Wenn ich die MAC Adresse wie folgt händisch deklariere. Meckert der 
Compiler nicht. Sobald ich die eingelesenen Variablen zuweise, geht es 
verständlicherweise nicht. Mit Pointern oder einer abgeänderten Routine 
zum einlesen geht es nicht. Hier ist ein Auszug aus der Deklaration.

Die MAC Adresse aus dem 24AA025E48 liegt in der der Variablen
1
unsigned char chr_MAC[6];

Die hat noch nichts mit der MAC aus der Vorlage zu tun. Wie geht das mit 
dem XC8 am einfachsten. Ich habe lange mit dem C18 gearbeitet mit dem 
XC8 habe ich noch nicht soviel Erfahrung.. Und da hat sich ja in der 
Richtung einiges getan.

Wichtig:
Der XC8 ait auf C90 wegen anderer Bibliotheken wie Display usw. 
umgestellt. Dies als Info am Rande.
1
#define MAC_ADDRESS {0x00,0x04,0xa3,0x00,0x16,0x06}     // MAC-Adresse
2
typedef union
3
{
4
    uint8_t mac_array[6];
5
    struct { uint8_t byte1,byte2,byte3,byte4,byte5,byte6; } s;
6
} mac48Address_t;
7

8
typedef union
9
{
10
    uint8_t mac_array[8];
11
    struct { uint8_t byte1,byte2,byte3,byte4,byte5,byte6,byte7,byte8; } s;
12
} mac64Address_t;
13

14
extern const mac48Address_t broadcastMAC;
15
extern mac48Address_t hostMacAddress;
16

17
const mac48Address_t *MAC_getAddress(void);
18

19
void MAC_to_String(char str_MAC[]);
20

21
Und  hier ist die grundsätzliche Idee, ohne Pointer ohne alles..
22

23
#define MAC_ADDRESS {chr_MAC[0],chr_MAC[1],chr_MAC[2],chr_MAC[3],chr_MAC[4],chr_MAC[5]}

Die Fehlermeldung lautet:
mcc_generated_files/TCPIPLibrary/mac_address.c:13:40: error: (188) 
constant expression required

Wie geht das?

VG
Ingo
Gast #6238910
Lesenswert?

Ingo S. schrieb:
> Und  hier ist die grundsätzliche Idee, ohne Pointer ohne alles..

Das tut wieder richtig weh! Du labberst hier viel rum ohne Zusammenhang
und bist auch nicht in der Lage das Problem nachvollziehbar 
darzustellen!

Ingo S. schrieb:
> mcc_generated_files/TCPIPLibrary/mac_address.c:13:40: error: (188)

Wo ist den deine Problemfunktion mac_address.c Häh?!

Von der Sprache C hast du ja richtig viel Ahnung und verstehst 
offensichtlich weder const, union noch struct richtig. Schon mal von 
Initialisierung gehört?

Die union sehen für mich nutzlos aus oder was soll der Sinn hier sein?


Also lade endlich die mac_address.c  hoch oder sabber im Heim rum!
Gast #6238919
Lesenswert?

SuperMann schrieb:
> Die union sehen für mich nutzlos aus oder was soll der Sinn hier sein?

Wie man unions so nutzt: Z.b. eine struct in ein Array "umwandeln".

Ingo S. schrieb:
> Und  hier ist die grundsätzliche Idee, ohne Pointer ohne alles..
>
> #define MAC_ADDRESS
> {chr_MAC[0],chr_MAC[1],chr_MAC[2],chr_MAC[3],chr_MAC[4],chr_MAC[5]}
>
> Die Fehlermeldung lautet:
> mcc_generated_files/TCPIPLibrary/mac_address.c:13:40: error: (188)
> constant expression required
>
> Wie geht das?

so definitiv nicht.
Das #define kann man als eine Textersetzung durch den precompiler 
ansehen:
Der ersetzt überall im Quellcode das Wort "MAC_ADRESS" durch den 
nachfolgenden Text.

Ingo S. schrieb:
> Wichtig:
> Der XC8 ait auf C90 wegen anderer Bibliotheken wie Display usw.
> umgestellt. Dies als Info am Rande.

"Wichtig!" und "... am Rande" passt nicht zusammen. ;)

Wenn ich deine Frage richtig verstanden habe, hast du ein EEPROM in dem 
sich deine MAC-Adresse befindet.
Die willst du in einem Programm, das die MAC-Adresse im Quellcode setzt 
verwenden. Richtig?
Dazu sind die von die geposteten Dateien wenig zu gebrauchen, weil dort 
die "neue" MAC-Adresse gar nicht benutzt, sondern nur umgeformt wird.
#6238926
Lesenswert?

Ingo S. schrieb:
> Die Fehlermeldung lautet:
> mcc_generated_files/TCPIPLibrary/mac_address.c:13:40: error: (188)
> constant expression required

Eine globale Variable kann nur mit konstanten Ausdrücken initialisiert 
werden, also mit reinen Compilezeit-Konstanten. chr_MAC[0] u.s.w. ist 
keine solche. Deshalb kann das nicht funktionieren:
1
mac48Address_t macAddress = MAC_ADDRESS;

Was du machen kannst, ist eine Funktion schreiben, die den Inhalt nach 
macAddress kopiert und diese ganz am Anfang aufrufen.
Gast #6238932
Lesenswert?

STK500-Besitzer schrieb:
> Wie man unions so nutzt: Z.b. eine struct in ein Array "umwandeln".

.. nur das struct hier quasi ein array ist und darum sinnfrei.

@To
diese Funktion kannst du in die Tonne geben, weil direkt &macAddress 
macht doch das gleiche UND das const gefällt mir und dem xc8 nicht!

const mac48Address_t *MAC_getAddress(void){
    return &macAddress;
}
Gast #6238939
Lesenswert?

... entweder

#define MAC_ADDRESS xxx
mac48Address_t macAddress = MAC_ADDRESS;

oder z.B.

foo() {
  mac48Address_t macAddress;
  eeprom_read_block(..., &macAddress.mac_array);
}

Rolf M. schrieb:
> Eine globale Variable kann nur mit konstanten Ausdrücken initialisiert
> werden,

richtig, ganz böse
OP #6238977
Lesenswert?

Vielen Dank an Alle. Es hat funktioniert. Durch das entfernen der 
Befehle

const mac48Address_t *MAC_getAddress(void){
    return &macAddress;
}

habe ich den Verweis auf den Ethernet Treiber gefunden, wo ich die MAC 
direkt zuweisen konnte.

VG und einen Schönen Sonntag
Ingo

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