Forum: Mikrocontroller und Digitale Elektronik UDP, LPC935, ENC28J60


von Stefan M. (stefan1991)


Lesenswert?

Hey

Ich habe ein großes Problem

und zwar hab ich 3 sensoren die ich mit meinem uC
(LPC935) auswerte. Das mache ich über die AD eingänge.

Ich muss diese dann auf einen PC übertragen und
mein Professor gab mir die aufgabenstellung
dies über einen LANCHIP (ENC28J60) mit einer UDP
übertragung zu realisieren.

Ich hab mir hier schon einige Threads durchgelesen und auch
das Datenblatt des ENC28J60 nur hab ich das Problem das ich es
einfach nicht verstehe.

Ich schicke über SPI daten an den Lanchip und die will ich dann
mit UDP auf den PC übertragen.

Funktionert da die ganze Initialisierung und das setzten aller Register 
auch über SPI ?

Die Projekte von Ullrich Radig hab ich auch schon gelesen aber die
sind auf einem Webserver ausgelegt und sehr schwer zu verstehen.

Ich hoffe ihr könnt mir die Grundsätze ein bisschen näher bringen.

mfg Stefan

von Bernd (Gast)


Lesenswert?

Das war nicht sehr nett von deinem Prof... bischen mehr RAM könntest du 
schon gebrauchen denn UDP mit dem ENC/LPC zu realisieren ist alles 
andere als trivial.

Wieviel Wissen hast du ? stehst du völlig am Anfang ?

von ... .. (docean) Benutzerseite


Lesenswert?

Wieso RAM? UDP brauch sowas nicht...

von Bernd (Gast)


Lesenswert?

Aber nen Ethernet Frame und der ENC.

von Markus .. (10mhz)


Lesenswert?

Hallo,

Hier ist was für BASCOM-AVR aber sehr ausführlich (auch für UDP).
Evtl. ist ja der Controller noch austauschbar.

Here you can find a step-by-step tutorial about the Bascom-AVR code to 
drive an AVR and an ENC28J60 ethernetcontroller:

http://members.home.nl/bzijlstra/software/examples/enc28j60.htm

Markus

von Stefan M. (stefan1991)


Lesenswert?

Hey

Danke für die schnellen Antworten.

Sag ma mal so .. ich kann ziemlich gut
uC Programmieren und bei der C++ und
Windows Programmierung eher Standard (paar Stunden in der Schule 
gehabt).

Ich werd mir mal die Seite von Markus
ansehen und versuchen den Code zu verstehen.

Das Problem ist, dass ich von so einer
Bausteinprogrammierung nicht viel Ahnung habe und
das Datenblatt nicht so richtig verstanden habe.

Ich versuch jedenfalls weiter die Projekte hier im Forum
durchzuforsten um zu schauen was ich verweten kann usw.

mfg Stefan

von Gast (Gast)


Lesenswert?

Grundsätzlich: Der ENC28J60 wird komplett über SPI gesteuert, d.h. 
sowohl die Konfiguration als auch die Nutzdaten schiebst Du im Endeffekt 
da durch.

Aber: Der Chip ist ein Ethernet-Controller, will heissen er kann 
Ethernet-Frames senden und empfangen. Nicht mehr und nicht weniger. Die 
ganzen höheren Protokolle die Du noch brauchst um eine Kommunikation 
über UDP aufzubauen muss der ansteuernde Mikrocontroller in Software 
implementieren. Falls du z.B. UDP über IPv4 verwenden willst bräuchtest 
Du also mindestens ARP, IP und eben UDP. Ein bisschen ICMP (Echo 
Requests beantworten) ist auch sehr hilfreich, dann kann man das Teil 
sogar anpingen ;)

Frei verfügbare IP-Stacks die man mit dem ENC einsetzen kann gibts 
einige, allein hier im Forum lässt sich genug finden.

von Stefan M. (stefan1991)


Lesenswert?

Hey

Danke für deine Antwort, dass hat mir beim Verständnis schon mal viel 
gebracht.

Ich wollt aber fragen

"Die ganzen höheren Protokolle die Du noch brauchst um eine 
Kommunikation
über UDP aufzubauen muss der ansteuernde Mikrocontroller in Software
implementieren."

Heißt das die Software muss ich auf meinem uC aufbauen oder auf dem 
PC-Programm?

Und meine 2te Frage ist :

"Frei verfügbare IP-Stacks die man mit dem ENC einsetzen kann gibts
einige, allein hier im Forum lässt sich genug finden."

IP-Stacks sind also quasi die Softwareimplementierung des Protokolls IP 
?
Und ist dieser IP-Stack auf dem uC oder auf dem Computer zu verwenden ?


mfg Stefan

von Mike (Gast)


Lesenswert?

Als "billig-Test", wenn man die MAC Addresse des Ziels kennt, kann man 
auch ein Packet zusammenfriemelen:

<-MAC FRAME-><IP-HEADER><UDP-HEADER><DATEN>

und dieses auf die Reise schicken.

Peinlich ist nur, daß man falls sich die <DATEN> verändern auch dann die 
Checksum in den übergeordneten Header korrigieren muss und/oder die 
Längenangaben.

Der Algorithmus ist billig.

Dann geht aber kein anpingen, kein Ändern der Ziel-IP Adresse und das 
Ziel muss im selben SUBNET sein.

Auch keine Rückmeldung und keine ICMP Fehlermeldungen anderer Art.

Sogar einen SNMP Trap könnte man auf diese Weise loswerden. (Auch UDP, 
Aufbau des Telegramms aber ein wenig aufwändiger).

Problematisch ist wie erwähnt die Korrektur der Checksums, falls die 
Länge der Daten brav gleichbleibt.

Dann kann man sich das Übernehmen eines "Mini-Stacks" evtl. sparen. 
Andererseits: Solche Stacks gibt es inzwischen an allen Ecken und Enden 
zum nutzen, also warum nicht den ganzen Weg gehen und den ENC gleich 
gescheit anbinden: Zu wenig RAM! Tja. Dann baue eben die Telegramme 
selbst etc. etc. wie oben angedeutet.

Bedeutet aber ein wenig Einarbeitung in IP, UDP Formate.

Grüße,
Mike

von Mike (Gast)


Lesenswert?

Noch ein Hinweis:

UDP hat die nette Eigenschaft, lediglich zu "senden, forget the rest" 
oder zu "empfangen, never mind acknowledging". TCP, anstelle von UDP, 
würde ich niemals ohne Stack implementieren.

UDP Pakete (Telegramme) einfach zusammen bauen und weg damit.

Aber: ETHERNET kennt keine IP Addressen, also ab an die MAC Addressen 
der Schnittstelle direkt. Für die Umsetzung in IP Adressen wäre ja 
wieder das interaktive ARP Protokoll nötig zum programmieren, mit ARP 
Cache und all dem Glumpatsch.

Aber von Hand ein ETHERNET Paket "aufbauen" und absenden, no Problem. 
Das Paket muss nur stimmig sein, also ob es ein Stack für Dich aufgebaut 
hätte.

Grüße,
Mike

von Stefan M. (stefan1991)


Lesenswert?

Hey

Danke wieder für die Antwort :)

Also verstehe ich das richtig ..

ich konfiguriere den Lan Chip über SPI,
dann mach ich mir ein Packet

<-MAC FRAME-><IP-HEADER><UDP-HEADER><DATEN>

und schick das dann über SPI vom Stick?
Mal so überspitzt ausgedrückt .. ich werd mich natürlich jetzt reinlesen 
in die Formate und so weiter, nur dass ich die Grundzüge verstehe.

Du sagst wenn sich die Daten ändern stimmen die Checksummen nicht mehr.
Nunja ich schick ja Messwerte von 3 Sensoren, die ändern sich schon aber 
ich glaub du meinst die Datenlänge nehm ich mal an oder? Die würde ja 
gleichbleiben. Also XX von den 1500 Byte möglichen Daten.

Und die Verbindung beruht direkt auf einem Kabel also Lanchip -> Buchse 
-> Lankabel -> PC des heißt, es bleibt auch immer die gleiche MAC 
adresse.


mfg Stefan

von Gast (Gast)


Lesenswert?

Die Verkapselung der Daten läuft grundsätzlich so ab wie Du das 
dargestellt hast. Wenn Du dir den Aufbau der IP- und UDP-Pakete mal 
genauer anschaust wird auch sicher noch einiges klar. das IP-Paket ist 
die "Nutzlast" des Ethernet-Frames, das UDP-Paket ist wiederrum die 
Nutzlast des IP-Pakets.

Ansonsten:

-Wenn Du dein Board direkt an den PC anschließt müsste das mit der 
festen MAC im Prinip funktionieren. Schön ist es aber nicht. Z.B. musst 
Du in dem Fall immer darauf achten das auf der PC-Seite die MAC-Adresse 
deines uC-Boards im ARP-Cache vorhanden ist. Sonst sendet Windows 
fröhlich ARP-Anfragen, die niemand beantwortet. Ich würde zumindest mal 
darüber nachdenken ARP zu implementieren, so kompliziert ist das 
eigentlich auch wieder nicht sobald man etwas Durchblick im 
Netzwerkprotokoll-Dschungel hat.

-Die Checksumme der Pakete ändert sich sobald sich Daten innerhalb des 
Paketes ändern, auch wenn die Paketlänge gleich gleibt. Der Algorithmus 
für die CRC-Berechnung ist aber nicht sehr umfangreich, die Funktion 
kann man sich sicher sehr gut aus einem der vielen freien IP-Stacks 
rausziehen. Davon abgesehen verwenden IP und UDP die gleiche CRC, d.h. 
es ist auch nur eine einzige Funktion die man braucht. Ethernet 
wiederrum verwendet zwar eine andere CRC, um die kann sich der ENC28J60 
aber praktisch komplett selbst kümmern wenn man es so einstellt 
(automatische Berechnung beim Senden und genauso automatische 
Überprüfung beim Empfangen).

von Frank (Gast)


Lesenswert?

Hör nicht auf Bernd...
...was du machen möchtest, geht einfach, es gibt auch genug Kram im 
Netz.

Nimm dir die Software von U. Radig, ziehe die Treiber-Schicht und die 
Initialisierungs-Routinen raus und fertig.

LPC:
Chip resetten
MAC setzen
Senden

PC:
UDP socket aufmachen und auf Daten warten

fertig

von Michael S. (fandjango)


Lesenswert?

ARP Cache im PC egal. Der will nix zurücksenden. Sender des empfangen 
Pakets entnimmt er aus dem IP Header.

Dennoch bissi Speicher braucht man um das Paket zusammenzustellen und an 
den ENC zu übermitteln.

Das ganze ist natürlich eine erste totale Primitiv-Lösung. Wenn die 
Längen der Daten sich nicht ändern muss man nur die CHKDSUM neu 
berechnen. Achso, besser ist es auch, die evtl. im IP header die ID 
jeweils im 1 hochzuzählen per Sendung.

Schau mal im WWW ein ETHERNAT Paket an...

Bleibt natürlich: INIT des ENC, wie sendet man was, wie übergibt man das 
Paket Byte für Byte per SPI, etc.

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.