Go Down

Topic: ENC28J60 Ethernet beste Library (Read 29153 times) previous topic - next topic

virusbrain

Hi,

ich klinke mich hier mal kurz mit ein.

Ich versuche aktuell ein Projekt durchzuführen, in dem zwei Slaves am SPI-Bus hängen. Einmal ein Netzwerk und noch ein anderes Gerät. Da man zwei Slaves hat muss man also auch zwei Pins belegen um die Slaves ansprechen zu können.

Da das bisher nicht funktionierte, habe ich nun mal versucht, das Ethernetmodul nur allein anzusprechen. CS ist also (wie normal) auf Pin 10.

Mein Test-Code:
Code: [Select]

#include <SPI.h>
#include <UIPEthernet.h>

EthernetServer server = EthernetServer(1000);

void setup() {               
  // Ethernet:
  uint8_t mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  IPAddress ip(192,168,0, 177);
  IPAddress gateway(192,168,0, 110);
  IPAddress subnet(255, 255, 255, 0);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
}

void loop()
{
}


Damit sollte ich doch anschließend die 192.168.0.177 anpingen können, wenn ich es richtig verstanden habe?


Viele Grüße,
virusbrain

ntruchsess

#31
Jan 14, 2014, 10:28 pm Last Edit: Jan 14, 2014, 10:32 pm by ntruchsess Reason: 1

Damit sollte ich doch anschließend die 192.168.0.177 anpingen können, wenn ich es richtig verstanden habe?

UIPEthernet verarbeitet die Packete nur, wenn man methoden der lib aufruft (benutzt keine Interrupts im Hintergrund um nicht in Konflikt mit anderen Libs zu kommen). Rufe in der loop()-methode einfach 'Ethernet.maintain();' auf, dann klappt auch mit dem pingen.

Wegen den 2 Slaves am SPI: Du musst sichergestellt sein, dass immer nur 1 Device aktiv ist. UIP-ethernet macht das intern selbst, wenn Du selber die SPI-library aufrufst, dann musst Du Dich auch selber um das CS an- und abschalten kümmern.

Zusätzlich kommt noch dazu, dass SPI unterschiedliche Übertragungsmodi kennt. Wenn die Devices nicht den gleichen Modus benutzen muss vor jedem Wechsel des Kommunikationspartners SPI passend konfiguriert werden. (Beim Arduino DUE geht das für die 4 Hardware-CS-pins auch automatisch, bei allen andern Arduinos liegt es in er Verantwortung des Programms).

virusbrain


UIPEthernet verarbeitet die Packete nur, wenn man methoden der lib aufruft (benutzt keine Interrupts im Hintergrund um nicht in Konflikt mit anderen Libs zu kommen). Rufe in der loop()-methode einfach 'Ethernet.maintain();' auf, dann klappt auch mit dem pingen.


Ah, das klingt logisch.

Quote

Wegen den 2 Slaves am SPI: Du musst sichergestellt sein, dass immer nur 1 Device aktiv ist. UIP-ethernet macht das intern selbst, wenn Du selber die SPI-library aufrufst, dann musst Du Dich auch selber um das CS an- und abschalten kümmern.

Zusätzlich kommt noch dazu, dass SPI unterschiedliche Übertragungsmodi kennt. Wenn die Devices nicht den gleichen Modus benutzen muss vor jedem Wechsel des Kommunikationspartners SPI passend konfiguriert werden. (Beim Arduino DUE geht das für die 4 Hardware-CS-pins auch automatisch, bei allen andern Arduinos liegt es in er Verantwortung des Programms).


Okay, werde mir das im UIPEthernet Code mal genauer ansehen. Das werde ich dann schon entsprechend hinbekommen.

Und: Vielen Dank für Deinen äußerst hilfreichen Beitrag!

Viele Grüße,
virusbrain

Pit001

Hallo, ich versuche gerade die lib zum Laufen zu bekommen - klappt noch nicht, aber hier mal die Probleme die bis jetzt aufgetaucht sind.

- Das Beispiel Echoserver: Im Kommentar steht IP 192.168.1.6, im code IPAddress myIP(192,168,0,6);
- Beispiel Echoserver - es antwortet nicht auf Ping (Windows) kann das Jemand bestätigen, geht es mit Linux?
- Das Beispiel TCP Client zieht sich per DHCP eine IP - diese lässt sich ebenfalls nicht pingen (Firewall und so ist OK)
- Es fehlt die Doku wie das ENC anzuschießen ist (nicht hier im Forum, aber auf git)  ... Wird Reset, wird Int benötigt, wird CS an D10 oder D8 angeschlossen.
- die 'Config' in der  Enc28J60Network.h sagt mir nichts

#define SPI_MOSI MOSI
#define SPI_MISO MISO
#define SPI_SCK SCK
#define SPI_SS SS

(MISO,MOSISK,SS? Ist das der MEGA ? )  ich hätte etwas in der Art.

#define ENC28J60_CONTROL_CS     10
#define SPI_MOSI 11
#define SPI_MISO 12
#define SPI_SCK 13
#define SPI_SS ??

(D10-13) erwartet (hab ein Nano)

- ich habe LINK und Trafic vom Netz (LED), aber bekomme keine Conection, DHCP ging - wie geschrieben.

...

Grüße, Pit



ntruchsess


MISO,MOSI,SCK,SS? Ist das der MEGA ?


Das sind Defines die von der Arduino-IDE automatisch auf zum gewählten Board passende Werte gesetzt werden. Das ist bei der SPI-library dokumentiert. MISO,MOSI und SCK müssen so verbunden werden, wie in dieser Doku für den jeweiligen Arduino angegeben. Wenn man den CS-pin des Enc28J60 Moduls nicht am Hardware-SS anschließt, dann muss man das Define für ENC28J60_CONTROL_CS entsprechend anpassen. Die anderen Defines (SPI-MISO, SPI-MOSI, SPI-SCK und SPI-SS) müssen bei den mir bekannten Arduinos so bleiben. Die sind anpassbar, falls man die Library auf einem µC benutzen will, für den die korrekten Werte nicht von der IDE geliefert werden.

- Norbert

Pit001

OK, besten Dank. Dann denke ich, dass die für meinen Nano passen.

Eine Idee warum Ping und Telnet nicht funktionieren, DHCP aber schon.

Dass ein Signal (Kabel) fehlt und nur eine Teilfunktion gegeben ist halte ich für unwahrscheinlich 1?

- Pit

beeblebrox

#36
Nov 05, 2015, 12:55 pm Last Edit: Nov 05, 2015, 01:09 pm by beeblebrox
Hallo,

ich hänge mich hier auch mal drann. Ich habe jetzt sei ca. 1,5 Wochen auch einen EN28J60 Adapter
im Einsatz. Sketch und Hardware gab es schon länger und liefen vorher mit einem Ethernetshield.
Der Umstieg war mit der UIPEthernet-Library auch kein Problem.
Die Software holt sich alle 3 Stunden via NTP mal eine genaue Zeit. Ansonsten (es handelt
sich um eine Aquariumsteuerung) kann man sich Temperaturwerte und Status über ein
Webinterface anschauen. Mit dem UIPEthernet friert mir der Server regelmäßig ein.
Ich habe nach dem Thema schon eifrig gegoogelt und Norberts errata-changes alle
eingearbeitet. (respektive gestern mal die 1.09 uip_fix-errata12 eingespielt.
Immer noch das Selbe.
Das komische ist ja das das System in seiner mainloop stehen bleibt (da blinkt alle sekunde sonst
eine LED), der Webserver nicht mehr reagiert aber anpingen !! kann ich das Ganze noch. Also
in weiteren Sinne "abgestürzt" ist da nichts.
@Norbert -> an der Stelle wo du das Timeout "sendPacket" eingabaut hast schreibe ich wenn
es denn auftritt einen log auf eine SD-Karte. Kann das stören (ja die hat einen eigenen CS).

Obwohl ... Jetzt wollen die beide den Bus benutzen ..... . Ich bau den Log mal aus und benachrichtige mich anders ob der Timeout vorkommt.
Kann sein das ich da den Workaround ausgehebelt habe !

Melde mich morgen wieder wenn ich den Log ausgebaut habe und wieder einen Tag gewartet habe.

Ullli

Ulli

beeblebrox

Also,

das unseelige Schreiben auf die SD-Karte aus dem Treiber habe ich wieder entfernt.
Trotzdem hängt der Ethernettreiber sich nach unterschiedlichen Zeiten weg.

Wenn meine Hautpschleife blockiert schalte ich über den Watchdog eine LED an.
in diesem Zustand steht er jetzt wieder. Wann er blockiert ist total zufällig.
Gestern Abend habe ich die Webseite von 3PCs aus tracktiert über zwei Stunden und es
ist nichts passiert.
Heute morgen läuft er jetzt seit 1,5 Stunden und hängt wieder. Es gab nur wenige seltene
Zugriffe.

Kann ich aus dem Watchdoginterrupt irgendwas vernünftiges tun (außer Reset) um
die Ethernet-Lib (UIPEthernet) zu "entklemmen" ?

Ulli

ElEspanol

Schreibe doch mal Norbert, den Autor der Lib an und schicke ihm deinen Code. Vielleicht macht der noch was in der Richtung und hilft dir.

beeblebrox

Obwohl das Thema ja im Moment keinen zu interessieren scheint schreibe ich noch mal was
dazu, eventuell kann es ja mal jemand brauchen.

Punkt a:

Ich verwende den ENC28J60 zusammen mit einer SD-Karte. Anscheinend gibt es da Probleme
mit der Initialisierung.
Ich habe den Tip gefunden das man gefälligst vor der Initialisierung des Ethernetadapters und
der SD-Lib die entsprechenden CS-Beinchen auf Output programmieren soll und beide durch
setzen auf HIGH disablen.

Also

#define SD_CS 10

pinMode(SS,OUTPUT);
pinMode(SD_CS,OUTPUT);

digitalWrite(SS,HIGH);
digitalWrite(SD_CS,OUTPUT);

Da ich öfter den Prozessor wechsel nehme ich für den Hardware Chipselect das vordefinierte
Macro SS das für alle (von der IDE unterstüzten) Controller die richtige Beinchennummer
enthält.

Die Software ist dadurch schon mal um den Faktor >10 stabiler geworden aber immer noch
nicht so wie ich es haben will.
Aber ich habe mein Augenmerk leider zu wenig auf die Hardware gelegt.
Der ENC28j60 will zwar nur 3.3V aber zwischen 250 und sogar 350 mA.
Mein kleiner 3.3V Regler (78l33) macht aber nur 100 !!! und das ist ja weniger als
ein drittel. Na ja als dir 5V Ripplefrei waren und ich auf den 3.3 auch nichts gesehen
habe war ich zu früh zufrieden  >:( !

Das werde ich heute Abend mal ändern und dann wieder hier berichten.
Ich denke da wird der Hase im Pfeffer liegen. Erstaunlich das diese Initialisierungsequenzen
da überhaupt was gebracht haben.

Ulli

michael_x

Kleine Anmerkung zu:
Quote
digitalWrite(SD_CS,OUTPUT);
Code: [Select]
if (OUTPUT == HIGH) Serial.println("Glueck gehabt");

;)

Da man immer OUTPUT schreiben kann, wo man eigentlich HIGH oder true meint, wird das Ganze durch eine entsprechende Korrektur kein bisschen stabiler, sondern nur besser lesbar für Menschen.

beeblebrox

Pardon,

das war ein Tipfehler. In meinem Sketch ist das korrekt.

Aaaaber, auch die Verbesserung der Spannungsversorgung hat das Problem nicht
behoben. Die Hänger in der Library sind seltener geworden treten aber immer noch
auf.
Ich könnte ja mit dem alle paar Stunden booten via Watchdog leben aber ich empfinde
es als exterm unbefriedigend.
Normalerweise greife ich ja auch exterm selten auf das Webinterface zu, so das das
Gerät warscheinlich tagelang problemfrei läuft. Trotzdem will ich den Fehler finden.

Benutzt die Lib keiner oder habt ihr einfach keine Probleme ?

Ulli

combie

Quote
Code: [Select]
digitalWrite(SD_CS,OUTPUT);
Was ist das denn?

Auch wenn es funktioniert....
Falsch, bleibt es.
Säge kein Sägemehl.

beeblebrox

Das sollte natürlich auch HIGH stehen. Ist in meinem "wirklichen" Skech auch IO.

Das Problem bleibt bestehen, auch nach Änderung der 3.3V Spannungversorgung hängt
sich das Modul (oder die Library) nach einer Weile weg - wie gesagt mit weiterlaufenden Pings.

Dabei ist es komischerweise gar nicht lastabhängig.
Ich habe ein Shellscript geschrieben das im 5 Sekundentakt die Webseite anfordert, das kann
Stundenlang laufen ohne Probleme. Manchmal gibt es schon drei Hänger am Anfang und
dann ist 6 Stunden Ruhe (Was mir im Regelbetrieb schon reichen würde, dafür habe ich ja den
Watchdog und das recoverie läuft auch zufriedenstellend). Ohne Zugriff auf das Webinterface
habe ich die Software auf dieser Hardware schon 48 Stunden ohne Probleme laufen lassen.

Übrigens läuft genau diese Software auf einem Mega mit Ethernetshield seit 2 Jahren zufriedenstellen
und ohne Abstürze (Tag und Nacht und Woche für Woche).

Ich habe mir jetzt mal so einen Adapter mit w5100 Chip bestellt. Kostet zwar das vierfache aber
ich will jetzt wissen ob es an meiner selbstgebauten Hardware liegt oder wirklich die Kombination
"anderer Ethernetadapter + andere Library schuld sind.

Ulli

ElEspanol

#44
Nov 16, 2015, 01:22 pm Last Edit: Nov 16, 2015, 01:22 pm by ElEspanol
Ich hatte mit dem ENC28J60 in einem prov. Logger auch manchmal das Problem, dass er die Messwerte nicht mehr in die SQL DB geschrieben hat. War aber eher nach mehreren Wochen der Fall. Ich hab das aber nicht weiters verfolgt, sondern immer nur kurz den Strom abgeklemmt. 

Go Up