Forum: Mikrocontroller und Digitale Elektronik Webserver mit ATmega128 und ISA Netzwerkkarte Davicom dm9008


von Thomas T. (Gast)


Lesenswert?

Hallo zusammen,

vielleicht kann mir hier im Forum jemand helfen.

Ich habe das tolle Webserver Projekt entdeckt und bin recht
begeistert.

Benutze einen ATmega128 mit 16 MHz und möchte die ISA Netzwerkkarte,
Chip Davicom dm9008, verwenden. (SW 1.38)

Der Aufbau ist in Anlehnung an die Anleitung von Herrn Radig.
(Vielen Dank auch an dieser Stelle.)

Das Problem liegt nun an der Netzwerkkarte, diese ist nach dem
Datenblatt voll NE2000 kompatibel. Aber die Verbindung klappt noch
nicht.

Hat schon jemand mit dieser Netzwerkkarte Erfahrungen machen können?

Der Ping wird nicht beantwortet, die Link LED an der N.-Karte blinkt
kurz auf, das wars.
Am Switch wird der Link als aktiv angezeigt, sollte doch dann gehen
oder nicht?

Grüße
thomas t.

von bjoern (Gast)


Lesenswert?

Habe auch diese NIC und bin auch dabei gescheitert damit einen Webserver
auf die Beine zu stellen. Wenn du etwas rausfindest schreibe es bitte
hier ins forum

von Thomas T. (Gast)


Lesenswert?

Hallo Bjoern,

kein Problem.
Denke das es an der Karte/Interrupt liegt, der Ping scheint ja an
der Karte anzukommen. Wird nur noch nicht beantwortet. :-)

Hab dem Herrn Radig auch geschrieben vielleicht meldet er sich noch?

Grüße
thomas t.

von A.K. (Gast)


Lesenswert?

Funktioniert bei UM9008/DM9008 und BC912 nur, wenn man das
ISA-Bus-Signal IOCHRDY anschliesst und die R/W-Routinen entsprechend
modifiziert.

Das könnte auch auf andere NE2000-er zutreffen, anders als
beispielsweise 3COMs arbeiten die NE2000-er per Design stark mit diesem
Signal. Realtek 8019 ist insofern wohl eher die Ausnahme davon, dort
kommt man mit ein bischen Timing-gebossel offenbar auch ohne aus. Nicht
immer, will mir jedoch scheinen, ich habe da bei IRQ-Polling auch öfter
mal Dreck gelesen.
1
void WriteRTL (unsigned char rtl_addr,unsigned char rtl_data)
2
{
3
    AddrRTL(rtl_addr);
4
    RTL_WR_OFF();
5
    DATA_PORT_RLT_WRITE = rtl_data;  // anstatt NOPs
6
    DATA_DIR_RLT = OUTPUT;
7
    while (!RTL_READY())
8
      ;
9
    RTL_WR_ON();
10
    DATA_DIR_RLT = INPUT;
11
}
12
13
uint8_t ReadRTL (unsigned char rtl_addr)
14
{
15
    AddrRTL(rtl_addr);
16
    DATA_DIR_RLT = INPUT;
17
    RTL_RD_OFF();
18
    nop(); nop();      // 2 NOPs nötig!
19
    while (!RTL_READY())
20
      ;
21
    rtl_addr = DATA_PORT_RLT_READ;  
22
    RTL_RD_ON();  
23
    return (rtl_addr);
24
}

von Thomas T. (Gast)


Lesenswert?

Hallo A.K.,
danke für den Hinweis, ich habe darüber schon etwas gesehen gehabt.
leider nicht so richtig verstanden, sorry.

Wo sollte man ISA-Bus-Signal IOCHRDY anschliessen? Interrupt/Port?
Ist ja das Signal welches für die "wait states" auf dem ISA Bus
zuständig ist. (Low active)

Grüße
thomas t.

von thomas t. (Gast)


Lesenswert?

Hallo A.K.,

kannst du mir vielleicht deine Sourcen mal schicken?

Wie hast du die Anbindung von "I/O CHANNEL READY" gemacht?

Danke im vorraus.

mfg
thomas t.

von A.K. (Gast)


Lesenswert?

Signal an einen beliebigen freien Pin vom AVR anschliessen und wie
gezeigt in den R/W-Routinen abfragen. In der Initialisierung sollte der
interne Pullup des Pins aktiviert werden.

Im obigen Source ist RTL_READY() ein Macro, der den Zustand dieses Pins
wiedergibt (z.B. PINC & 1<<PC0). Der relevante Teil der Sourcen steht
oben. Evtl. kann auch eine vergleichbare Abfrage im Block-Datentransfer
nützlich sein, aber da klappt's evtl. auch ohne.

Den Sourcecode kann ich zur Verfügung stellen, aber da ich den
teilweise deutlich umgebaut habe, wird das weniger helfen als der
Auszug oben.

Dieses Signal ist active high. Die Karte zieht es runter, wenn sie auf
einen Transfer noch nicht rechtzeitig reagieren kann (not ready), zieht
es wieder hoch wenn sie dann soweit ist (ready).

Einfach die R/W-Zyklen zu verlängern funktioniert nicht.

von thomas t. (Gast)


Lesenswert?

Hallo A.K.
danke für deine Hilfe, werds mal umsetzen.


Mit Macros hab ich noch nichts gemacht, gehen folgende Codezeilen
in der rtl8019.h :

#define DDRC  &= ~(1<<DDC0);  //PINC 0 als Eingang
#define PORTC |= (1<<PC0);    // interner Pull-Up an PC0 aktivieren
#define RTL_READY()   PINC & 1<<PC0


Grüße
Thomas t.

PS: Wenn es keine Umstände macht würde ich mich über deine Sourcen
freuen.

von A.K. (Gast)


Angehängte Dateien:

Lesenswert?

> #define DDRC  &= ~(1<<DDC0);  //PINC 0 als Eingang
> #define PORTC |= (1<<PC0);    // interner Pull-Up an PC0 aktivieren

So wird das natürlich nix. Bischen C Kenntnisse sollten schon da sein.

Source anbei.

von thomas t. (Gast)


Lesenswert?

Ja hast Recht.

Hab meine Fehler auch schon unter die Nase gerieben bekommen. :-)

In main.c

DDRB  &= ~(1<<DDB6);  //PINB 6 als Eingang
PORTB |= (1<<PB6);    // interner Pull-Up an PB6 aktivieren

in rtl8019.h

#define RTL_READY()   PINB & 1<<PB6

und die Karte blinkt schon mal heftigst. :-)

Danke für deine Sourcen.

Grüße
thomas t.

von BennyS (Gast)


Lesenswert?

Entschuldigt wenn ich diesen alten Thread wieder ausgrabe.
Ich hab mir auch das ISA-CTRL Board zusammen gebaut und verwende dafür
eine DM9008F, diese wird nach den änderungen :
1
void WriteRTL (unsigned char rtl_addr,unsigned char rtl_data)
2
{
3
    AddrRTL(rtl_addr);
4
    RTL_WR_OFF();
5
    DATA_PORT_RLT_WRITE = rtl_data;  // anstatt NOPs
6
    DATA_DIR_RLT = OUTPUT;
7
    while (!RTL_READY())
8
      ;
9
    RTL_WR_ON();
10
    DATA_DIR_RLT = INPUT;
11
}
12
13
uint8_t ReadRTL (unsigned char rtl_addr)
14
{
15
    AddrRTL(rtl_addr);
16
    DATA_DIR_RLT = INPUT;
17
    RTL_RD_OFF();
18
    nop(); nop();      // 2 NOPs nötig!
19
    while (!RTL_READY())
20
      ;
21
    rtl_addr = DATA_PORT_RLT_READ;  
22
    RTL_RD_ON();  
23
    return (rtl_addr);
24
}

und

in der Init. der Netzwerkkarte
1
DDRD  &= ~(1<<6);
2
PORTD |= (1<<6);

auch immer erkannt. (Sourcen 1.38 / 1.39)

Auch die LED an der Karte leuchtet und Blinkt wenn Vehrkehr im Netzwerk
herscht. (ISA-CTRL<->Fritz Box 7050<->(WLAN)<->PC)

Allerdings lässt die Karte sich nicht anpingen und nach kurzer Zeit
erscheint "Overrun" im Terminal.

Mit einen Netzwerksniffer zeigt er mir auf den ARP Request "Who Has
192.168.1.66" keine Antwort an.

Hat irgendjemand eine Idee? A.K. vielleicht?

PS: Hab beim kompilieren USE MMC, FTPD, TELNET auf 0 gesetzt
MyMAC gelassen wie es ist und MYIP aud 192.168.1.66 eingestellt

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.