Forum: Mikrocontroller und Digitale Elektronik Atmega und ENC28J60: Netzwerkverbindung schlägt fehl


von Morpheus (Gast)


Angehängte Dateien:

Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Morpheus (Gast)


Lesenswert?

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
20
  #define USE_NTP    0 //1 = NTP Client on
21
  #define NTP_IP    IP(77,37,6,59)
22
  
23
  //Broadcast-Adresse für WOL
24
  #define USE_WOL      0 //1 = WOL on
25
  #define WOL_BCAST_IP  IP(192,168,0,255)
26
  #define WOL_MAC     {0x00,0x1A,0xA0,0x9C,0xC6,0x0A}
27
  
28
  //MAC Adresse des Webservers  
29
  #define MYMAC1  0x00
30
  #define MYMAC2  0x20
31
  #define MYMAC3  0x18
32
  #define MYMAC4  0xB1  
33
  #define MYMAC5  0x15
34
  #define MYMAC6  0x6F
35
  
36
  //Taktfrequenz
37
  //#define F_CPU 20000000UL
38
      #define F_CPU 16000000UL  
39
  //#define F_CPU 12000000UL  
40
  //#define F_CPU 14745600UL
41
  //#define F_CPU 11059200UL

von Stefan F. (Gast)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von Morpheus (Gast)


Lesenswert?

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

von Axel L. (axel_5)


Lesenswert?

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

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

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...

von Stefan F. (Gast)


Lesenswert?

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.

von Morpheus (Gast)


Lesenswert?

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)

von grundschüler (Gast)


Lesenswert?

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
   u8 x=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:
1
        packet_length = ETH_PACKET_RECEIVE(MTU_SIZE,(uint8_t *)eth_buffer);
2
        if(packet_length > 0)
3
        {
4
          eth_buffer[packet_length+1] = 0;
5
          check_packet();
6
        }

Lass dir den Anfang von eth_buffer auf dem lcd anzeigen. Das müssten 
dann der ethernet-header sein.

von KA123 (Gast)


Lesenswert?

Das ganze kann nicht gehen, weil der Controller nicht versorgt ist.

von holger (Gast)


Lesenswert?

SS/PB4 hängt bei dir in der Luft. Hast du den auf Ausgang
geschaltet? Wenn nicht könnte es passieren das SPI einfach
so mal nicht mehr funktioniert.

von Morpheus (Gast)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.