Forum: Mikrocontroller und Digitale Elektronik Schnelle Kommunikation AVR/PC


von Michael Borkowski (Gast)


Lesenswert?

Hallo Leute,

Vor Ewigkeiten hab ich hier mal Fragen zum Thema LED-Ansteuerung 
gestellt - mittlerweile habe ich (u.A. von diesem Forum) viel 
dazugelernt und bin schon ein ordentliches Stück weiter.

Was ich habe: Einen ATmega32, der via RS232 Opcodes/Daten entgegennimmt, 
und in eine Verkettung von 60 (momentan Testaufbaut mit 2, Ziel sind 60) 
Stück TLC5940 hineinpfeffert. Die 50 PWM-Controller steuern - man staune 
- 60 * 15 = 900 LEDs an. In Wirklichkeit sind das 13m RGB-LED-Strip, die 
Aufbaudetails erspar ich auch ... sobald ich fertig bin dokumentier ich 
alles schön und der geneigte Leser darf es bestaunen :-)

Kurzbeschreibung des Problems: Die RS232 ist ein Bottleneck :-( Die 
maximale Baudrate die ich zwischen PC und AVR zusammenkriege ist 115200, 
das ergibt mit 1+8+2=11 Bits eine Rate von 10.472 Byte pro Sekunde. 
Theoretisch ergibt das eine Framerate von 11,6 Frames pro Sekunde, 
aufgrund eines leichten Protokoll-Overheads komme ich effektiv auf ~10 
Frames pro Sekunde. Und das ist bei Fading-Effekten leider zu wenig (es 
ruckelt).

Überlegte Lösungen:
-> Reduzierte Auflösung: Neben 8 bit kann ich bereits wahlweise 6, 4, 2 
oder sogar 1 bit pro Kanal übertragen. Die effektiven Frameraten steigen 
dann wie erwartet, doch aufgrund der geringeren Farbauflösung sind 
Fading-Effekte wieder unschön. Ich tausche das eine gegen das andere, 
und beides bräuchte ich... :-/

-> Datenkomprimierung: Die LEDs werde, wenn das Werkl fertig ist, wohl 
irgendeine Art von beschreibbaren Mustern aufweisen (Farbverläufe, 
Wiederholungen, etc.) - ich weiß jedoch ehrlich gesagt noch nicht so 
genau, welche Art Muster genau, und so tu ich mir schwer bei der Auswahl 
eines geeigneten Komprimierungsverfahrens - hier liegt auch der Haken, 
siehe weiter unten ("ich weiß nicht was ich will").

-> Anderes Interface: Statt RS232 USB oder Ethernet zu verwenden habe 
ich mir zwar überlegt, vermute aber, dass Ethernet viel zu umständlich 
für eine doch relativ simple Point-to-Point-Anwendung ist, und bei USB 
sowieso der gleiche Sumpf wieder rauskommt, wenn ich einen Seriellen 
Port emuliere (wenn der wieder mit 115200 läuft, ist das ganze für die 
Katz').

Das Hauptproblem ist: "Ich weiß nicht was ich will". Und zwar deswegen, 
weil ich mir eine Anwendungs-Level-Library basteln wollte, mit der ich 
mit einer akzeptablen Framerate (~20 oder mehr) alle LEDs frei steuern 
kann. Ich wollte a priori keine Einschränkungen vornehmen, was die 
übertragenen Daten betrifft, was eben die Kompression bzw. 
Rearrangierung der Daten etwas schwierig macht. Und erst jetzt bin ich 
darauf gekommen, dass der resultierende Datenstrom von 18 KB/s für RS232 
zu hoch ist.

Ich würde gerne wissen, was ihr dazu sagt. Hat jemand Erfahrung in der 
schnellen (wie gesagt, 18 KB/s sollten drin sein) Übertragung von Daten 
an den AVR? Wenn ich USB verwende und dort einen COM-Port simuliere, 
kann ich dann vielleicht höhere Baudraten wählen?

Danke im Voraus :-)

Liebe Grüße aus Wien!
Michi

von H.Joachim S. (crazyhorse)


Lesenswert?

Mit nem USB/RS232 oder 485-Adapter schaffst du deutlich mehr als 115k.
Der Flaschenhals wird am Ende der ATMega sein.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Anstatt immer die komplette Information durchzubollern helfen vielleicht 
befehle wie "Anzeige heller", "Anzeige dunkler", "Anzeige um1 Pixel nach 
links scrollen", etc.

Du wirst wohl kaum ein Insekten-TV bauen wollen mit alle 10 
Millisekunden ein komplett neues Bild?

Freilich brauchst du mit diesem Ansatz mehr Speicher als beim 
Durchpust-Ansatz.

von Peter S. (psavr)


Lesenswert?

Ich würde als ersten, einfachen Ansatz auch auf USB-RS232 gehen, z.B. 
Silabs CP2102. Da hast Du schon mal die 8-fache Baudrate, (921'600 Baud) 
ohne dass Du das ganze bisherige Konzept auf den Kopf stellen musst.

SPI wäre noch eine schnelle Variante, wird aber der PC nicht von Haus 
auf verstehen.

Mit Ethernet wirst Du auch keinen höheren Datendurchsatz hinkriegen, da 
hat die SW für den TCP/IP Stack zu viel zu tun...

von MartinR (Gast)


Lesenswert?

Der PC macht doch aber nur eine Baudrate von 115200 mit, oder?

von Dussel (Gast)


Lesenswert?

>Mit Ethernet wirst Du auch keinen höheren Datendurchsatz hinkriegen, da
>hat die SW für den TCP/IP Stack zu viel zu tun...

TCP/IP hat mit Ethernet in dem Zusammenhang praktisch nichts zu tun. 
Wenn man den PC dazu bringen kann, nur Ethernet zu benutzen, ohne die 
anderen Schichten verarbeiten zu wollen, ist das nicht übermäßig 
kompliziert (das heißt nicht, dass es einfach ist). Es gibt fertige 
Ethernet-Controller, zum Beispiel den ENC28J60.

Als andere Möglichkeit kann man USB auch auf einem AVR programmieren, 
Atmel hat dazu eine Application-Note.
"Implementation runs on very small AVR devices, from 2kBytes and up".
Das ist dann aber relativ kompliziert und zeitkritisch.

von Frank K. (fchk)


Lesenswert?

Michael Borkowski schrieb:

> -> Anderes Interface: Statt RS232 USB oder Ethernet zu verwenden habe
> ich mir zwar überlegt, vermute aber, dass Ethernet viel zu umständlich
> für eine doch relativ simple Point-to-Point-Anwendung ist, und bei USB
> sowieso der gleiche Sumpf wieder rauskommt, wenn ich einen Seriellen
> Port emuliere (wenn der wieder mit 115200 läuft, ist das ganze für die
> Katz').

Bei USB kannst Du Dir beispielsweise den FT245R anschauen. Der gibt 
seine Daten parallel raus, d.h. Du hast dann keine serielle 
Schnittstelle mehr im System. Es könnte dann aber sein, dass Du dann ein 
Controller mit mehr Pins brauchst.

Bei Ethernet brauchst Du kein TCP zu machen - UDP ist viel einfacher zu 
implementieren.

Und solltest Du einfach einen schnelleren Controller brauchen, wartet zB 
ein PIC32MX auf Dich, mit 32 Bits, echten 80 MHz, USB (mit fertigen 
USB-Stack), 10/100 Ethernet (mit fertigem IP-Stack) und anderen netten 
Gimmicks - und der Chip ist auch nicht teurer als ein Mega128.

fchk

von Andreas H. (andreas_h16)


Lesenswert?

Peter S. schrieb:

> Mit Ethernet wirst Du auch keinen höheren Datendurchsatz hinkriegen, da
> hat die SW für den TCP/IP Stack zu viel zu tun...

Für Punkt zu Punkt braucht er keinen TCP/IP Stack. Schicht 2 reicht.

Dann geht's auch schnell.

von Sucher (Gast)


Lesenswert?

Hi

ich habe da nicht so viel Ahnung, aber kannst du das nicht mit einem 
"ArtNetNode" machen. Schau mal beim Radig vorbei 
http://www.ulrichradig.de/home/index.php/avr/dmx-avr-artnetnode

von Rangi J. (rangi)


Lesenswert?

Ich stimme Frank K. zu, der FT245 ist denke ich das was du willst. Damit 
wird am PC eine virtuelle serielle Schnittstelle erzeugt. Bei der kann 
man dann auch Datenraten einstellen, aber die haben keine Einfluss. Am 
ATMega rufst die Daten parallel per Steuerleitungen ab. Das geht richtig 
flott, da der Controller selbst die Geschwindigkeit bestimmt mit der die 
Daten abgenommen werden.
Einziger Nachteil: du brauchst am einen freien Port und noch ein paar 
Steuerausgänge.

von Weingut P. (weinbauer)


Lesenswert?

was den Datenstrom angeht könnte man weitestgehend auf ein Protokoll 
verzichten und per DMX einfach raus schaufeln.
Da wird nur das erste Byte per Frame Error gekennzeichnet und der Rest 
dann einfach rausgepfeffert.
Ob Dein PC-Programm aber sowas schnell genug für > 20 Frames/sec schafft 
... keine Ahnung.
Anderer Ansatz wäre quasi den µC in einen Interpreter zu verwandeln der 
einen Ablauf, der am PC erstellt wurde und z.B. im EEPROM des µC 
gespeichert wird abzuarbeiten.

von Karl H. (kbuchegg)


Lesenswert?

> Und das ist bei Fading-Effekten leider zu wenig (es
ruckelt).

Ich würde ebenfalls auf die Variante setzen: Lass den µC das Fading 
berechnen.

900 LED ist ein 30*30 Screen. Du du dich weder um PWM noch um 
Multiplexen kümmern musst, hat der µC alle Zeit der Welt um die 
Zwischenwerte zu errechnen.

von Dirk B. (Gast)


Lesenswert?

Wenn im Controller noch ein bischen Resourcen übrig sind einfach das 
Fading in den Controller verlagern. Für Sonderfälle evtl. auch mit 
unterschiedlichen Modi: Standard 5Hz/ Ruhig auf 1Hz und einen 
Strobemodus

OK zu spät

von Super G. (Gast)


Lesenswert?

Wenn es um die reine Datenübertragung geht, sind 1Mbit logger drin. Wir 
nutzen das in der Firma. Damit kann der AtMega bei 16 oder 20 Mhz laufen 
und braucht kein Baudratenquarz (z.B. 14.76, oder 18.432 Mhz). 
Allerdings nutzen wir dafür einen FTDI-USB-Seriell Wandler. Durch 
einfaches anpassen der entsprechenden Bytes in der Registry kann man die 
in Windows üblichen Baudraten auf andere Geschwindigkeiten umbiegen. Bei 
uns läuft es so, dass man 1200 Mbit in der Software einstellt, der FTDI 
aber 1Mbit raushaut. Bei der Einstellung 600 Mbit schieben wir 2Mbit 
raus und bei der Einstellung 300 MBit ganze 3Mbit was das Maximum der 
FTDI-Chips darstellt.

Bei Interesse kann ich das genauer Erläutern.

von Michael Borkowski (Gast)


Lesenswert?

Danke an alle für die zahlreichen Antworten!

An alle die mir empfohlen haben, den AVR mehr als Interpreter zu 
verwenden und die Effekte berechnen zu lassen: Ich weiß, das wäre der 
schöne Weg. Das Problem ist, dass ich (noch) nicht weiß was genau ich 
für Effekte/Modi haben will, und mich da a priori noch nicht 
einschränken möchte. Deswegen möchte ich, soweit es geht, die Logik auf 
der PC-Seite lassen... wohl wissend, dass der AVR eigentlich nebenbei 
noch einiges tun könnte ;-)

H.joachim Seifert schrieb:
> Der Flaschenhals wird am Ende der ATMega sein

Von dem was ich gemessen habe, ist der aber relativ untätig. 18 KB/s zu 
verarbeiten (= an die SPI 1:1 weiterzugeben) sollte, denk ich, kein 
Problem sein, zumal die SPI mit knapp 1 MBit/s betrieben wird. Aber 
danke, ich werd schauen dass die Software möglichst effizient läuft!

Frank K. schrieb:
> Bei USB kannst Du Dir beispielsweise den FT245R anschauen. Der gibt
> seine Daten parallel raus, d.h. Du hast dann keine serielle
> Schnittstelle mehr im System. Es könnte dann aber sein, dass Du dann ein
> Controller mit mehr Pins brauchst.

Ich glaub', der wirds werden. Falls es wirklich stimmt, was Rangi Jones 
schreibt (dass die COM-Schnittstelle dann rein virtuell ist und die 
eingestellte Baudrate keinen Einfluss mehr hat), dann klingt das ja toll 
und ich muss nicht viel Änderungen am System durchführen.

Ist das der gleiche, von dem Super Grobi gesprochen hat?

Nochmals danke an alle für die hilfreichen Tipps! :-)

von sebastian (Gast)


Lesenswert?

Wenn du nicht weisst was du willst, hilft vielleicht ein Bootloader?
Dann "komprimierst" du deinen Effekt als compiliertes Programm...

von Michael Borkowski (Gast)


Lesenswert?

So, zwischendurch kam ein Uni-Semester und ein Kreuzbandriss, weswegen 
sich das ganze stark verzögert hat. Inzwischen hab ich mir das UM245R 
DIP-Modul gekauft, damit ein wenig herumgekämpft (man sollte entweder 
AVR + UM245R vom USB-5V-Pegel betreiben oder beides von einer externen 
Stromversorgung, nicht gemischt!) - aber jetzt funktioniert es, die 
Kommunikationsgeschwindigkeit ist mehr als ausreichend (ohne große 
Optimierungen und mit einem etwas hohen Protokoll-Overhead bekomme ich 
35 Hz inklusive Speicherung und Weiterverarbeitung der Datenmenge 
zusammen).

Danke an alle für eure Hinweise! :-)

Liebe Grüße aus Wien,
Michi

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.