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