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
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.
@ 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
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...
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
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.
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 ??
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.
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
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:
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.
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.
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.
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
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
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