Hallo,
ich plane auf Basis des Atmel NGW100 eine intelligente
Schnittstellenkarte zwischen I2C Bus und Ethernet zu realsieren. Auf dem
AVR32 läuft embeded Linux und genau da fängt das Problem an. Ich habe
von Linux nur miminale, eher gar keine Ahnung! Allerdings habe ich
einige Erfahrungen mit den einfachen AVR 8Bitern gemacht und hatte daher
dazu tendiert das Linux direkt runter zu schmeißen und von Begin an
alles selber zu schreiben. Da ich jedoch ebensowenig Erfahrung mit
Ethernet oder I2C Programmierung habe, ist wohl doch geschickter auf die
von Atmel zur Verfügung gestellten Treiber zurück zu greifen.
Ich habe nun einige Stunden auf der Suche in Google und diversen Foren
verbraucht, um Code Beispiele für I2C btw. Ethernet zu bekommen. Aber
bin da leider kein Stück schlauer geworden.
Vom Prinzip her möchte ich:
Sensoren -> I2C -> Sensor Vorverarbeitung -> Ethernet/UDP -> PC
Meine anfängliche Hoffnung, dass ich unter Linux nur ein Device "I2C"
und ein weiteres für "Ethernet" mittels meinem eigenen Programm für die
Sensor Vorverarbeitung ansprechen brauche, war wohl zu naiv gedacht?
ALso wie bekomme ich den I2C Bus gelesen / beschrieben, btw den
Netzwerkcontroller?
Benutzt Linux automatisch den DMA Controller, oder muss ich das explizit
programmieren?
Ich würde auch auf ein 8Biter (Atmega32 oder größer) wechseln,
allerdings reicht mir die Performance nicht aus. Es ist erforderlich,
dass die Ethernet Verbinung einen Datendurchsatz von 20-30Mbit/s
schafft.
Wünschenswert wären mir Einschätzungen, ob das von mir gewünschte
mittels NGW100 überhaupt realsierbar ist? Alternativen (ARM7/9) sind
möglich, da keine Hardware angeschafft.
Falls NGW100 ok, wie bekomme ich den I2C btw Ethernet mit meinem eigenen
Programm angesprochen?
An dieser Stelle erstmal vielen Dank fürs lesen und ich bin für jede
Hilfe dankbar
Gruß,
Thorsten
Hallo Werner,
nachdem ich die Application Note "AVR32AP7 Networking Performance"
gelesen hatte, war ich der Meinung, dass es durchaus möglich seien
sollte.
Dort steht dass das NGW100 in etwa 50Mbit/s schafft.
Quelle:
http://www.atmel.com/dyn/resources/prod_documents/doc32066.pdf
Mag seien, dass 50Mbit/s doch sehr optimistisch ist, aber die Hälfte
sollte wohl möglich seien?
Gruß
Nachtrag:
Das der I2C Bux max 400kb/s liefern kann ist mir klar, jedoch entsteht
durch die Vorverarbeitung die enorme Datenmenge.
Soll heißen die Ethernet Verbindung PC <-> NGW100 muss die 20-30Mbit/s
leisten können, und das sollte wohl möglich seien.
Hallo,
kann man denn die Daten nicht direkt unverändert über LAN übertragen und
erst auf dem PC decodieren? Wodurch wird die Datenrate denn so groß?
So wie ich das an meinem NGW100 sehe, gibts da noch keinen Treiber für
I2C, den musst du komplett selber schreiben. Kann aber sein, dass das
mittlerweile schon jmand gemacht hat.
Grüße,
Peter
Natürlich gibt es fertige Treiber für i2c. Im menu config vom avr32
buildroot einfach i2c aktivieren und den Kernel neu kompilieren, dann
hast du ein i2c device drauf.
MfG Mark
Hallo Mark,
wenn ich den Kernel mit I2C neu kompeliere, dann ist zwar I2C aktiviert,
ber an der Stelle habe ich dann ein Verständnisproblem. Wie greife ich
dann auf das Device zu? Ich habe noch keine API im Netz gefunden, die
ich dann in meinen Source-Code einpflegen könnte. Wo muss ich da
ausschau halten, dass ich da was finde?
Gleiches gilt natürlich auch für den Ehternet-Controller.
Hallo Peter,
ein kurze Erklärung zu meinem Projekt:
Es geht um ein Fahrzeug, welches mittels Ultraschallsensoren eine Karte
der Umwelt errechnen soll. Die Sensoren komunizieren mit einem
Mikrocontroller (z.B. NGW100) via I2C und haben eine Reichweite von bis
zu 6 Metern. Bei einer Abdeckung von 360° kommt da eine Fläche von 112m2
zustande. Ich denke an eine Rastergröße von 5x5 bis 10x10cm und
Abtastschrtte von 0.1-1 Sekunde. Da kommt eine enorme Datenmenge
zusammen. Die einzelnen Kacheln je Abtastschritt werden auf einen
Host-PC via Ethernet geladen, der dann die gesamte Karte verwaltet.
Daher ist es möglich aus geringen Messdaten eine enomre Datenflut zu
produzieren.
grüße,
Thorsten
@TGraber
Für I2C siehe
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=63285
, da ist ein sehr gutes Bespiel im 2ten Post.
Warum willst du den Ethernet-Controller selbst ansteuern? Sowie ich Dein
Vorhaben verstanden habe, reichen normale TCP sockets vollkommen aus. Im
Extremfall kann man ja immer noch Raw-Sockets nehmen.
Hallo Thosten,
du kannst das I2C device doch einfach über ssh oder ein raw-Socket zum
PC durchtunneln, dann ist die Datenrate gering genug, dass das NGW sie
locker verarbeiten kann. Du solltest auch bedenken, dass die Entwicklung
der Software auf einem richtigen PC wesentlich angenehmer ist (man hat
ein Grafikdisplay).
Ich kenne deine Sensoren ja nicht, aber wenn sie I2C sprechen, haben sie
offenbar die Intelligenz schon drin. Also funktioniert das irgendwie so,
dass man einen Messwinkel vorgibt und den Abstand der Reflektion
zurückbekommt? Diese Information kann man doch direkt ohne weitere
Verarbeitung an den PC übertragen. Schließlich benötigt sie ja wohl auch
nur der PC, oder verstehe ich das falsch? Warum sollte die Information
direkt auf der kleinen CPU verarbeitet werden, wenn dadurch die
Kommunikation aufwändiger wird und nicht klar ist, ob die Rechenleistung
für die geforderte Bildrate ausreicht?
Viele Grüße,
Peter
Hallo Mark,
erstmal danke für den Link zum I2C. Werde ich mir sehr genau anschauen.
zum Ehternet-Controller
Ich muss zugeben, dass ich davon leider sehr wenig Ahnung habe. Falls es
eine Möglichkeit gibt, auf Software-Ebne (Befehle von Linux) mit dem
Controller zu komunizieren, will ich das sehr gerne tuen und erspare mir
den Kampf durch die Datenblätter des AVR32. Nur sind mir solche Befehle
(in Form eine API) nicht bekannt.
Da ich mit den Begriffen wie TCP-Socket und RAW-Socket nicht viel
anfangen kann, kennst du ein Buch / Internetseite wo ich mich da mal
einlesen kann?
Vielleicht klärt sich dann auch vieles von selbst. Hoffe ich mal ;)
Hallo Peter,
ich schicke die Rohdaten (von den Sensoren) mit Absicht nicht direkt zum
Host-PC, weil dieser sonst nicht genug Rechenzeit besitzt, alle Prozesse
in Echtzeit abzuhandeln. Zusätzlich eine Wahrscheinlichkeitskarte der
Umgebung zu rechnen mit vielleicht 1 Millionen 8Bit Multiplikationen pro
Sekunde ist doch recht aufwendig, daher möchte ich diese auslagern.
Das Prinzip einer Ultraschallmessung ist genau wie du beschrieben hast.
Jedoch erhält man nicht nur die Information wie weit ein Objekt vom
Sensor entfernt ist (aus Laufzeit hin und zurück) sondern auch
Information darüber wo kein Objekt ist. (der Weg der Schallwellen ist ja
nicht blockiert bis zum Objekt an dem sie zurück reflektiert werden)
Diese Beiden Informationen kann man dann für eine
Wahrscheinlichkeitskarte der Umgebung verwenden.
Die Sensoren sind: Devantech SRF02
Also die Zeitmessung bekommen sie von alleine hin, ich muss im uC "nur"
die Wahrscheinlichkeiten der Kacheln berechnen.
Vielleicht kann mir jemand mitteilen wieviel Taktzyklen (oder Rechenzeit
mit Taktfrequenz Angabe) ein AVR32 in etwa benötigt, um eine 8Bit
Multiplitkation unter Linux.
Gruß,
Thorsten
Hallo Mark,
ich hätte erst deinem Link folgen, und dann dir antworten sollen...
Die API für den I2C Controller ist für meine Belange optimal. Sehr
einfach, aber mehr benötige ich auch gar nicht. Vielen Dank!
Falls jemand noch eine vergleichbare API für den Ethernet-Controller
posten könnte, wäre ich sehr dankbar.
Gruß,
Thorsten
Hi
z.B. http://students.cs.byu.edu/~cs460ta/cs460/labs/sockettutorial.html
8Mmul/s sind für einen PC kein Problem. Das sorgt nur für etwas
Grundrauschen in der Prozessorauslastung. Du solltest wirklich die
Verarbeitung der Daten dem PC überlassen. So ein PC ist um soviel
Faktoren schneller als ein AVR32 das du keine sinnvolle Vorverarbeitung
dort machen kannst.
Matthias
> Da ich mit den Begriffen wie TCP-Socket und RAW-Socket nicht> viel anfangen kann,
Nichts für ungut, wenn Dir solche fundamentalen Grundlagen fehlen, wirst
Du Dich bei Deinem geplanten Projekt sehr schwer tun und mit
ziemlicher Sicherheit Schiffbruch erleiden.
Evtl. wäre es klüger, erstmal mit etwas einfacherem Anfangen.
Bevor man Laufen lernt, sollte man erst das Gehen gelernt haben...