Start : Mini-Ethernet

Mini-Ethernet

MiniEthernet
Der Prototyp von MiniEthernet, unverpackt und provisorisch verkabelt

Dieses Elektronikprojekt hat zum Ziel, ohne einen PC E-Mails abrufen, lesen und senden zu können, also ein kleines Kästchen zu bauen, das ans Ethernet angeschlossen wird und dann als E-Mail-Client fungiert. Zusätzlich soll das E-Mail-Konto in regelmäßigen Abständen abgerufen werden und eine Benachrichtigung bei neuen E-Mails erfolgen. Eventuell könnte auch noch ein kleiner Chatclient eingebaut werden.

Die wesentlichen Bestandteile dieses Projektes sind:

  • ein AVR Mikrocontroller ATmega32 von Atmel
  • ein ENC 28J60 von Microchip als Ethernet-Controller
  • ein grafisches LC-Display mit 128*64 Pixeln
  • eine stinknormale PS/2-Tastatur zur Eingabe

Die Programmierung des Mikrocontrollers erfolgt über eine ISP10-kompatible Schnittstelle so wie beim Digital-Thermometer beschrieben. Auf den ENC 28J60 bin ich über das Forum von http://www.mikrocontroller.net/ gekommen, wo sich inzwischen mehrere Diskussionen (und Projekte) mit diesem IC befassen.

Neuigkeiten

14.06.2006: Inzwischen gibt es bei csd-electronics auch den unten erwähnten ATmega644. Damit stehen der Erweiterung der Firmware neue Möglichkeiten offen. Außerdem hat Adam Dunkels vor wenigen Tagen eine neue Version (die 1.0) seines TCP/IP-Stacks uIP veröffentlicht.

Elektronik (Hardware)

Beginnen wir mit dem Schaltplan:

Schaltplan

Die benötigten Bauteile habe ich im wesentlichen von Reichelt, bis auf die Teile, die es dort nicht gibt: Den ENC 28J60 und den 25 MHz-Quarz im Grundton sowie den Übertrager (LF...). Alle diese Teile sind aber günstig und mit sehr geringen Versandkosten bei http://www.csd-electronics.de/ erhältlich. Insgesamt belaufen sich die Kosten ohne das LCD auf etwa 25 bis 30 Euro.

Es sei darauf hingewiesen, dass im Schaltplan an einigen Stellen zwei Alternativen angegeben sind:
1. Als Taktgeber für den ENC kann sowohl ein 25 MHz Quarz (Grundton!) oder ein 25 MHz Oszillator verwendet werden. Ich habe nur ersteres ausprobiert. Den erforderlichen Quarz gibt es (s.o.) bei http://www.csd-electronics.de/. Bei Verwendung eines Quarzes kann auch der 74LVX32 entfallen, weshalb sich diese Variante empfiehlt.
2. Weiterhin sind R1 und R12 alternativ. Je nach Revision des ENC wird hier ein unterschiedlicher Wert benötigt. Im ursprünglichen Datenblatt wird ein 2000-Ohm Widerstand verlangt, ab Revision B4 (also etwa ab Februar 2006) wird ein 2700 Ohm-Widerstand (beide mit 1 % Toleranz) benötigt (siehe Microchip ENC 28J60 Silicon Errata B4).

Die Datenleitungen und die Adressleitungen können jeweils beliebig vertauscht ans SRAM angeschlossen werden, wodurch man sich das Platinenlayout vereinfacht (aber wem sag ich das...). Statt VCC mit +5V zu verbinden, gibt es sicher ne sinnvollere Lösung, aber es ging. Wer mag, kann dem ENC noch ein paar 100 nF Kondensatoren gönnen, da im Datenblatt empfohlen, alle VDD/VSS-Paare mit jeweils einem Kondensator auszustatten Ich habe diese bei mir eingelötet, aber nicht extra im Schaltplan aufgeführt.

Die RS232-Schnittstelle dient zur Ausgabe von Debuginformationen an einen PC und kann im Prinzip weggelassen werden, wenn denn alles funktioniert. Nicht so einfach weggelassen werden kann der MAX232, da ich von diesem die negative Spannung verwende, um damit das LCD zu betreiben. Da müsste also ein entsprechender Ersatz eingebaut werden, wenn kein RS232 auf die Platine soll. Ich bin mir übrigens nicht 100%ig sicher, ob der BS250 richtigrum eingezeichnet ist, also überprüft das lieber nochmal, wenn ihr die Schaltung nachbaut. Sollte aber so stimmen. Die Leuchtdioden, die direkt an den ENC angeschlossen werden, sollten low-current LEDs sein, da die Ausgänge (laut Datenblatt) einen maximalen Strom von 12 mA verkraften, oder aber die Widerstände müssen entsprechend groß genug gewählt werden.

Eine Anmerkung noch zum Schluss: Der ENC wird im Betrieb leicht warm, das ist aber normal.

Die μC-Software

Die Software für den Mikrocontroller ist in C geschrieben und mit avr-gcc aus WinAVR-Suite kompiliert. Als Grundlage für den TCP/IP-Stack habe ich uIP von Adam Dunkels verwendet, und für meine Belange angepasst. Dieser TCP/IP-Stack hat den Vorteil, dass er im Gegensatz zu vielen anderen die volle TCP-Funktionalität bietet. Die größten Anpassungen ergaben sich daraus, dass der ATmega nur 2048 Byte internes SRAM hat, so dass ich nie ein ganzes Paket auf einmal im Speicher halten kann (will). Statt dessen lädt der TCP/IP-Stack nur den Header der Pakete aus dem Speicher des ENC und verarbeitet diesen. Die Applikationen können dann über eine weitere Funktion den Inhalt des Pakets (pay load) aus dem ENC-SRAM in das externe SRAM laden und dort darauf zugreifen.

Neben TCP/IP, ARP und ICMP ist UDP implementiert, um DNS-Abfragen zu ermöglichen. Außerdem lässt sich dann SNTP verwenden, um die aktuelle Uhrzeit von Zeitservern aus dem Internet abzufragen. Darauf aufbauend sind dann die für den Mailtransfer wesentlichen Protokollen POP3 und SMTP implementiert.

Insgesamt umfasst die Software, die sich noch im Erprobungstadium befindet und deshalb gespickt ist mit Debug-Anweisungen, jetzt etwa 27 kB, womit der Programmspeicher des ATmega32 (32 kB) fast gefüllt ist. Ich überlege deshalb, auf den pinkompatiblen ATmega 644 umzusteigen, der allerdings leider noch nicht erhältlich ist. Dieser bietet von allem das Doppelte: 64 kB Flash, 4 kB SRAM und 2 kB EEPROM. Außerdem wäre es vielleicht sinnvoll, ein externes EEPROM anzuschließen, das über SPI angesteuert werden könnte, und in dem Daten wie eine Liste der IDs der bereits bekannten Mails o.ä. abgelegt werden könnten (= Implementierung des UIDL-Kommandos des POP3-Protokolls).

Features der Software

Screenshot des E-Mail-Menüs
Bildschirmfoto des E-Mail-Menüs

(Fähigkeiten und Eigenschaften)

Das kann die Software bisher (mit eventuell noch ein paar Bugs):

Internet
  • Ansteuerung des ENC 28J60 über die SPI-Schnittstelle
  • Implementierung des IP (internet protocol)
  • Implementierung des ICMP (internet control message protocol, d.h. ME antwortet auf ping)
  • Implementierung des ARP (address resolution protocol)
  • Implementierung des TCP (transmission control protocol)
  • Implementierung des UDP (user datagram protocol, ohne Prüfsummen, die hier aber umgangen werden können)
  • Implementierung von DNS-Abfragen
  • Implementierung von SNTP-Abfragen
  • Versenden von Mails mittels SMTP (simple mail transfer protocol)
  • Abrufen von Mails mittels POP3 (post office protocol version 3)
Bedienung, Nutzerschnittstelle
  • Textdarstellung auf dem LCD
  • Flexible Menüführung
  • Einzeilige Eingabefelder
  • Texteditor mit automatischen Zeilenumbruch (word wrapping)
  • Tastaturansteuerung über die PS/2-Schnittstelle
  • Ansteuerung und Verwaltung von 128 kB externem SRAM
  • Speichern der Konfiguration ins EEPROM

Informationen zu den Protokollen gibt es in der Wikipedia, und aus erster Hand natürlich in den wichtigen RFCs: 791 (IP), 792 (ICMP), 793 (TCP), 821 (SMTP), 826 (ARP), 1035 (DNS), 1769 (SNTP), 1939 (POP3) und 2821 (SMTP neu).

Sehr hilfreich sind (abgesehen von den Datenblättern des ATmega und des ENC natürlich :) auch die Application Notes von Atmel bezüglich des Anschlusses von PS/2-Tastaturen an AVR Mikrocontroller (AVR313) und zur Ansteuerung von seriellen Speichern über die SPI-Schnittstelle (AVR107), die von der Atmel-Homepage heruntergeladen werden können.

Download

Den Schaltplan gibt's oben, hier die Software. Wer den Quellcode der Firmware haben möchte, muss mir bitte eine Mail schreiben, da ich den noch nicht im Internet veröffentlichen möchte.

  • Firmware (hex als rar-Archiv, 26 kB): die Software für den ATmega 32
  • Character Generator (exe als rar-Archiv, 160 kB): ein kleines Delphi-Tool zum einfachen Zeichnen, Darstellen und Exportieren der Zeichensätze für das LCD, ich verwende zur Zeit einen 6*8 Font. Die Software ist intuitiv zu bedienen, deshalb gibts erstmal keine Doku. Sie lädt und speichert eine Datei namens font.chr aus dem aktuellen Verzeichnis, in der der Zeichensatz gespeichert ist, ein Beispiel ist mitgeliefert. Die Anzeige des gesamten Zeichensatzes wird immer erst aktualisiert, wenn man auf "show all" klickt. (Das Nutzerinterface ist in konsequentem Denglisch gehalten :)

Copyright: Copyright auf die Ideen, den Schaltungsentwurf und die Software behalte ich mir vor. Insbesondere ist die kommerzielle Nutzung der hier vorgestellten und zum Download angebotenen Hard- und Software untersagt. Der uIP-Stack von Adam Dunkels, auf dem mein TCP-Stack basiert, ist unter der Lizenz veröffentlicht, die unter http://www.sics.se/~adam/uip/license.html eingesehen werden kann.

Wichtig: Die Verwendung der Inhalte dieser Seite erfolgt absolut auf eigene Gefahr. (siehe unten)

Zukunftspläne

Ich habe leider keine Zeit mehr, die Software noch weiter zu entwickeln, werde das aber irgendwann sicher nachholen. Die grundlegende Funktionalität ist aber gegeben und läuft auch stabil, wenn ich auch zugeben muss, sie bisher nur mit meinem lokalen Mailserver und ein paar wenige Mal auch mit gmx getestet zu haben, was ich noch nicht als Test "auf Herz und Nieren" bezeichnen würde. Was ich aber als weitere Pläne (in ferner Zukunft :) ins Auge gefasst habe ist:

  • MIME-Dekodierung - vereinfacht das Lesen von mancher Mails doch sehr...
  • DHCP implementieren
  • MD5 implementieren, um statt PASS APOP zu verwenden, damit das Passwort nicht mehr im Klartext übertragen wird. Scheitert zur Zeit noch am hohen Speicherplatzbedarf der MD5-Berechnung, da hierfür mit 32 bit-Integern hantiert werden muss (~7 kB)
  • Hat mal jemand probiert, einen gaaaaanz rudimentären IRC-Server auf einen AVR zu bringen? Wär doch mal ein nettes Projekt. :)
  • Und wenn das mit dem IRC-Server nicht klappt, so könnte man zumindest (wie bereits in der Einleitung erwähnt) einen IRC-Client implementieren, was im Vergleich zu dem E-Mail-Client sogar relativ einfach sein sollte, wenn man sich z.B. auf einen Channel beschränkt.

Zum Weiterlesen

Auf der Homepage von Circuit Cellar gibt es eine ausführliche Beschreibung meines Projekts (auf englisch), mit dem ich dort unter dem Titel "MiniEmail" am Atmel AVR Design Contest 2006 teilgenommen habe.

This is also a recommendation for English speaking visitors of this page who will find a detailed description of MiniEthernet in English on this page.

Fragen & Antworten (FAQ)

? Im Errata-Sheet zum ENC 28J60 (Rev. B4) steht, dass man den SPI-Bus mit 8 MHz takten muss. Ist das wirklich so kritisch?
: Ich verwende zur Zeit 4 MHz, wobei der ATmega auch 8 MHz unterstützt. Ich habe zwar ein Problem mit LATECOL-Fehlern (vgl. Datenblatt des ENC), die insbesondere aber nur bei TCP-Paketen mit fehlerhafter Prüfsumme und seltsamerweise auch im Full Duplex Modus auftreten, in welchem dies nach Datenblatt des ENC28J60 nicht passieren dürfte. Ich habe ein Workaround gefunden, das zwar nicht schön ist, aber funktioniert. Ob dieses Problem etwas mit dem SPI-Takt zu tun hat, kann nicht sagen, und glaube es eigentlich auch nicht. Ansonsten traten bei mir keinerlei Probleme in der Kommunikation ATmega <-> ENC auf. Anm.: Inzwischen habe ich aber die Frequenz auf 8 MHz raufgestellt, ohne dass sich etwas geändert hätte.

? Nichts tut sich!?!
: Was ich fast vergessen hätte: Die Software nimmt einige Einstellungen aus dem EEPROM, das vor Inbetriebnahme über avrdude programmiert werden muss. In der Notation "Speicherstelle=Wert" müssen folgende Werte im EEPROM stehen:
13=0, 14=16 (dies entspricht einer USART-Baudrate von 57600 kbit/s)
21=1, 22=34 (dieser Wert wird ins PHLCON-Register des ENC geschrieben, Näheres zur LED-Konfiguration siehe Datenblatt des ENC)
15=0, 20=1 (diese Werte sind Einstellungen zu Debugzwecken und sollten nicht verändert werden)


Abschließende Worte

Der Aufbau und insbesondere der Anschluss an den PC (zum Programmieren, Debuggen etc.) ist natürlich absolut auf eigene Gefahr durchzuführen. Ich übernehme keine Verantwortung für eventuelle Fehler oder Schwachstellen der Schaltung und der Software.

Abschließend möchte ich mich noch ganz besonders bei Marc bedanken, der mir eine sehr schöne Platine geätzt und gebohrt hat, ohne die ich das Projekt sicher nicht so schnell in die Realität hätte umsetzen können.

Für Fragen, Anregungen und Kommentare bin ich immer offen -> Mail schreiben . Ich beantworte alle Mails (zumindest die mit gültiger Antwortadresse...), aber da die Antworten meist etwas Aufwand erfordern, schaffe ich es meist erst am nächsten Wochenende.

<-- zurück zur Startseite

Zähler seit 03.05.2006