Erweiterbares Ethernetboard mit MMC/SD-Slot und USB

Persönliche Seite #869712
Lesenswert?

Hallo allerseits!

Heute stelle ich Euch ein neues Projekt vor, ein Basisboard für eigene 
AVR-Netzwerkanwendungen. Schon vorhanden sind folgende 
Hardwareeinheiten:
- ATmega128 mit 64 kBytes externem RAM
- Netzwerk-Interface mit dem ENC28J60
- MMC/SD-Interface
- USB-RS232-Wandler FTDI FT232R
- Standard-ISP-Schnittstelle
- Erweiterungssteckerleiste mit I2C, SPI, ADC

Natürlich ist die Idee nicht ganz neu, aber ich wollte es selbermachen. 
Die Herausforderung für mich war aber eher die Software, insbesondere 
der Netzwerkstack. uIP finde ich ziemlich umständlich zu verwenden, vor 
allem wegen einem fehlenden Datenpuffer, so dass die Anwendung für 
Paketwiederholungen die Daten erneut erzeugen muss.

Enthalten sind im Moment also folgende Software-Module:
- Ethernet/MAC, IP, ARP, ICMP-Ping, UDP, TCP
- MMC/SD-Unterstützung mit FAT16 des sd-reader
- SPI, UART, XMEM
- Systemuhr, Timer
- DHCP-Client
- HTTP-Server mit GET/HEAD/POST-Unterstützung und Authorisierung
  Der Server stellt im Moment die Dateien der Speicherkarte ins Netz
  und listet Verzeichnisinhalte auf.
- Periodische Uhr-Synchronisierung übers Netzwerk mit dem
  TIME-Protokoll (RFC868)

Von den 128 kBytes Flash sind inkl. aller Anwendungen und Demos ca. 38 
kBytes belegt. Die RAM-Nutzung ist sehr stark abhängig von der 
Netzwerkkonfiguration. Bei maximal drei TCP-Verbindungen mit 
Pufferspeicher für je ein maximal großes Paket in Sende- und 
Empfangsrichtung werden ca. 13 kBytes benötigt.

Zu finden ist all das unter
    http://www.roland-riegel.de/mega-eth/
Die Quelltexte habe ich auch an diese Nachricht angehängt, den 
Schaltplan und das Layout gibts auf der Website.

Einige Dinge würde ich in der Zukunft noch gerne entwickeln oder 
verbessern:
- einfacher(er) Zugriff auf I/O-Hardware über HTTP, vielleicht mit einer
  simplen Textersetzungs-/Skriptsprache
- ausführlichere Tests bzgl. unterschiedlicher Netzwerkkonfigurationen
- bessere TCP-Flusskontrolle, soweit möglich
- usw.

Viel Spaß damit, Kommentare sind natürlich willkommen.

Gruß,
Roland
Angehängte Dateien:
#869963
Lesenswert?

Hallo,

klasse Projekt. Finde es super das auch andere Leute sich die mühe 
machen und ihren eigenen besseren TCP/IP Stack schreiben als den µIP. 
Ich selber programmiere auch gerade in die selbe Richtung und bin fast 
fertig. Ich hatte vor wenn ich fertig bin mit meinem Studium (ca in 2 
Monaten) das Teil auch online stellen für die Allgemeinheit :-). Solange 
kann ich nur sagen weiter so!!!. Wir können uns ja auch mal austauschen 
wenn du willst, da ich in etwa im selben Stadium stecke wie du.

CA Dirk
Persönliche Seite #870162
Lesenswert?

@Alex,

Nein, Bascom-Quelltexte habe ich keine. Wäre ja auch ein bisschen 
komisch, wenn ich mir die Programmierung nach C nochmal in Basic antun 
würde...

@Dirk,

Kannst meine Quellen ja mal durchsehen, vielleicht hilft Dir ja das ein 
oder andere weiter. Ansonsten einfach ne Mail schreiben.

@Achim,

Nein, im Moment habe ich nicht vor, weitere Platinen herstellen zu 
lassen. Mein eigenes Board beruht noch auf der geringfügig fehlerhaften 
Revision 1.0. Davon habe ich hier noch drei rumliegen, gefertigt bei 
Haka. Bei Interesse würde ich die zum Selbstkostenpreis von ca. 15 Euro 
abgeben. Einfach eine Mail an feedback(at)roland-riegel.de, Zuschlag 
nach Reihenfolge des Eingangs.

Bei der alten Revision 1.0 ist
1. die Spannungsbuchse ein klein wenig zu weit rechts, so dass das 
Bohrloch ein wenig verdeckt wird (zumindest mit meiner Buchse), und
2. beim ISP-Stecker die MISO/MOSI-Leitungen vertauscht, was man mit zwei 
kurzen Brücken auf der Rückseite korrigieren muss.

Gruß,
Roland
Persönliche Seite #874821
Lesenswert?

Hier ein kleines Software-Update zur ursprünglichen Version.

Die Änderungen sind vor allem im FAT16-Code zu finden. Neben 
Optimierungen der Codegröße werden jetzt vor allem Verzeichnisse 
schneller durchsucht. Dies hilft auch dem HTTP-Server auf die Sprünge, 
der deshalb zuvor bei gut gefüllten Verzeichnissen recht träge 
antwortete.

Gruß,
Roland
Angehängte Dateien:
Gast #892277
Lesenswert?

Hi, hast du vielleicht eine Bauteilliste? Würd das gerne nachbaun und in 
Betrieb nehmen. Hab schon länger nach sowas gesucht. Aber Bauteile wie 
den FB2022 finde ich hier in Österreich nirgends.

Mfg, Donald
#1214514
Lesenswert?

Hallo

ich hab mir passend dazu eine Schnittstellen-Schaltkarte gebaut ...

und passe gerade meine Software an ... und
irgendwie komme ich da in eine Begrenzung ..

Anbei der Code, wenn ich im Bereich von

 HTTPD_MODULE_REASON_HANDLE_REQUEST_CONTINUE

den Maximalwert von sbx auf 4 setze geht alles pirma
bei 8 bleibt er irgendwo hängen, obwohl ich keine
Stelle gefunden habe, wo der Speicher überlaufen kann, *)
es kommen auch nur 5 (statt 8) Zeilen im Bauser an ...


Irgend eine Idee, was da schief laufen kann ... komm
grad nicht weiter und falls ins Bett :-)

LG
Vajk

*(denke da an hpptd_session.c / httpd_session_write_content_P hier 
buffer 32, aber gequeed)
Angehängte Dateien:
Persönliche Seite #1214684
Lesenswert?

Hallo Vajk,

Du kannst nicht endlos Daten mit httpd_session_write_content() 
rausschreiben. Dafür ist der Puffer zu klein, denn die Daten werden ja 
erst nach Verlassen der Funktion verschickt. Den freien Platz kannst Du 
mit httpd_session_get_write_buffer_size() in Erfahrung bringen.

Falls Du mehr Daten senden willst, musst Du Dir die aktuelle Position 
merken und von dort fortsetzen, wenn der Callback wieder mit 
HTTPD_MODULE_REASON_HANDLE_REQUEST_CONTINUE aufgerufen wird. Dafür 
solltest Du auch den Rückgabewert von httpd_session_write_content() 
verwenden. Erst wenn Du httpd_session_end_content() und 
httpd_session_close() aufrufst, wird der Callback nicht mehr aufgerufen 
und die TCP-Verbindung geschlossen.

Für ein Beispiel schau Dir auch mal httpd_module_file_callback() an. 
Hier werden die Dateien der Speicherkarte stückweise rausgeschickt.

Gruß,
Roland
#1216468
Lesenswert?

Hallo Roland,

jetzt hab ich das alles mal geändert ...

.. und geht .. nur nach dem zweiten oder dritten Zugriff (Klick) gehts 
manchmal super lange oder wird gar nicht verarbeitet ... bleibt aber 
nicht hängen auf der Konsole .. irgend eine Idee, woran das noch
liegen könnte oder ist der atmel einfach überlastet
mit zwei bis drei zu verarbeitenden klicks ....

Und noch ne Fragen, kann man die Url verändern, die zum browser geht ?

LG
Vajk
Angehängte Dateien:
Persönliche Seite #1216530
Lesenswert?

Hallo Vajk,

> jetzt hab ich das alles mal geändert ...

Das sieht prinzipiell schon ganz gut aus. Ich hätte die Infos zum 
Schalten der Portzustände allerdings per GET-Parameter in der URL 
angegeben, aber das ist nur ein Detail.

> .. und geht .. nur nach dem zweiten oder dritten Zugriff (Klick) gehts
> manchmal super lange oder wird gar nicht verarbeitet ... bleibt aber
> nicht hängen auf der Konsole ..

Nach dem Abrufen einer Seite wird die dazugehörige HTTPD-Session bzw. 
die TCP-Verbindung erst nach einigen Sekunden geschlossen. Bei vielen 
Anfragen schnell hintereinander gehen die TCP-Sockets und/oder die 
HTTPD-Sessions aus, weshalb der ATmega dann erst bei eventuellen 
Retransmits des Browsers reagiert (oder bei einem Timeout eben gar nicht 
mehr).

Je nach RAM-Ausstattung kannst Du die Anzahl der 
TCP-Sockets/-Verbindungen und der HTTPD-Sessions erhöhen:
- TCP_MAX_SOCKET_COUNT/TCP_MAX_CONNECTION_COUNT in tcp_config.h
- HTTPD_MAX_SESSIONS in httpd_config.h

Alternativ oder zusätzlich kannst Du auch das Warteintervall des 
TCP-Protokolls verringern, nach dem die Sockets freigegeben werden und 
somit für neue Verbindungen zur Verfügung stehen:
- TCP_TIMEOUT_TIME_WAIT in tcp_config.h

> Und noch ne Fragen, kann man die Url verändern, die zum browser geht ?

Meinst Du diese Versuche in Deinem Code?
  strcpy(session->uri,       "/");
  strcpy(session->arguments, "\0");

Wenn Du damit den Browser umleiten willst, geht das so nicht. 
Stattdessen musst Du in der Antwort einen "Location:"-Header angeben 
(siehe die vorhandenen Beispielmodule und HTTP-RFCs). Aber warum willst 
Du überhaupt umleiten?

Gruß,
Roland
#1216541
Lesenswert?

Hallo Roland,

> Das sieht prinzipiell schon ganz gut aus. Ich hätte die Infos zum
> Schalten der Portzustände allerdings per GET-Parameter in der URL
> angegeben, aber das ist nur ein Detail.

ja wollte ich auch, aber das doofe ? mag ich nicht und post ging im 
beispielcode, aber dann nicht mehr ...

.. und "links zum klicken" sind "smarter" und "links"-verträglicher 
(Konsolenbrowser).

Danke für die Tipps.

>> Und noch ne Fragen, kann man die Url verändern, die zum browser geht ?
> Meinst Du diese Versuche in Deinem Code?
> Wenn Du damit den Browser umleiten willst, geht das so nicht.
ne ging mir nur um das Säubern der url-Zeile.

Herzlichen Dank
Vajk
#1376154
Lesenswert?

Ich habe gerade angefangen mich in dieses Projekt einzulesen. Exzellente 
Arbeit!

Das AVR-Studio mag aber mit dem makefile nicht richtig umgehen und wirft 
die bekannte Meldung "Object file not found on expected location".

Deswegen habe ich ein Projektfile fürs Studio und einen Patch angehängt, 
evtl. hilft das dem einen oder anderen. Die richtigen Einstellungen fürs 
XMEM waren gar nicht so einfach zu finden.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren