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:
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.
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
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 | }
|
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.