CS-Pin in ethercard Bibliothek vom Programm ändern

Hi,

ich habe mir einen Nano mit Huckepack EthernetShield (enc28j60) zugelegt. Der ist so schön klein, und kann schön an engen Ecken verbaut werden.
Allerdings ist bei dem Paket der CS-Pin auf Pin 10. Die Ethercard-Lib, die ich verwende hat den Pin aber fest auf PIN 8.
Hier der entsprechende Auszug aus der enc28j60.h

    /**   @brief  Initialise network interface
    *     @param  size Size of data buffer
    *     @param  macaddr Pointer to 6 byte hardware (MAC) address
    *     @param  csPin Arduino pin used for chip select (enable network interface SPI bus). Default = 8
    *     @return <i>uint8_t</i> ENC28J60 firmware version or zero on failure.
    */
    static uint8_t initialize (const uint16_t size, const uint8_t* macaddr,
                               uint8_t csPin = 8);

Sicher kann ich die Datei ändern. Befürchte aber, wenn ich da mal ein neues Release verwende, dann ist meine Änderung vergessen und ich suche mir nen Wolf.

Kann ich den Parameter irgendwie aus dem Arduino-Programm ändern? Dann könnte ich immer mit der Original-Lib arbeiten.

gruß/hk007

hk007:
Kann ich den Parameter irgendwie aus dem Arduino-Programm ändern?

Probiere mal aus, ob Du die Funktion wahlweise mit zwei oder mit drei Parametern aufrufen kannst!

Soweit ich das sehe, handelt es sich dabei um eine Funktion mit optionalem Parameter. Gibst Du den dritten Parameter an, wird der übergebene Parameter genommen. Gibst Du den dritten Parameter nicht an, wird stattdessen der Default-Parameter aus der Funktionsdeklaration genommen.

Hey Jurs,
Top Idee:
Hab nur den Aufruf der ether.begin gefunden. Die ruft wohl das initialize auf, wenn ich das richtig sehe…

uint8_t EtherCard::begin (const uint16_t size,
                          const uint8_t* macaddr,
                          uint8_t csPin) {
    using_dhcp = false;
    Stash::initMap(56);
    copyMac(mymac, macaddr);
    return initialize(size, mymac, csPin);
}[s]doBIST[/s]

Habs jetzt so gemacht:

  ether.begin(sizeof Ethernet::buffer, mymac, 10)

→ IP vom DHCP hat er schon mal bekommen.

Jetzt hab ich in der enc28j60.h noch einen zweiten Eintrag gefunden:

    /**   @brief  Reset and fully initialise ENC28J60
    *     @param  csPin Arduino pin used for chip select (enable SPI bus)
    *     @return <i>uint8_t</i> 0 on failure
    */
    static uint8_t doBIST(uint8_t csPin = 8);

Wird das auch in der ether.begin-Routine richtig gestellt? Der Aufruf hängt ja noch so unmotiviert hinter der Klammer dran. So viel versteh ich von C nicht :frowning:
Vergesst das durchgestrichene. k.A. wie das doBIST da dran gekommen ist… Bin wohl auf “paste” eingeschlafen

 static uint8_t doBIST(uint8_t csPin = 8);

Das ist ein Default Parameter.

Das heißt wenn man die Methode so aufruft:

doBIST();

wird automatisch csPin auf 8 gesetzt.

Man kann aber auch das machen:

doBist(10);

Test Code dazu:

int testDefaultParameter(int parameter = 8)
{
	return parameter;
}

void loop()
{
     Serial.println(testDefaultParameter());
     Serial.println(testDefaultParameter(10));
     delay(5000);
}

hk007:
--> IP vom DHCP hat er schon mal bekommen.
....
Wird das auch in der ether.begin-Routine richtig gestellt?

Sieht ja wohl ganz danach aus.

jurs:
Sieht ja wohl ganz danach aus.

uint8_t ENC28J60::doBIST ( byte csPin) {
#define RANDOM_FILL        0b0000
#define ADDRESS_FILL    0b0100
#define PATTERN_SHIFT    0b1000
#define RANDOM_RACE        0b1100

// init
    if (bitRead(SPCR, SPE) == 0)
        initSPI();
    selectPin = csPin;
    pinMode(selectPin, OUTPUT);
    disableChip();
.....
......

Jep, sieht so aus...

Danke Jungs,
ihr habt mir wieder mal schnell und sehr kompetent geholfen. :slight_smile:

Default Paramter sind übrigens ein C++ Feature. In ANSI C geht das nicht.