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
unsignedcharchr_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.
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!
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...
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.
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.
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_tmacAddress=MAC_ADDRESS;
Was du machen kannst, ist eine Funktion schreiben, die den Inhalt nach
macAddress kopiert und diese ganz am Anfang aufrufen.
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;
}
... 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
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