Forum: Mikrocontroller und Digitale Elektronik 32x64 RGB LED Matrix - 2 Prozessoren - Datenübergabe


von Frank (Gast)


Lesenswert?

Hi,
ich möchte mit einer 32x64 RGB LED Matrix (Sport) Ereignisse anzeigen 
die über Funk reinkommen.

Aufbau:
32x64 LED  <-- Arduino Mega 2560 <-- Atmel Mega <-- mehrere Funksensoren

Meine Überlegungen:
- da es einfach ist die Matrix mit Arduino zu steuern würde ich den als 
Display Prozessor einsetzen
- der 2te Prozessor deshalb weil das Projekt schon fertig ist
  (außerdem ist alles in Assembler geschrieben das kann ich besser ;)
- da es auch ohne dieses Diplay geht möchte ich nicht mit einem 
Prozessor arbeiten

Also ich habe 2 fertige Bausteine, das Display mit Arduino und meinen 
Funkauswerter.

Jetzt zur Frage - wie würdest Du die Datenübergabe zwischen beiden 
machen, so das das Display smooth weiterläuft und der Funkauswerter das 
Display scheibt ohne einen Funkevent zu verpassen?

Datenmenge ca. 32-64 Byte.

Ich steh echt auf dem Schlauch, ich habe Angst das entweder das Display 
ruckelt oder der Auswerter ein Event verpasst.

Grüße, Frank

von Sebastian R. (sebastian_r569)


Lesenswert?

Du kannst ja mal ausprobieren, ob es wirklich Probleme macht, wenn 
zwischendrin mal Daten per UART oder I2C empfangen werden.

Ich hatte mal eine Großanzeige aus diesen P5-Panels und nem Teensy 
aufgebaut. Der Teensy hat das heavy lifting der Panel-Ansteuerung und 
der Grafikerzeugung gemacht und fungierte als I2C-Slave und bekam so 
seine Daten.

Wobei der Teensy natürlich etwas mehr Bums hat.

von Frank (Gast)


Lesenswert?

Also am liebsten wärh mit ein IC zwischen beiden auf dem der eine liest 
und der andere schreibt - notfalls auch gleichzeitig.

Also ein Speicher IC mit 2 Schnittstellen?

von Eric B. (beric)


Lesenswert?

Woher bekommt der Display Prozessor (Arduino Mega 2560) momentan seine 
Daten?
Wie zeigt der Sensor Prozessor (Atmel Mega) momentan die empfangene 
Daten?

Ich würde die beide enfach über eine serielle Schnittstelle ((Soft) 
UART) mit einander verbinden. Würde mich wundern wenn das bei der kleine 
Datenmenge anfängt zu rückeln.

von Frank (Gast)


Lesenswert?

@Eric B
Arduino zeigt Daten aus eigenen Programm an.
Der Sensor Prozessor hat ein paar Leds ;)

@Sebastian R. & Eric B
JA ich würde gerne auf Uart verzichten, würde das gerne entkoppeln und 
save machen.

von Sebastian R. (sebastian_r569)


Lesenswert?

Frank schrieb:
> Also am liebsten wärh mit ein IC zwischen beiden auf dem der eine liest
> und der andere schreibt - notfalls auch gleichzeitig.
>
> Also ein Speicher IC mit 2 Schnittstellen?

Ob du X Bytes an Daten in deinen Display-Controller schreibst und der 
dadurch blockiert oder ob du X Bytes von deinem Display-Controller aus 
einem Speicher lesen lässt und es ihn blockiert - Die benötigte Zeit 
dafür wird annähernd identisch sein.

DMA würde einiges schneller machen, aber das kann der M2560 nicht.

von Falk B. (falk)


Lesenswert?

Frank schrieb:

> ich möchte mit einer 32x64 RGB LED Matrix (Sport) Ereignisse anzeigen
> die über Funk reinkommen.

Nicht weiter dramatisch.

> Aufbau:
> 32x64 LED  <-- Arduino Mega 2560 <-- Atmel Mega <-- mehrere Funksensoren

Warum 2 CPUs? Eine reicht locker und langweilt sich immer noch.

> - da es einfach ist die Matrix mit Arduino zu steuern würde ich den als
> Display Prozessor einsetzen

OK.

> - der 2te Prozessor deshalb weil das Projekt schon fertig ist
>   (außerdem ist alles in Assembler geschrieben das kann ich besser ;)

Ohje.

> - da es auch ohne dieses Diplay geht möchte ich nicht mit einem
> Prozessor arbeiten

OK.

> Also ich habe 2 fertige Bausteine, das Display mit Arduino und meinen
> Funkauswerter.
>
> Jetzt zur Frage - wie würdest Du die Datenübergabe zwischen beiden
> machen, so das das Display smooth weiterläuft und der Funkauswerter das
> Display scheibt ohne einen Funkevent zu verpassen?

Such dir was aus. UART, I2C, whatever. Ich würde UART nehmen, geht kaum 
einfacher.

> Datenmenge ca. 32-64 Byte.

Also quasi nix. Aber in welcher Zeit? 1 mal pro Sekunde?

> Ich steh echt auf dem Schlauch, ich habe Angst das entweder das Display
> ruckelt oder der Auswerter ein Event verpasst.

Ach herje, Mal wieder Generation Snowflake am Start? Und das bei DEM 
Wetter?

von Falk B. (falk)


Lesenswert?

Frank schrieb:
> Also am liebsten wärh mit ein IC zwischen beiden auf dem der eine liest
> und der andere schreibt - notfalls auch gleichzeitig.

OMG!!! Das ist ja Snowflake^2!!!!

> Also ein Speicher IC mit 2 Schnittstellen?

Nennt sich Dual Portet RAM, ist heute eher exotisch und hier totaler 
Overkill. Aber mach mal, wenn du dadurch deine Angst eindämmen kannst . 
. .

von Falk B. (falk)


Lesenswert?

Oder doch nur wieder ein Troll?

von Frank (Gast)


Lesenswert?

Ah ja, Snowflake und Troll wa? Kinder ;)

Aber Dual-Port RAM finde ich spannend und lustig.

Da es um Zeit- und Zielauswertung im Sportschießen geht, gibt es viele 
zeitkritische Events innerhalb von einigen Sekunden.

Denke das wird eine saubere Lösung die Daten im Speicher bereitzustellen 
und dann frei mit unterscheidlichen Displays/Rasberry+TV darauf 
zuzugreifen.

von Sebastian R. (sebastian_r569)


Lesenswert?

Frank schrieb:

> Da es um Zeit- und Zielauswertung im Sportschießen geht, gibt es viele
> zeitkritische Events innerhalb von einigen Sekunden.


Zeitauswertung läuft ja auf dem anderen Controller, der dafür alle Zeit 
der Welt hat, oder?
Wenn er die Zeit gemessen hat, kann er seelenruhig die Werte zum 
Displaycontroller schicken.


"Einige Sekunden" sind in Mikrocontroller-Welten eine halbe Ewigkeit.

Messwert berechnen, zum anderen Controller schicken, dort einlesen und 
auf die Anzeige bringen dürfte in ein paar Millisekunden erledigt sein.

von Frank (Gast)


Lesenswert?

Sebastian R. schrieb:
> Zeitauswertung läuft ja auf dem anderen Controller, der dafür alle Zeit
> der Welt hat, oder?

2 Controller - Display und Funk-/Zeit-/Zielauswertung

Er muss 10 Funksensoren auf Treffer überwachen, die Ziele zuordnen, die 
Zeiten der 2 Schützen zwischen den Treffern errechnen, im Duellmodus 
geht's um ne hunderstel die ich schneller war als mein Gegner ;)

Der Dual Speicher ist eigentlich genau das was ich gesucht habe, wann 
immer ein Ereigniss eintritt schiebe ich das rüber.
Der Displaycontroller kann 10 mal in der Sekunde nackucken was er 
anzeigen soll.
Hauptsache ist ich muss mich nicht ums Timing kümmern und nix 
interferiert...

von K. S. (the_yrr)


Lesenswert?

Frank schrieb:
> Der Displaycontroller kann 10 mal in der Sekunde nackucken was er
> anzeigen soll.
> Hauptsache ist ich muss mich nicht ums Timing kümmern und nix
> interferiert...

da brauchst du nen Dual port RAM mit eingebauter arbitration. höchst 
wahrscheilich musst du dich um ein Busy Flag kümmern wenn du die gleiche 
Adresse gleichzeitig ließt und schreibst (wenn nicht kommt auf einer 
seite Müll raus/rein). Was machst du wenn Daten aus mehreren Byte (bzw. 
mehr bit als der Datenbus hat) hast und nur ein Teil davon aktualisiert 
ist => da kommt wieder Müll raus.

nimm nen UART, mach auf das Display nen interrupt wenn ein Byte 
empfangen wurde, schreib im interrupt das Byte in nen Buffer (Array + 
Variable für schreib Index reicht), setz nen Flag wenn alle Daten neu 
sind und wenn das Flag gesetzt ist aktualisier in der Hauptschleife, 
damit schaffst du auch 100mal in der sekunde. oder schreib in nen 
Ringbuffer, dann hast du aber wieder das Problem teil neu/teil alt = 
Müll.
wenn du immer noch bedenken hast limitier das senden neuer daten auf 
eine gewisse Rate oder warte auf ein "display aktualisiert" Signal dass 
du zurück sendest.
wenn du Assembler programmierst schläft der µC dann immer noch die 
meiste Zeit, wenn du wirklich was zeitkritisches hast im Bereich von 
wenigen takten vorher Interrupts aus und beim UART halt 20 Takte warten 
zwischen jedem gesendeten Byte.

von Frank (Gast)


Lesenswert?

K. S. schrieb:
> nimm nen UART, mach auf das Display nen interrupt wenn ein Byte
> empfangen wurde, schreib im interrupt das Byte in nen Buffer

Hmmm hast Recht, ich werde den Display interrupt anschieben ein paar 
Bytes schnell rüberschieben und kucken ob das das Display flackern 
lässt...

Stimmt schon, den DuoRam muss ich dennoch mal versuchen ist einfach zu 
intressant ;)

von Sebastian R. (sebastian_r569)


Lesenswert?

Das war die erste Antwort hier.

Probier es aus, ob es wirklich Probleme macht.

Meist hat man eine falsche Vorstellung davon, wie lange etwas dauer.

Wie gesagt "einige Sekunden" sind Welten für einen Controller, der ein 
paar Millionen Befehle pro Sekunde ausführen kann.

Dementsprechend ist das Empfangen und Verwursten von ein paar Bytes 
schnell gemacht, bevor der Mensch etwas davon mitbekommt. Das Display.. 
Alles über 25Hz ist dem Auge eh wurscht. Und da du da ja keine HFR-Filme 
in 3D drauf gucken willst, hast du zwischen den Frames in µC-relation 
echt eine Ewigkeit Zeit, die Daten zu bekommen.

von georg (Gast)


Lesenswert?

Frank schrieb:
> Der Dual Speicher ist eigentlich genau das was ich gesucht habe, wann
> immer ein Ereigniss eintritt schiebe ich das rüber.
> Der Displaycontroller kann 10 mal in der Sekunde nackucken was er
> anzeigen soll.

Das ist Unsinn und löst auch das Problem nicht - wenn Display-Ausgabe 
und Daten Einschreiben nebeneinander her laufen ruckelt das Bild 
ziemlich wahrscheinlich. Es geht genau umgekehrt: der Ausgabespeicher 
wird doppelt vorgesehen, das sind ja ganz wenig Daten, und die Anzeige 
multiplext sich entweder durch den einen oder den anderen Speicher. Neue 
Daten werden in den jeweils anderen reingeschrieben, Timing egal, und 
wenn sie vollständig sind wird die Anzeige umgeschaltet. So wird 
entweder der alte oder der neue Inhalt konsistent angezeigt.

Georg

von Frank (Gast)


Lesenswert?

Äh ja hat sich erledigt.

Also beim Adafruit 32x64 LED Display anteuern mit Arduino herrscht eine 
Menge Leerlauf - es ist überhaupt kein Thema den Arduino per INT ein 
Bytes zuzuführen ;)

von Hurtig (Gast)


Lesenswert?

Der TO sollte - bevor hier spekuliert wird - exakt die Anforderungen 
spezifizieren. Ansonsten: nächstes Thema.

von georg (Gast)


Lesenswert?

Frank schrieb:
> Also beim Adafruit 32x64 LED Display anteuern mit Arduino herrscht eine
> Menge Leerlauf - es ist überhaupt kein Thema den Arduino per INT ein
> Bytes zuzuführen

Das ist aber nicht die Frage. Wenn die Anzeige mitten im Mux-Durchlauf 
geändert wird, so wird in der oberen Bildhälfte der alte und in der 
unteren der neue Bildinhalt angezeigt, natürlich sieht man das als 
Zucken und Ruckeln. Beim Fernseher löst man das so dass der Bildinhalt 
nur während des vertikalen Rücklaufs geändert wird, sowas ähnliches hat 
aber hier noch niemand vorgeschlagen.

Wahrscheinlich hört sich Dual Ported Ram einfach zu geil an, da kann man 
nicht widerstehen.

Georg

von Sebastian R. (sebastian_r569)


Lesenswert?

Die entsprechenden Libraries für die Matrix betreiben eigentlich schon 
Double-Buffering.

Und der Ablauf ist ja diskret. Werte im Interrupt empfangen, in der Main 
verwursten, in den Anzeigebuffer, Buffer ausgeben. Also da sollte es 
keine Probleme geben, wenn man es richtig macht.

von Falk B. (falk)


Lesenswert?

Das Zauberwort lautet Synchronisation. Also die Daten nicht irgendwann 
in den Datenpuffer reinschreiben sondern im richtigen Augenblick.

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.