Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 -> MAC Adresse ändern


von Ingo S. (schicki)


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

von SuperMann (Gast)


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!

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Klar, kannst die kriegen. Da steht allerdings nicht viel anderes drin. 
Zum Thema C geb ich Dir recht als ich mit den Mikrocontrollern 
angefangen hab, war Assembler der Standard...

von STK500-Besitzer (Gast)


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.

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hier wäre das komplette Projekt.

Das Einlesen befindet sich in der mcc.c.

Dort liest der Controller Einstellungen usw. aus, und stellt sie 
Schnittstellen usw. ein.

Der zentrale Platz für Variablen liegen in der device_config.h.

von Rolf M. (rmagnus)


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.

von SuperMann (Gast)


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;
}

von STK500-Besitzer (Gast)


Lesenswert?

SuperMann schrieb:
> .. nur das struct hier quasi ein array ist und darum sinnfrei.

aber nur quasi.

von SuperMann (Gast)


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

von Ingo S. (schicki)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.