Hallo Leute.:)
Nachdem ich mich nun seit längerer Zeit mit Mikrocontrollern
beschäftige, wollte ich den Versuch wagen, meinen Atmega ans
Heimnetzwerk anzuschließen, um verschiedene Ports über das LAN an- und
auszuschalten. (-> Webserver)
Hierfür habe ich mir vor einiger Zeit ein ENC28J60-Modul aus China
bestellt. Es enthält den oben genannten Netzwerkcontroller, sowie den
25MHz Quarz, einen MAG-JACK sowie einige Kondensatoren.
Ich habe mich sowohl hard- als auch softwaretechnisch relativ nah an den
Webserver von Ulrich Radig gehalten.
http://www.ulrichradig.de/home/index.php/avr/eth_m32_ex
Der Anschluss des Moduls erfolgt über eine 12-polige Stiftleiste. Zur
Visualisierung habe ich eine kleine Schaltskizze erstellt, die den
Anschluss der Stiftleiste an den Atmega verdeutlicht. (Verwendet habe
ich einen Atmega 32 mit externem 16MHz Quarz). Die Grundbeschaltung des
Atmega 32 mit den diversen Abblockkondensatoren und der Herstellung
einer stabilen 5 Volt Spannungsversorgung ist selbstverständlich
vorhanden, auch wenn sie in der Schaltskizze nicht dargestellt sind. Der
Anschluss ist somit ähnlich wie in dem Schaltplan von Ulrich Radig, der
PORTB wurde hierzu verwendet.
Um zu sehen, ob die Beschaltung funktioniert, habe ich den Quellcode an
mein Netzwerk angepasst und die IP-Adresse und ähnliches in der Datei
config.h geändert, den Quellcode kompiliert und in den Atmega geflasht.
Nun habe ich den Mikrocontroller an den Router angeschlossen - eine
Verbindung zum Mikrocontroller konnte vom PC jedoch nicht aufgebaut
werden.
Da dies also nicht funktioniert, habe ich einwenig im Internet
recherchiert und folgende Anleitung zum AVR-Webserver gefunden:
http://www.ov-lennestadt.de/projekte/webserver/FiFi-Webserver_Hardwaredokumentation.pdf
Demnach soll der Webserver mittels Crossover-Ethernetkabel direkt mit
dem PC verbunden werden. Danach die IP-Adresse des PCs über das
Netzwerkcenter manuell ändern sowie die Netzwerkgeschwindigkeit auf 10
Mbit/s einstellen.
Es kann jedoch immer noch keine Verbindung zum Mikrocontroller aufgebaut
werden.
Zu dem Modul: Das ENC-Modul enthält eine rote SMD-LED (Power-On-LED?)
die durchgehend leuchtet, sowie eine gelbe und eine grüne LED direkt am
Magjack. Steckt man das Netzwerkkabel in den Magjack blinken anfangs
beide Leds in unregelmäßigen Abständen, nach einiger Zeit bleibt die
grüne LED durchgehend an, die gelbe LED blinkt jedoch in unregelmäßigen
Abständen weiter.
Die Spannungsversorgungen von 5 Volt und von 3,3 Volt laufen jeweils
stabil, daran sollte es somit nicht liegen.
Ich bedanke mich bereits jetzt für die Aufnahme ins Forum und freue mich
auf jede Hilfe, die ich kriegen kann, in der Hoffnung, dass mein Problem
gelöst werden kann.
Falls weitere Informationen benötigt werden, sagt bescheid und ich
antworte, sobald ich es sehe.
Mit freundlichen Grüßen
Marcel
Morpheus schrieb:> Um zu sehen, ob die Beschaltung funktioniert, habe ich den Quellcode an> mein Netzwerk angepasst und die IP-Adresse und ähnliches in der Datei> config.h geändert
Ja, auf was genau denn? Und wie ist die Konfiguration deines LAN?
> Demnach soll der Webserver mittels Crossover-Ethernetkabel direkt mit> dem PC verbunden werden. Danach die IP-Adresse des PCs über das> Netzwerkcenter manuell ändern sowie die Netzwerkgeschwindigkeit auf 10> Mbit/s einstellen.
Beides ist nicht nötig. Wenn man die Netzwerkparameter korrekt
konfiguriert hat, kann so ein Teil natürlich auch mit einem
stinknormalen Patchkabel an einen stinknormalen LAN-Port des Routers im
heimischen LAN angeschlossen werden.
Dir fehlt höchstwahrscheinlich nur das grundlegenden Verständnis der
Funktionsweise eines IP-Netzwerks. Sonst hättest du schon von dir aus
die nötigen Angaben zu Konfiguration gepostet.
Also, man braucht im Minimum:
Netzwerkadresse des Routers
Netzwerkmaske des LAN
Adressbereich des DHCP-Servers im Router
Aus diesen drei Angaben kann man dann errechnen, welche Adressen im
Netzwerk noch frei sind und eine dieser freien Adressen dem neuen Teil
geben. Und die Netzwerkmaske des AVR/ENC-Teils muß natürlich im
einfachsten Fall genau dieselbe sein, wie die auf dem Router
konfigurierte.
Mit diesen zwei Sachen sind eigentlich schon alle Konfigurationen
erledigt, die nötig sind, um das Teil über seine IP-Adresse aus dem LAN
erreichen zu können. Wenn es hingegen auch "von außen" erreichbar sein
soll und/oder über einen DNS-Namen, ist noch etwas mehr Konfiguration
nötig, aber das ist dann schon wieder ein anderes Thema.
c-hater schrieb:> Dir fehlt höchstwahrscheinlich nur das grundlegenden Verständnis der> Funktionsweise eines IP-Netzwerks.
Das kann gut sein, weil ich mich zum ersten Mal wirklich mit Netzwerken
auseinandersetze.
Die Netzwerkadresse des Routers lautet 192.168.2.1, die Netzmaske
255.255.255.0
(cmd-> ipconfig)
Korrigiert mich, wenn ich falsch liege, aber das heißt doch, dass ich
dem Webserver nun eine IP-Adresse 192.168.2.x geben kann, die allerdings
noch nicht vergeben ist.
Da wir noch weitere PCs, Drucker etc. am Router angeschlossen haben,
habe ich nun mit dem Befehl arp /a bei cmd geschaut, welche IP-Adressen
schon vergeben sind. Alle anderen IP-Adressen nach dem obengenannten
Muster sollten demnach frei sein.
Die Änderungen in der Datei config.h sehen somit folgendermaßen aus.
(Oder muss ich in der Datei sonst noch etwas ändern?)
1
//IP des Webservers und des Routers
2
#define MYIP IP(192,168,2,99)
3
#define ROUTER_IP IP(192,168,2,1)
4
5
//Netzwerkmaske
6
#define NETMASK IP(255,255,255,0)
7
8
//Art-Net
9
#define USE_ARTNET 0
10
11
//DHCP-Server
12
#define USE_DHCP 0 //1 = DHCP Client on
13
14
//DNS-Server
15
#define USE_DNS 0 //1 = DNS Client on
16
#define DNS_IP IP(192,168,2,1)
17
18
19
//IP des NTP-Servers z.B. Server 1.de.pool.ntp.org
Hast du denn auch eine MAC Adresse festgelegt?
Kannst du das Modul anpingen?
Egal ob ja oder nein, erscheint die MAC Adresse danach in der arp
Tabelle des Routers (bzw. PC bei Direktanschluss)?
Was genau meinst du mit "Verbindung zum Mikrocontroller konnte vom PC
jedoch nicht aufgebaut werden"?
Welche Verbindung, welches Protokoll, welcher Port, mit welchem Programm
und welche Fehlermeldung erhälst du?
Schaffe Dir eine Möglichkeit, Debug Meldungen zu loggen, z.B. wie dort
beschrieben: http://stefanfrings.de/avr_hello_world/index.html
Dann ändere die Software des AVR so ab, dass du jedes Ethernet Paket
mitloggst, dass an den Ethernet Controller gesendet oder von ihm
empfangen wird. Zumindest die Größe und die ersten 20 Bytes als
Hex-Dump.
Dann kannst du unter Umgehung des TCP/IP Protokolls und ohne Router mal
Pakete direkt an die MAC Adresse senden:
arp -s 192.168.2.88 xx-xx-xx-xx-xx-xx (MAC Adresse)
ping 192.168.2.88
Die IP Adresse kann ruhig falsch sein, Hauptsache sie ist frei. Dein
Computer sendet dann Pakete an diese MAC Adresse. Die werden
(hoffentlich) vom Ethernet Controller empfangen, was deine Log-Meldungen
anzeigen sollten. Ob die Pings beantwortet werden, ist dabei erstmal
egal. Du sollst nur prüfen, ob die Kommunikation vom PC zum Ethernet
Conroller auf MAC Ebene funktioniert.
Der PC sollte auch per Kabel angeschlossen sein, um andere Seiteneffekte
durch fehlerhaftes Routing auszuschließen.
Stefan Us schrieb:> Was genau meinst du mit "Verbindung zum Mikrocontroller konnte vom PC> jedoch nicht aufgebaut werden"?
Theoretisch sollte es ja so sein, dass wenn der Webserver funktioniert
und alles erfolgreich konfiguriert ist, dass man dann im Browser die
IP-Adresse des Webservers eingibt und man erhält Zugang zu der
dynamischen Webseite, die auf dem Mikrocontroller gespeichert ist.
Ich bekomme jedoch die Fehlermeldung "Diese Webseite ist nicht
verfügbar."
Das Anpingen über cmd funktioniert auch nicht ("Zielhost nicht
erreichbar").
Verbinde ich den Webserver direkt mit dem PC, dann wird mir in der
Taskleiste auch angezeigt, dass keine Internetverbindung aufgebaut
werden kann, bzw das eine unbekannte Verbindung vorliegt.
Die MAC-Adresse des Webservers legt man doch auch mit
1
//MAC Adresse des Webservers
2
#define MYMAC1 0x00
3
[...]
fest oder? Jedenfalls wird die MAC-Adresse auch nicht in der arp-Tabelle
angezeigt.
Für die Debug-Lösung steige ich momentan leider noch nicht genug durch
die Software von Ulrich Radig durch. Ich setze mich jedoch heute
intensiv mit dieser auseinander und versuche diese - zumindest soweit
wie nötig - zu verstehen.
Ich besitze leider kein USB-UART-Kabel, aber Debug-Meldungen kann ich ja
prinzipiell auch über ein LCD am Mikrocontroller anzeigen oder?
@Stefan US: Ich hoffe damit deine Fragen alle beantwortet zu haben.
Mfg Marcel
Die Grüne und gelbe LED zeigen erstmal an, dass grundsäzlich eine
Verbindung zum Router besteht, die eine zeigt an, dass die
Verbindung/Link aufgebaut wurde, die andere blinkt, wenn Daten
übertragen werden. Der Router sollte auch eine LED haben, die
irgendetwas (je nach Hersteller) macht, wenn das Kabel zum AVR
angeschlossen wird.
Ansonsten Wireshark auf dem PC installieren und mal einen Ping an den
ATMEL senden.
Dann siehst Du, ob der überhaupt was antwortet und der ARP Request des
PC vom Atmel beantwortet wird.
Evtl. mal USE_DHCP auf 1 setzen, dann müsste der Atmel sich nach einem
RESET zumindest mal im Netzwerk melden, was Wireshark anzeigen sollte.
Manchmal lohnt es sich, bei neuen Versuchen einfach mal ein paar Minuten
zu warten, bis alle automatisch generierten Tabellen wieder gelöscht
sind.
Gruss
Axel
Morpheus schrieb:> Die Netzwerkadresse des Routers lautet 192.168.2.1, die Netzmaske> 255.255.255.0> (cmd-> ipconfig)>> Korrigiert mich, wenn ich falsch liege, aber das heißt doch, dass ich> dem Webserver nun eine IP-Adresse 192.168.2.x geben kann, die allerdings> noch nicht vergeben ist.
So ist es.
> Da wir noch weitere PCs, Drucker etc. am Router angeschlossen haben,> habe ich nun mit dem Befehl arp /a bei cmd geschaut, welche IP-Adressen> schon vergeben sind.
Vorsicht, arp ist sehr vergesslich, der ARP-Cache hat keine lange
Verweilzeit. Wenn du die Befehle alle von Hand eingetippt hast, ist sehr
gut möglich, dass zwei Drittel der Ergebnisse schon wieder aus dem Cache
raus waren, bevor du ihn dir hast anzeigen lassen. Außerdem ist es in
einer DHCP-Umgebung natürlich jederzeit möglich, dass sich Adressen
ändern.
Auf der sicheren Seite bist du deshalb nur dann, wenn du dem DHCP-Server
des Routers die Angabe entlockst, welchen Bereich er vergibt. Bei den
meisten Routern ist es kein Problem, sich das zumindest anzeigen zu
lassen, bei vielen läßt es sich sogar konfigurieren.
> Die Änderungen in der Datei config.h sehen somit folgendermaßen aus.
[...]
Unter der Voraussetzung, dass 192.168.2.99 wirklich frei ist, sieht das
ziemlich korrekt aus.
Übrigens: Was hast du mit CIS Technology Inc. zu tun? Denen gehört
nämlich die MAC, die du deinem AVR/ENC-Gespann verpaßt hast. Die hast du
doch hoffentlich nicht einfach von irgendeinem Gerät übernommen, welches
in deinem LAN tatsächlich existiert? Dann bräuchtest du dich über
Probleme allerdings nicht zu wundern...
LCD Displays eignen sich kaum zur Anzeige von Debug Meldungen. Erstens
sind sie (in der Regel) viel zu klein und zweiten fehlt Dir die
Möglichkeit, zurück zu scrollen.
Ohne Debug-Log solltest du gar nicht erst versuchen, einen Webserver zu
programmieren. Das endet nur mit Zeitverschwendung.
> Für die Debug-Lösung steige ich momentan leider noch nicht> genug durch die Software von Ulrich Radig durch.
Aber printf (in Kombination mit meiner Library) kannst du anwenden, oder
etwa nicht? Wenn nicht, dann lerne das erstmal.
Axel Laufenberg schrieb:> Ansonsten Wireshark auf dem PC installieren und mal einen Ping an den> ATMEL senden.
Habe ich gemacht, und den Capturing Modus gestartet, doch die IP-Adresse
wird auch hier nicht angezeigt. Wie genau sende ich mit dem Programm den
einen Ping an eine bestimmte IP-Adresse?
c-hater schrieb:> Übrigens: Was hast du mit CIS Technology Inc. zu tun? Denen gehört> nämlich die MAC, die du deinem AVR/ENC-Gespann verpaßt hast. Die hast du> doch hoffentlich nicht einfach von irgendeinem Gerät übernommen, welches> in deinem LAN tatsächlich existiert? Dann bräuchtest du dich über> Probleme allerdings nicht zu wundern...
Hm... also die MAC-Adressen waren so in dem Programm standardmäßig
eingestellt, daran habe ich nichts geändert. (Siehe:
http://www.ulrichradig.de/home/index.php/avr/eth_m32_ex)
zuerst den lowlevel-Teil testen. Funktioniert spi und wird die
mac-adresse richtig auf den enc übertragen, z.B. so:
1
// NOTE: MAC address in ENC28J60 is byte-backward
2
enc28j60Write(MAADR5,MYMAC1);
3
enc28j60Write(MAADR4,MYMAC2);
4
enc28j60Write(MAADR3,MYMAC3);
5
enc28j60Write(MAADR2,MYMAC4);
6
enc28j60Write(MAADR1,MYMAC5);
7
enc28j60Write(MAADR0,MYMAC6);
8
9
u8x=0;
10
x=enc28j60Read(MAADR1);
11
if(x!=MYMAC5){
12
lgw(2,1,"ERr mac5: ");li(x);lw("-");li(MYMAC5);
13
wait;wait;wait;wait;wait;
14
}
Dann den stack testen. Funtionieren die Timer -arp und http? Schauen was
bei eth_get_data() ankommt. eth_get_data() geht entweder über polling
oder über interrupt ?
Andieser Stelle werden Daten vom enc ausgewertet:
KA123 schrieb:> Das ganze kann nicht gehen, weil der Controller nicht versorgt ist.
Der Schaltplan oben ist wie gesagt nur eine Skizze, selbst verständlich
verfügt der AVR über eine Spannungsversorgung, ebenso wie der ENC.
Die Skizze sollte nur verdeutlichen, wie ich das Modul angeschlossen
habe, für den Fall dass der Fehler bereits hier liegt.