mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 als Ethernet Client, WIE? (HW: AVR-Net-IO)


Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

zu erst einmal vielen Dank das in diesem Forum so vielen Usern 
konstruktiv geholfen wird! -> Mir auch, durch lesen der vielen Beiträge.

Hut ab vor all denen die Ihr Wissen dementspechend zur Verfügung 
stellen.
DANKE!

Mein Problem - die viel diskutiere Geschichte "Atmega -> Ethernet"!

Ich möchte meiner AVR-Net-IO beibringen, eigene Software läuft 
(1-wire/RS232), mir meine Informationen nicht über die RS232 sondern 
über Ethernet(ENC28J60) mitzuteilen.

Nach Recherche bereits vorhandener Software ( siehe Google und auf 
dieser Seite ) bin ich bei den Sourcen von Ulrich Radig gelandet.

Habe mir diesen Code ins AVRStudio geladen und versucht die "wichtigen" 
Zusammenhänge zu verstehen. -> Problem !!! :-)

Geständnis:
Mich erschlagen diese vielen Codezeilen! :-(

Ich möchte keinen Server auf dem Atmega implementieren, ich möchte das 
der Atmega mir meine gewünschten Daten (String oder Bytes) per Ethernet 
zu meinem Server schickt (per tcp an IP -> Port). Der Server ist 
momentan noch eine Windowskiste mit einem Dienst der diese Daten 
empfängt und sie in einer Datenbank ablegt (Datum, Temperaturen, Status 
der Ausgänge usw.). Geplant ist eine Linuxmaschine, 
Router/Firewall/Mail-Server, die ja sowieso den ganzen läuft und diese 
Daten mit organisieren kann.

Also eine Alternative zur Funktion "uart-put" oder "Debug" usw.

Ablauf:
1. Temperaturen einlesen
2. Ausgänge setzten
3. Temperaturen, I/O-Status an Server senden

Wäre dankbar für Denkanstösse auf Basis des Source Code von Ulrich 
Radig.
(newStack1_2_5)


Vielen Dank!

Autor: raketenfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um ehrlich zu sein, wird die andere Richtung für dich einfacher sein!

Gucke dir vll mal die http_get methode an- die baut auch auf tcp auf und 
verbindet sich zu einem Server.

persönlich würde ich aber auf die Telnet-steuerstruktur zurückgreifen, 
das ist einfacher ;-)

mfg

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!

allg. Frage "Meckern Eure Frauen auch so viel wenn mann sich nichts 
anderes anschaut außer Neckermann oder Otto? :-)

zurück zum Thema:

Ich generiere meine Ideen auf Basis der großen "Internetbibliothek" und 
folgender Ansatz sollte doch möglich sein:

(Jugendlicher Leichtsinn!) -> bin erst 33! :-)

Im Galileo Openbook "C von A bis Z, Capter 25" ist ein solcher Server / 
Client gut beschrieben (für PC´s) läuft auch prima und den Code habe ich 
verstanden! Diese Clientfunktionalität müsste doch auch mit dem Stack 
von U. Radig machbar sein. Mir fehlt der Ansatz!

Schlagt mich wenn ich gar falsch liege!

Danke im Vorraus!

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@RenJ ich habe die GLEICHE Fragestellung und bin leider auch noch nicht 
weitergekommen.
==> Beitrag "Minimal Webserver?"

Hoffentlich kommt noch ein "kluger, einfacher" Hinweis, wie man das mit 
minimalem Aufwand für die Ethernetsache realisiert....

MfG
Achim

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReneJ schrieb:

> Ich möchte keinen Server auf dem Atmega implementieren, ich möchte das
> der Atmega mir meine gewünschten Daten (String oder Bytes) per Ethernet
> zu meinem Server schickt (per tcp an IP -> Port). Der Server ist

Der minimale Aufwand wäre, UDP-Pakete zu schicken. UDP ist einfach, 
zustandslos, und das kannst Du leicht mit wenig Aufwand selbst 
implementieren, ohne einen kompletten IP-Stack verwenden zu müssen.

Wenn Du magst, kannst Du noch icmp und arp implementieren, aber das muss 
nicht sein.

fchk

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @Sucher (Gast), schaun wir mal wie´s weiter geht!

Hallo @Frank K., Danke für die Antwort!

generelle Frage: So wie ich das verstanden habe weiß ich bei tcp ob 
meine Information angekommen ist oder nicht und bei UDP eben weiß ich 
das nicht.

Meine Entscheidung fällt, im Endausbau, auf tcp!

Mir ist es momentan eigenlich egal ob ich tcp oder udp für die 
Datenübertragung benutze. Das Prinzip ist entscheident. Kannst Du mir 
einen Denkanstoss bezüglich "Daten senden" geben. (Auf Basis U. Radig!)

ICMP wäre natürlich für die Entwicklungsphase auch toll, eigentlich der 
erste Schritt, aber wir reden erstmal über "Daten senden!". Ich denke 
wenn ich das "Senden" verstanden habe sollte es mit "PING" keine 
Probleme geben, ist ja auch schon implementiert - die entsprechenden 
Sektions suche ich mir dann raus.

Vielen Dank!

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReneJ schrieb:
> generelle Frage: So wie ich das verstanden habe weiß ich bei tcp ob
> meine Information angekommen ist oder nicht und bei UDP eben weiß ich
> das nicht.

Bei tcp kümmert sich der Stack darum, bei udp musst Du Dich selber drum 
kümmern, wenn Du das brauchst. tcp ist in der Implementation so komplex, 
weil es sich um alle möglichen Eventualitäten wie Paketverluste, 
Fragmentierung, falsche Reihenfolge von empfangenen Paketen etc etc 
kümmern muss.

Wenn Du diese Eventualitäten nicht brauchst, weil Du nur im lokalen 
Ethernet unterwegs bist, wo die MTU garantiert bei 1500 ist und nichts 
fragmentiert und wo Du nicht routen musst etc, dann kannst Du mit einem 
einfachen UDP-Protokoll einiges an Platz im Flash und im RAM sparen.

Beispielsweise:
1. Server schickt UDP-Paket mit Anfrage.
2. Client wertet Anfrage im UDP-Paket aus und schreibt die Antwort in 
den UDP-Datenbereich.
3. Client vertauscht Sende- und Empfangsadresse im Ethernet- und im 
IP-Header, setzt die Länge passend und berechnet die IP-Checksumme und 
optional die UDP-Checksumme neu
4. Client sendet Antwortpaket
5. Wenn der Server das Antwortpaket innerhalb einer Sekunde nicht hat -> 
1.

Für das ganze brauchst Du genau 1514 Bytes Platz, und das 
UDP/IP-Protokoll beschränkt sich auf ganz wenige Dinge.

Damit das ganze funktioniert, muss Deine Kiste nur noch ARP-Requests 
beantworten (damit der Server die Ethernet-Adresse zu Deine IP bekommt), 
aber auch das ist primitiv und auf einer halben Bildschirmseite 
abgehandelt.

fchk

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @Frank K.

wie immer DANKE! für Dein Interesse und DANKE! für Deine Antwort!

Beschränken wir uns für´s erste auf das lokal Netz:

zu 1. Server = AVR-Net-IO -> richtig? / UDP-Pakete WIE? -> U.Radig Code
zu 2. Client = mein Server (Linux oder Windows!) -> da kann ich drauf 
reagieren!
zu 3. - 5. bekomme ich hin!

ZwischenFrage: das Buch " C von A bis Z, Chapter 25" ist Dir bekannt? 
(nicht böse gemeint!) -> auf diese Basis ziehlt meine Frage hinaus!

Bzgl. der Geschichte öffentliche Netze Frage ich später! :-)

>@Frank K.
>Damit das ganze funktioniert, muss Deine Kiste nur noch ARP-Requests
>beantworten (damit der Server die Ethernet-Adresse zu Deine IP bekommt),
>aber auch das ist primitiv und auf einer halben Bildschirmseite
>abgehandelt.

Wie meinst Du das, ich dachte wir sind lokal (ich lerne!)?
Bei mir: -> Client = AVR-Net-IO = feste IP, meinServer = feste IP.

Sollte die Antwort in den ARP-Requests beheimatet sein, bitte keine 
Schläge, ich informiere mich umgehend!


Vielen Dank!

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispiel:

Die Daten im xpl_hartbeat_string werden im UDP Telegramm zum Port 43903 
gesendet. Ziel-IP ist eine Broadcast Adresse. Die Daten stehen in 
eth_buffer.

const char  xpl_hartbeat_string[] PROGMEM = 
"xpl-stat\n{\nhop=1\nsource=heizung.hbeat\ntarget=*\n}\nhbeat.basic\n{\n 
interval=60\n}\n\0";

void xpl_hartbeat ()
{
        unsigned int byte_count = 0;

              while (pgm_read_byte(&xpl_hartbeat_string[byte_count]) != 
0)
                {
                        eth_buffer[UDP_DATA_START + byte_count] = 
pgm_read_byte(&xpl_hartbeat_string[byte_count]);
                        byte_count++;
                }
                create_new_udp_packet(byte_count,43903,XPL_PORT,(*(unsigned 
long*)&xpl_bcast_ip[0]));

                return;

}


Gruss
Axel

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag zum letzten Post: (@Franke K. v. 25.10.2010 22:13)

Auszug aus: "http://de.wikipedia.org/wiki/Address_Resolution_Pr...

..Bevor ein Rechner in einem Ethernet an einen Rechner im selben Subnetz 
ein IP-Paket sendet, muss er die Information in einen Ethernetframe 
verpacken. Dazu muss er die MAC-Adresse des Zielrechners kennen und im 
entsprechenden Feld des Ethernetframes einfügen. Ist ihm diese nicht 
bekannt, kann er das IP-Paket nicht zustellen. Stattdessen ermittelt er 
dann mit Hilfe des ARP zunächst die MAC-Adresse des Zielrechners....

habe ich grundsätzlich verstanden!

Vielen Dank!

Autor: Frank K. (fchk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReneJ schrieb:
> Hallo @Frank K.
>
> wie immer DANKE! für Dein Interesse und DANKE! für Deine Antwort!
>
> Beschränken wir uns für´s erste auf das lokal Netz:
>
> zu 1. Server = AVR-Net-IO -> richtig? / UDP-Pakete WIE? -> U.Radig Code
> zu 2. Client = mein Server (Linux oder Windows!) -> da kann ich drauf
> reagieren!

Sorry, war wohl doof geschrieben, ich meine das umgekehrt, der AVR 
bekommt Fragepakete und sendet Antwortpakete.

> ZwischenFrage: das Buch " C von A bis Z, Chapter 25" ist Dir bekannt?
> (nicht böse gemeint!) -> auf diese Basis ziehlt meine Frage hinaus!

nein kenne ich nicht, und auch den Code von U.Radig kenne ich nicht, 
bräuchtest Du hier auch nicht. Das einzige, was Du brauchst, sind die 
Routinen für den Ethernet-Chip.

>>@Frank K.
>>Damit das ganze funktioniert, muss Deine Kiste nur noch ARP-Requests
>>beantworten (damit der Server die Ethernet-Adresse zu Deine IP bekommt),
>>aber auch das ist primitiv und auf einer halben Bildschirmseite
>>abgehandelt.
>
> Wie meinst Du das, ich dachte wir sind lokal (ich lerne!)?
> Bei mir: -> Client = AVR-Net-IO = feste IP, meinServer = feste IP.

Auf IP-Ebene ja. Darunter sitzt die Ethernet-Ebene. Jedes Ethernet-Gerät 
hat eine eigene, weltweit einzigartige 48-Bit Ethernet-Adresse. Die 
Verknüpfung zwischen IP-Adresse und Ethernet-Adresse macht das 
ARP-Protokoll.

Ein UDP-Paket sieht also so aus_
    14 Bytes   20 Bytes  8 Bytes
[Ether Header[IP Header[UDP Header[Daten]]]]

Wenn Du das alles selber programmierst (das meiste ist nur Ausfüllen von 
Headern), dann weißt Du anschließend genau, was bei Dir im Netz alles so 
abgeht.

fchk

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @Axel,

wie immer vielen Dan.....K!
Sie verwirren mich jetzt ganz.
Kompletten Code durchsucht und nicht über [xpl_hartbeat_string] 
gefunden!
Was mache ich falsch?


Hallo @Frank K.

wie immer vielen Dan......K!

Ich glaube wir reden aneinander vorbei. (auch nicht böse gemeint!)

Anforderung:
AVR stellt eine Verbindung zu einem Server her:

Verbindung herstellen -> Daten senden -> Rückantwort abwarten -> 
Verbindung schliessen -> Irgendwann auf ein neues!

U. Radig Code lassen wir jetzt mal aussen vor. Wenn ich das richtig 
Vestanden habe benötige ich "nur die Treiber für den ENC28J60?" Auf 
dieser Basis könnte man alles selbst implementieren!

Ehrlich gesagt -> will ich nicht! (mal wieder nicht böse gemeint!)

Findige Leute haben, behaupte ich mal, Ihre Familie/Kinder/Job 
vernachlässigt um die Entwicklungen, u.a. auf dieser Seite, voran 
zutreiben.

Es muss doch eine Möglichkeit geben vorhandenen Code zu nutzen.

@Frank K. - ich hoffe wir können weiter diskutieren/schreiben!

Bzgl. ARB-Request muss ich weiter lernen! -> mach ich auch!

Vielen Dank!

Autor: Guido Scheidat (flintstone)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rene,

warum so kompliziert? Der Code von Ulrich ist doch fast schon perfekt.
Dein AVR-Net-IO muss doch lediglich Informationen liefern. Das tut er 
mit dieser Software bereits. Du mußt doch nur die Informationen abrufen. 
Wenn du sowieso eine Linuxkiste am Laufen hast, dann richte einen 
CRON-Job ein, der in regelmäßigen Abständen die Temperatur, oder was du 
messen willst, abruft. Diese Information leitest du dann an deine 
Datenbank weiter.

Mein AVR-Net-IO-Projekt findest du hier:
Beitrag "Re: Heizungsschnittstelle 7-8-9"

Gruß
Guido

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel von mir sollte zeigen, wie es geht, ist ein Beispiel aus 
einem meiner Projekte.

Daran kann man sehen, wie man ein UDP Paket schickt, alles mit ARP etc. 
macht Ullis Code dann selbst.

Gruss
Axel

Autor: ReneJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @Axel,

Dein Tip hat mich auf die richtige Spur gebracht! Vielen Dank!

Habe in meinem Projekt erstmal alles ausgedünnt um die Zusammenhänge
zu verstehen. (klappt sogar!)

Übergeblieben sind: timer, enc28j60 und stack (jeweils .c, .h),
Desweiteren eine Funktion ähnlich @Axel
und siehe da meine Firewall (PC) meldet sich und ich erlaube dem MC mir 
Daten zu schicken!

Den Serverdienst (noch Windows) habe ich analog des weiter oben 
genannten Buches aufbaut (copy -> paste, :-),).

Werde mich jetzt noch tcp widmen und dann einen kurzen 
Erfahrungsbereich, wenn gewünscht, oder weitere Fragen hier 
präsentieren!

Ziel ist es (1) von dem Controller Daten geliefert zu bekommen und (2) 
er soll mich fragen was ich neues an Informationen für ihn habe und das 
dann in seine Config übernehmen!

(1) funktioniert mit udp, tcp ist im Anlauf (Dank Eurer Hinweise)

(2) komme ich später zu

Tut mir Leid wenn ich mich nicht regelmäßig melde aber ich werde diesen 
Tread weiter pflegen! Wer den ersten Schritt ebenfalls umsetzten möchte 
(Senden von einem String per UDP) meldet sich.

Vielen Dank!

mfg rene

Autor: Chris M. (shortie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schade - würde mich ja melden aber das ist doch alles schon fertig und 
im Forum von Ulrich Radig beschrieben ;-)

Oder Du schaust dir mal die ETH-M32-EX_AVR-NET-IO Software an.
Dort ist alles schon für das AVR-NET-IO von Pollin umgeschrieben. Die 
Software findest Du unter 
http://son.ffdf-clan.de/include.php?path=forumscat....
Dort drin nimmst du entweder den Code zum Senden von Mails (TCP) oder 
die UDP-Kopplung und setzt statt dem 2. Board eben einen 
UDP-Socketserver (einige Zeilen PERL reichen) ein. Den enthaltenen 
Webserver kannst Du abschalten.

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

hat schon mal jemdand hier im Forum diesen Stack ==> 
http://www.tuxgraphics.org/electronics/200905/embe...
auf einem AVR_NET_IO Borad ausprobiert und kann hier seine Erfahrung 
darüber kund tun.
Es geht darum, die Originalsoftware von Pollin mit einer möglich 
"schlanken" Firmware zu ersetzen. Oder gibt es zwischenzeitlich einen 
Pollin-Firmware Clone?
Ich meine nicht die "mächtigen" Webserver-Implementierungen die hier 
ausführlich diskutiert wurden. Mir reicht eine sinngemäße RS-232 
Anbindung übers Netz. Die Netzanbindung soll als "kleine,stabile 
Nebensache" auf dem Board laufen, damit mehr Resourcen für Erfassung und 
Regelung übrig bleibt.

MfG
Achim

Autor: BerndS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @all,

passend zum Thema suche auch ich ein Stück Code für mein AVR-NET, dass 
einfach einen String per UDP an einen Server zu senden soll. Ich will 
ein paar Werte einlesen (Temperatur etc.) und diese dann in einem String 
zum Server senden. Ohne Anfrage vom Server einfach jede Stunde einmal 
Senden und fertig.

Hat da jemand  schon ein Stück Code?

Bernd

Autor: Chris M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BerndS schrieb:
> Hat da jemand  schon ein Stück Code?

Ja bitte schön. Stammt von Dietmar Misch und wurde von ihm im Forum von 
Ulrich Radig als UDP-Kopplung von zwei ETH_M32_EX Boards vorgestellt.

//Senden der aktuellen Daten zu einen UDP Server
void udp_send (unsigned long UDP_IP_SEND)
{
        //oeffnet eine Verbindung zu einem UDP Server
        unsigned int byte_count,var=0;

        //ARP Request senden
        if (arp_request(UDP_IP_SEND) == 1)
        {
                for (byte_count = 0;byte_count<(MAX_VAR_ARRAY*2);byte_count=byte_count+2)
                {
                        eth_buffer[UDP_DATA_START + byte_count]   = (unsigned char)var_array[var];
                        eth_buffer[UDP_DATA_START + byte_count+1] = (unsigned char)((var_array[var]) >> 8);
                        var++;
                }
                create_new_udp_packet(byte_count,UDPSEND_RPORT,UDPSEND_SPORT,UDP_IP_SEND);
                return;
        }
        return;
}

UDP_IP_SEND  ist die IP-Adresse des Servers
MAX_VAR_ARRAY definiert die Größe von var_array
var_array enthält die Werte

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.