Forum: Mikrocontroller und Digitale Elektronik Ethernet AVR


von Niki (Gast)


Lesenswert?

Hallo,

Es geht wieder um ein Thema, über welches schon viel diskutiert wurde.
Jedenfalls will ich keinesfalls irgendeine fertige, kommerzielle Lösung 
haben sondern "Marke Eigenbau".

Wie der Titel schon sagt, geht es darum, eine ISA Ethernet Karte an 
einen AVR anzuschliessen.

Ich will ohne Umwege über 100 externe Bauteile den Schaltplan auf 
http://avr.jpk.co.nz/eavr/glueless8515_ne2000.gif verwenden. Der ist 
"relativ" leicht auch auf Lochraster aufzufädeln. Der Plan ist mir im 
Prinzip klar: PORTA Datenbus, 8 Bit, PORTC Adressbus, 6 Bit, INT0 
Interrupt5, der getriggert wird, wenn die Karte Daten vom Netz empfängt 
(sofern halt Karte auf IRQ5 gestellt).

Ich will die Karte eben deswegen direkt ansprechen (und nicht auf memory 
mappen) da der AVR nur ein Interface sein soll und keinen TCP/IP stack 
drauf bekommen soll.

Jedoch stellt sich für mich nun die Frage, wie ich so ein Ding 
anspreche.
Zum Empfangen von Daten: Ich bekomme einen Interrupt5 getriggert, 
schreibe dann in den Adressbus die Adresse der Ethernetkarte (z.B. 
0x300) und kann sodann aus deren Speicher (das sind 16k?!) via PORTA 
ganz "normal" lesen?
Hört sich einfach zu einfach an.

Und wie ist das beim Versenden eines Paketes? Wiederum die I/O Adresse 
auf den Adressbus schreiben und sodann über PORTA die Daten schreiben? 
Hört sich ebenfalls einfach an.
Ich denke jedoch auch, dass es hier sicher verschiedene Speicherbereiche 
gibt, einen wo ich lesen, einen wo ich schreiben kann. Ist es zB nur 
möglich gleich ein ganzes Frame zu holen oder kann ich das Byte 
orientiert machen, wie beim UART.
Eine Funktion send_ether() und recv_ether() z.B. (jedenfalls werde ich 
eine NE2000 kompartible verwenden, so einen Standard halt den der linux 
ne2k treiber ansprechen kann)

Dann gibt es allerdings noch ein viel heikleres Problem: Die 
Geschwindigkeit. Da der AVR ja nur Interface werden soll, liegt es nahe, 
dass die Daten konvertiert werden. Ja, genau, in eine art serielles 
RS232 Protokoll. Das ist aber viel zu langsam wenn ich mir Raten von 
10kbit vorstelle.
Das einzige was mir dabei helfen wird ist wahrscheinlich nur so viel zu 
verarbeiten wie geht, den Rest droppen, und vielleicht einen 2/4k 
Ringpuffer zu verwenden?!
Oder gibt es was womit ich der Karte sagen kann "Halt, ich kann im 
Moment nicht mehr verarbeiten". Ich muss jedenfalls damit rechnen, dass 
auf der anderen Seite im schlechtesten Falle 9600 sein werden (ist aber 
kein RS232 proto).


Kann mich da vielleicht irgendwer aufklären?
Wo findet man Infos zu sowas?



Vielen Dank,

Niki



PS: Bei eAVR wird erstens alles gemappt verwendet und zweitens stehn 
noch keine Treiber bereit...

von Martin de Wendt (Gast)


Lesenswert?

Hallo,

schau mal unter www.picoweb.de. Dort findest du ein wenig mehr Infos und 
auch ein datenballt für NE2000. Das mit der Geschwindigkeit ist nicht 
ganz so das Problem.

Martin

von Meiserl (Gast)


Lesenswert?

Hallo

Muß es so kompliziert sein?
Schau mal auf www.siteplayer.com

von Niki (Gast)


Lesenswert?

Hallo!

@Martin: Danke, sowas in der Art hab ich gesucht, werds mir mal anschaun
@Meiserl: Auch danke, aber siteplayer kenn' ich ja schon. Jedenfalls um 
deine Frage zu beantworten: Ja, es muss so kompliziert sein. Ich will 
absolut keine kommerzielle Lösung und will das komplett selbst machen, 
um auch die Zusammenhänge verstehen zu können, das Erfolgserlebnis zu 
haben, bla bla bla

thx n mfg

Niki

von Niki (Gast)


Lesenswert?

@Martin: Bist du dir sicher dass du diese Seite meinst?
Ich könnt' mir gut vorstellen dass du die irgendwie verwechselt hast, 
denn da ist nichts in dieser Richtung oben, oder finde ich nur nix?

von Niki (Gast)


Lesenswert?

Danke, habs zufällig gefunden, das gleiche mit .com.

Das sieht wahnsinnig gut aus was da geboten wird! Genau sowas hab ich 
gesucht!
thx

von Martin de Wendt (Gast)


Lesenswert?

Hi,

sorry du hast es ja selber gemerkt, habe das .com verwechselt :-(


MdW

von Jens Renner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin auch dabei, einen Mikro-Webserver mit einem mega163 aufzubauen 
(Bild siehe Anhang, sorry für die schlechte Qualität).

Die Sache ist in der Tat recht einfach, zumindest was den elektronischen 
Teil angeht. Ich habe es mir sogar noch leichter gemacht, und erstmal 
die Interrupt-Geschichte weggelassen. Statt dessen betreibe ich das Ding 
in einer Art Polling-Modus, d.h. ich vergleiche ständig Boundary- und 
Current-Pointer, ob Daten eingetrudelt sind. Das ist sicher nicht 
ökonomisch, aber für den Anfang okay.

Der aufwendige Teil ist aber die Implementierung der Stacks und 
Protokolle, weil ohne macht der Webserver nunmal keinen Sinn, bzw. man 
muss sich darauf beschränken, allein die Existenz eingehender Pakete 
festzustellen.

Aber mal eine ganz andere Sache, an der ich gerade verzweifle.
Ich habe folgenden Code in der read-Funktion, in der ich das Daten-Byte 
des ISA-Karte abfrage:

ldi r18, 0 ; set data port for input
out DATA_DDR, r18 ; .equ DATA_DDR = DDRD
;... some address strobes... no function calling
in r17, DATA_IN ; .equ DATA_IN = PIND

Und jetzt kommt's: unabhängig vom an den Pins anliegenden Byte erhalte 
ich in r17 den Wert des Data-Latchs des µC. Aber weshalb?
Der Port ist doch als Eingang konfiguriert (und bleibt es auch), ich 
lese von PIND ein... wo ist mein Fehler?

Grüße

Jens

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.