Forum: Mikrocontroller und Digitale Elektronik Programm übernimmt Werte nicht


von Tim S. (tommypic)


Lesenswert?

Guten Tag,

ich bin gerade dabei das PIC 18 Explorer Board mit dem 
Ethernet-Controller zu verbinden. Nun schreibe ich gerade die 
Initialisierung und möchte die MAC-Addresse auf meinem LCD ausgeben. 
Durch debuggen habe ich herausgefunden das ich vom Ethernet-COntroller 
die richtigen Werte über SPI bekomme, allerdings werden diese nicht in 
meinen Variablen gespeichert und somit wird immer nur 00-00-00-00-00-00 
ausgegeben.

hier mal mein Code:

main-funktion:
1
void main(void) {
2
    BYTE mac1 = 0, mac2 = 0, mac3 = 0, mac4 = 0, mac5 = 0, mac6 =0;
3
    TRISDbits.TRISD7 = 0;
4
    TRISBbits.TRISB5 = 1;
5
    LATBbits.LATB5 = 1;
6
    TRISD = 0x00;
7
    TRISBbits.TRISB0 = 1;
8
    initTimer();
9
    LCD_init();
10
    resetENC();
11
    delayms(250);
12
    setERXST(((0x5fff)-2*1518));
13
    LATDbits.LATD0 = 1;
14
    delayms(1000);
15
    LATDbits.LATD0 = 0;
16
    while (1) {
17
        delayms(500);
18
        LCD_Line1();
19
        mac1 = getMac1();
20
        LCD_hex(getMac1());
21
        LCD_string("-");
22
        mac2 = getMac2();
23
        LCD_hex(mac2);
24
        LCD_string("-");
25
        LCD_hex(getMac3());
26
        LCD_string("-");
27
        LCD_hex(getMac4());
28
        LCD_string("-");
29
        LCD_hex(getMac5());
30
        LCD_string("-");
31
        LCD_hex(getMac6());
32
    }
33
}

getMac-funktion (sind alle gleich bis auf Registeraddressen)
1
unsigned char getMac1(){
2
    ByteOp(B3SEL);
3
    return Byte2Op((BYTE)(RCR|0x04),0x00);
4
}

SPI-Abfrage:
1
BYTE Byte2Op(BYTE code, BYTE data) {
2
    BYTE answer = 0;
3
    ENC_CS = 0;
4
    SPI_IF = 0;
5
    SPI_BUF = code;
6
    WaitForSend();
7
    answer = SPI_BUF;
8
    SPI_BUF = data;
9
    WaitForSend();
10
    answer = SPI_BUF;
11
    ENC_CS = 1;
12
    return answer;
13
}

BYTE ist in einer Header-Datei so definiert:
1
typedef unsigned char           BYTE;

also debuggen lief so ab:

answer bekommt den Wert des Bytes einer Stelle der Mac-Addresse und 
sobald ich das in der Main in eine mac-Variable abspeichern möchte, 
bleibt diese aber auf dem Wert 00...

ich verstehe nicht warum :(

mit freundlichen Grüßen

tim

von holger (Gast)


Lesenswert?

>answer bekommt den Wert des Bytes einer Stelle der Mac-Addresse und
>sobald ich das in der Main in eine mac-Variable abspeichern möchte,
>bleibt diese aber auf dem Wert 00...
>
>ich verstehe nicht warum :(

Der ENC hat keine MAC Adresse. Du musst da eine reinschreiben!

von Tim S. (tommypic)


Lesenswert?

holger schrieb:
>>answer bekommt den Wert des Bytes einer Stelle der Mac-Addresse
> und
>>sobald ich das in der Main in eine mac-Variable abspeichern möchte,
>>bleibt diese aber auf dem Wert 00...
>>
>>ich verstehe nicht warum :(
>
> Der ENC hat keine MAC Adresse. Du musst da eine reinschreiben!

nein er hat eine mac-addresse, diese kann man überschreiben muss man 
aber nicht.

auszug aus dem datenblatt:

"8.6.1. preprogrammed mac address
as shipped, each ENCX24J600 device has been preprogrammed with a unique 
MAC address. This value is stored in nonvolatile memory and reloaded 
into the MAADR registers after every Power-on and System Reset. The 
factory preprogrammed MAC address is permanent and will be restored to 
the MAC registers after each Reset."

und sonst hätte ich beim Debuggen ja auch den Wert 0x00 in answer 
stehen. dort bekomme ich allerdings 6 unterschiedliche Werte für die 
Bytes, diese decken sich mit der Mac-Addresse die ich habe wenn ich das 
Beispiel-Programm von Microchip verwende

von holger (Gast)


Lesenswert?

>nein er hat eine mac-addresse, diese kann man überschreiben muss man
>aber nicht.
>
>auszug aus dem datenblatt:
>
>"8.6.1. preprogrammed mac address
>as shipped, each ENCX24J600 device has been preprogrammed with a unique
>MAC address.

Dann hättest du vieleicht mal sagen sollen um welchen ENC es
sich dreht. Das kann hier ja keiner raten. Genausowenig kann man
raten was die anderen nicht gezeigten Codeteile machen.

Viel Glück noch.

von Tim S. (tommypic)


Lesenswert?

holger schrieb:
>>nein er hat eine mac-addresse, diese kann man überschreiben muss
> man
>>aber nicht.
>>
>>auszug aus dem datenblatt:
>>
>>"8.6.1. preprogrammed mac address
>>as shipped, each ENCX24J600 device has been preprogrammed with a unique
>>MAC address.
>
> Dann hättest du vieleicht mal sagen sollen um welchen ENC es
> sich dreht. Das kann hier ja keiner raten. Genausowenig kann man
> raten was die anderen nicht gezeigten Codeteile machen.
>
> Viel Glück noch.

gehts noch einwenig unfreundlicher bitte?! ok die eine angabe vergessen, 
aber ich hatte erwähnt das ich über SPI die richtigen werte bekomme, 
also kann es nicht daran liegen das der ENC keine MAC-Addresse hat!



hier nochmal mein debuggprozess:
1
mac1 = getMac1();

--> ruft getMac1() auf
mittels
1
ByteOp(B3SEL);
 wird Bank 3 des ENC selektiert.
1
return Byte2Op((BYTE)(RCR|0x04),0x00);
--> rufe Byte2Op auf und gebe den Wert zurück.

Byte2Op ruft den Wert eines Bytes einer Stelle in der Mac-Addresse ab!
1
BYTE Byte2Op(BYTE code, BYTE data) {
2
    BYTE answer = 0;
3
    ENC_CS = 0;
4
    SPI_IF = 0;
5
    SPI_BUF = code;
6
    WaitForSend();
7
    answer = SPI_BUF;
8
    SPI_BUF = data;
9
    WaitForSend();
10
    answer = SPI_BUF; <-- an dieser stelle bekommt answer den wert des      empfangenen bytes
11
    ENC_CS = 1;
12
    return answer; <-- Wert wird zurückgegeben
13
}
1
unsigned char getMac1(){
2
    ByteOp(B3SEL);
3
    return Byte2Op((BYTE)(RCR|0x04),0x00); <-- gibt Wert von answer zurück
4
}
1
        delayms(500);
2
        LCD_Line1();
3
        mac1 = getMac1(); <-- hier kommt dieser Wert nie an
4
        LCD_hex(getMac1()); <-- in dieser Codezeile hat mac1 immer noch den wert 0x00
5
        LCD_string("-");
6
        mac2 = getMac2(); <-- das gleiche mit dem zweiten byte
7
        LCD_hex(mac2); <-- mac2 bleibt bei 0x00
8
        LCD_string("-");
9
        LCD_hex(getMac3());
10
        LCD_string("-");
11
        LCD_hex(getMac4());
12
        LCD_string("-");
13
        LCD_hex(getMac5());
14
        LCD_string("-");
15
        LCD_hex(getMac6());

denke nicht das noch andere programmteile benötigt werden, falls ja 
bitte sagen

edit:

also der Wert geht beim return der getMac()-Funktion verloren
1
unsigned char getMac2(){
2
    BYTE buffer = 0;
3
    ByteOp(B3SEL);
4
    buffer = Byte2Op((BYTE)(RCR|0x05),0x00); //hier wird der richtige wert übergeben
5
    LCD_hex(buffer); //hier wird der wert richtig ausgegeben
6
    return buffer; //hier zurück gegeben allerdings kommt der wert nie bei mac2 in der main-methode an
7
}

: Bearbeitet durch User
von Tim S. (tommypic)


Lesenswert?

ok hat sich erledigt - mein fehler lag darin das die getMac()-Funktionen 
in einer seperaten .c-datei lagen und diese nicht in der dazu gehörigen 
header-datei definiert worden sind. damit kam wohl der compiler nicht 
klar

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.