Forum: Mikrocontroller und Digitale Elektronik UDP Server mit LM3S6965


von Fahri C. (fahrixx)


Lesenswert?

Hi Leute !

vor kurzer Zeit habe ich mir das LM3S6965 Evaluation Board zugelegt 
welches über eine ethernet Schnittstelle verfügt.

Folgendes hab ich vor:

ich möchte zunächsteinmal übers Ethernet (protokoll UDP) datenpackete 
zwischen einem PC und dem Evaluation Board hin und her schicken. Ich hab 
da auch schon was in Visual c++ Programmiert es funktioniert auch.

Nun möchte ich das Board als Server einrichten und den PC als Client.

Mein Problem ist es nun den Code im Microcontroller umzusetzen, hab 
bisher noch nicht viel in dieser richtung gemacht. Die Basics sind aber 
vorhanden.

Wo ich momentan hänge ist das ich z.B. unter visual Studio 2005 gibt es 
fertige headerfiles wie "winsock2.h" usw mit derren Hilfe ich dann die 
Sockets anfordern freigeben binden usw. kann alles was man halt zur 
initialisierung der sockets braucht ist da vorhanden.

wie wird diese sache in Luminary umgesetzt?? es gibt Demos die ich schon 
zum laufen gebracht habe allerdings finde ich nirgends ein 
funktionsaufruf wo irgendwelche sockets initialisiert werden.

ich hab im forum über diese thema gesucht aber hab festgestellt das noch 
nicht soviele beiträge über dieses Board vorhanden sind. (Sorry falls 
ich mich irren sollte)

Meine Daten:

Mikrocontroller:    Evaluation Board LM3S6965
Kompiler :          IAR Embedded Workbench IDE 5.11 (Kickstart Version)
Programmiersprache: c/c++

ich wäre euch sehr dankbar wenn ihr mir da hilfe leisten könntet. Ich 
möchte keine fertigen Codes nicht das Ihr mich falsch versteht nur ne 
kleine starthilfe ein tutorial über Sockets in uc oder so ähnlich wäre 
schon ausreichend.

Vielen Dank im vorraus

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Auf einem Mikrocontroller gibt es kein "Betriebssystem" mit fertigen 
Funktionen. Man muss das alles selbst schreiben.
Das heißt, wenn du UDP haben möchtest, dann musst du UDP und auch die 
Schichten unter UDP programmieren: IP und Ethernet.
Man muss das Rad aber nicht neu erfinden, da es bereits fertige 
Ethernet-Stacks (z.B. uIP, lwIP) oder kleine RTOS (z.B FreeRTOS) für uCs 
gibt.
Beispiele für uIP und lwIP sind bei der Luminary Driverlib mit dabei.

von Fahri C. (fahrixx)


Angehängte Dateien:

Lesenswert?

@  Andreas Watterott : Vielen Dank für deine Hilfe erstmal.

Ich habe mir die Dokumnetation über die Library von Luminary 
durchgelesen und hab auch jetzt das teil soweit zum laufen gebracht das 
es zumindestmal die Ethernet Schnitstelle Initialisiert.

Ich kann aber noch keinen Ping an den controller senden bzw. er reagiert 
noch  nicht darauf liegt es vielleicht daran das ich

a) noch keine IP Adresse zugewiesen habe oder
b) Kann es sein das der Switch ihm irgend eine IP zugewiesen hat?

wenn ich über windows command einen ping sende, sendet er das über UDP 
oder TCP ?

und zuguter letzt ist es richtig das der uIP stack dasselbe wie IP Stack 
ist nur das es auf einem mikrocontroller zugeschnitten ist ??

sorry wenn ich soviele fragen stelle aber als anfänger in diesem gebiet 
kann mann echt verzeweifeln :-(

ich hab noch meinen Code angehängt vielleicht mache ich ja auch was 
falsch

Vielen Dank im vorraus

fahri

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Dir fehlt noch die IP- und ICMP-Schicht um einen Ping zu verarbeiten.
Schau dir mal das uIP-Beispiel aus der Driverlib an.

Celik Fahri wrote:
> wenn ich über windows command einen ping sende, sendet er das über UDP
> oder TCP ?
Ping ist ein ICMP-Echo-Request (Ethernet->IP->ICMP):
http://de.wikipedia.org/wiki/Internet_Control_Message_Protocol

> und zuguter letzt ist es richtig das der uIP stack dasselbe wie IP Stack
> ist nur das es auf einem mikrocontroller zugeschnitten ist ??
Ja, uIP ist ein uC Ethernet-Stack mit ARP, IP, ICMP, UDP, TCP...

von Fahri C. (fahrixx)


Lesenswert?

ok, jetzt funktionierts auch mit dem Ping wenn ich das richtig sehe 
befinde ich mich nun auf der 4.schicht des OSI-Modells. Jetzt kommt ja 
das eigentliche Programm undzwar die Programmierung für das UDP 
Protokoll.

in c habe ich ein Programm das nachdem UDP Prinzip arbeitet um 
Datagramme zu lesen und zu senden.In diesem Code ist eine Funktion die 
sich dg_echo nennt.

void
dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
        int n;
        socklen_t len;
        char mesg[MAXLINE];

        for(;;)
        {
            len = clilen;
            n = Recvform(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);

            Sendto(sockfd, mesg, n, 0, pcliaddr, len);
        }
}

RECVFORM und SENDTO sind einfach befehle, die am jeweiligen Port die 
eintreffende Datagramm liest bzw. sendet.

so wie ich es nun verstanden habe gibts in der Lib von Luminary dafür 
die Funktionen EthernetPacketGet(...) und EthernetPacketPut(...).

würde das ganze nach diesem Prinzip funktionieren wenn ich die 
funktionen recvform und sendto ersetze ?

Danke

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

EthernetPacketPut() sendet Daten an den im uC eingebauten 
Ethernetcontroller (MAC+PHY): Schicht 1 & 2
Du brauchst daher noch die Schichten 3 & 4, z.B. aus dem uIP Stack:
uip_udp_new(), uip_udp_send()... Zur Verwendung schau dir mal das 
uIP-DHCP-Beispiel an.

von Fahri C. (fahrixx)


Lesenswert?

Hi ich mal wieder...

ich hänge an einem Problem wo ich gerade nicht weiterkomme....

ich scheitere immer wieder bei jedem versuch ein eigenes Projekt 
anzulegen.

ein kleines Beispiel zur verdeutlichung meines Problems...

#include "../rit128x96x4.h"

int main()
{
   RIT128x96x4Init(1000000);
   RIT128x96x4StringDraw("HALLOOOOOOOOOOOO",0,15,15);

  return 0;
}

ganz einfacher Code wo mir den text hallo auf dem display ausgeben soll, 
laut anleitung soll ich dazu den header rit128x96x4.h einbinden. Nur in 
diesem Header file sind nur die Protoypen der funktion drin die 
eigentliche Deklaration ist extern und befindet sich in rit128x96x4.c.

bisher alles schön und gut sobald ich aber rit128x96x4.c in mein Projekt 
hinzufüge bekomme ich zich Link fehler vom compiler der grund liegt wohl 
darin das noch andere funktionen sich in diesem rit128x96x4.c befinden 
die wiederum andere header bzw c files benötigen ??.

Es kann doch nicht sein das ich nur für ein einfachen text die ganze lib 
einbinden muss... oder ich mach einen ganz gravierenden Fehler denn ich 
nicht blicke.

Es gibt ne menge Optionen welche mann verändern kann ich hab sogar 
original Projekte genommen damit ich wenigstens die gleichen 
Einstellungen habe aber ohne Erfolg.... Natürlich habe ich auch das 
Projekt in dem Ordner angelegt wo sich auch die demos befinden damit die 
header files auch vom compiler gefunden werden.

was mache ich falsch ??

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Das ist schon alles richtig.
Die RIT-Routinen setzen auf der Driverlib auf und daher muss man auch 
diese Dateien mit in das Projekt einbinden oder man bindet die für IAR 
erstellte Library "/driverlib/src/ewarm/exe/driverlib.a" mit in das 
Projekt ein.
Am einfachsten ist es bestimmt, wenn du ein fertiges Projekt nimmst und 
dieses dann veränderst.

von Fahri C. (fahrixx)


Angehängte Dateien:

Lesenswert?

Hallo Andreas,

danke für deine Hilfe jetzt gehts mit dem Projekt hab so wie du es 
gesagt hast die driverlib.a eingefügt und schon gings.

ich hab mich jetzt entschieden das ganze doch eher mit LWIP zu 
programmieren das ist angenehmer für mich da die struktur anlegen socket 
bind socket usw ähnlich ist wie bei windows.

beim Anlegen des IP stack bin ich auf die funktion lwIPinit() gestoßen, 
beim anwenden dieser funktion hab ich aber noch ein Problem. Ich möchte 
eine feste IP und SubnetMask nutzen. Wie könnte ich dieser Funktion eine 
feste IP übergeben?

ich hab meinen Code mal angehängt. ich komm da momentan beim "anlegen 
eines IP stacks" nicht mehr weiter das anlegen von UDP socket hoffe ich 
müsste mit der funktion UDP_echo_init() gehen.

danke im vorraus

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Ich kenne mich mit den Ethernet-Stacks auch nicht so aus.
Das lwIP-Beispiel hast du dir ja schon angeschaut.

Die lwIPInit() Funktion kommt aus:
driverlib/utils/lwiplib.c
Da stehen dann auch die Parameter. Als weitere Info gibt es noch die 
Docu zu lwIP:
driverlib/third_partylwip-x.x.x/doc

Die lwIP-Initialisierung müsste dann in etwa so aussehen:
1
unsigned long ip  = ((192<<0)|(168<<8)|(  0<<16)|(  1<<24));
2
unsigned long msk = ((255<<0)|(255<<8)|(255<<16)|(  0<<24));
3
unsigned long gw  = ((192<<0)|(168<<8)|(  0<<16)|(100<<24));
4
5
lwIPInit(pucMACArray, ip, msk, gw, IPADDR_USE_STATIC);

EthernetPacketGet() und EthernetPacketPut() darfst du nicht verwenden. 
Diese Funktionen werden von lwIP aufgerufen.


PS: Bitte keine DOC-Dateien als Anhang. Für Code reicht nur Text.

von Fahri C. (fahrixx)


Lesenswert?

ok danke.. nun kann ich ein echo auf meinem controller senden und er 
amtwortet auch darauf.... ich habe gemerkt das der fehler im lwipopts.h 
lag da war die funktion LWIP_UDP  nicht aktiviert ! es gibt noch ne 
menge andere funktionen die mann ein bzw. ausschalten kann. Kennst du 
dich mit diesen Einstellungen aus oder gibt es vielleicht irgendwelche 
fertigen Voreinstellungen für Ethernet über UDP ?

Es ist echt schlimm wirklich ein Projekt zum Laufen zu bringen da sucht 
mann im Code nach fehlern dabei ist es nur ne Konfigurationssache.

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

uIP und lwIP habe ich auch noch nicht verwendet.
Die Beschreibungen zu den Konfigurationsmöglichkeiten stehen in der Doku 
zum Stack. Oder in den Beispielen nachschauen.

von Fahri C. (fahrixx)


Angehängte Dateien:

Lesenswert?

So die Implementierung von LWIP läuft zunächstmal. Jetzt habe ich 
wenigstens schonmal ein Grundgerüst wo ich drauf aufbauen kann.

ich habe nun einen LCD 16x2 Display (MFC-C162DNLR-4N-E Hersteller:TRULY 
siehe Datenblatt) an den Evaluation KIT angebunden. Elektrisch nach 
folgendem Schema:

BLA  ----------->  3,8 V
BLK  ----------->  GND
VSS  ----------->  GND
VCC  ----------->  5 V
V0   ----------->  0.3 V (Kontrast)
RS   ----------->  PB5 / C1-
R/W  ----------->  PC2 / TD1
E    ----------->  PC2 / TD0
DB0  ----------->  PB0 / PWM2
DB1  ----------->  PB1 / PWM3
DB2  ----------->  PB2 / I2C0SCL
DB3  ----------->  PB3 / I2CSDA
DB4  ----------->  GND
DB5  ----------->  GND
DB6  ----------->  GND
DB7  ----------->  GND

sollte eigentlich soweit in ordnung sein zumindest läuft es ohne 
probleme bis auf den Kontrast den muss ich noch anpassen da das Display 
noch ein wenig schwach leuchtet.

den Code häng ich auch noch gleich mit dazu, dabei bin ich nach 
folgender Struktur vorgegangen:

1. Pins definieren
2. Pins als Ausgänge setzen
3. Pins auf LOW setzen
4. Interrupt Starten
5. ???
6. ???
7. ???
.
.
.
X.

Schritt 1-4 habe ich mal versucht zu programmieren bin mir aber nicht 
sicher ob ich wirklich auch die richtigen Pins anspreche zumindest 
mekert mein Kompiler nicht.

Die Schritte 5-X sollten dann den eigentlichen Datenverkehr (Senden, 
empfangen von Strings etc.) beinhalten.

Meine Bitte : Könnte jemand mal nachschauen ob ich auf dem richtigen 
Dampfer bin ??

vielen Dank im Voraus

von Fahri C. (fahrixx)


Angehängte Dateien:

Lesenswert?

ich bins mal wieder

ich hab Probleme meine Pins am Evaluation Board zu setzen. Der 
GPIOPinWrite Befehl hat kein effekt die Pins werden nicht gesetzt. Ich 
hab zur Kontrolle paar If Schleifen eingefügt um zu sehen ob sich an den 
Pins überhaupt was tut leider ohne erfolg irgendwie ist der erste Pin 
immer HIGH und die restlichen Pins immer auf LOW. Das Ganze spielt sich 
auf dem PORT E pin 0-4 ab. Ich vermute mal das ich noch eine kleinigkeit 
ergänzen muss ,in der Library beschreibung habe ich aber keine weiteren 
hinweise gefunden.


Kann mir da jemand helfen ???


danke im voraus

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Hast du schon mal an den Pins nachgemessen?
GPIO_PIN_x sind Konstanten. Zum Lesen gibt es die Funktion 
GPIOPinRead():
1
unsigned long pins;
2
pins = GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
3
4
if(pins & GPIO_PIN_0)
5
{
6
  //PIN_0 high
7
}
8
else
9
{
10
  //PIN_0 low
11
}

von Fahri C. (fahrixx)


Lesenswert?

ich hab die Pins am Oszi dran aber da sieht mann es auch das sich nichts 
tut. Ist mein Code von der Syntax her ok ?

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Endlosschleife am Ende von main() fehlt. Kann sein, dass er dann ins 
Nirwana springt.

Lass die Pins am Besten in einer Endlosschleife togglen. Das sieht man 
am Oszi besser, als der kurze Wechsel von Low auf High...
-> Blinky Bsp. aus der DriverLib

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.