Forum: Mikrocontroller und Digitale Elektronik Theorie LED Display


von Peter F. (piet)


Lesenswert?

Hallo!
Es geht im eine kleine LED installation an meinem Haus zu Deko zwecken, 
der Testaufbau steht und die erste Software Version ist fertig.
Das ganze soll Farbverläufe und fertige Programme abspielen die LEDs 
kommen in kleine 5-10cm Plastikkugeln und werden an die Balkone 
montiert.

Dafür möchte ich kleine AVR basierte Module verwenden die über einen Bus 
angesteuert werden, UART über RS485.
Jedes Modul steuert 8 LEDs über SoftPWM und bekommt die PWM-Daten per 
UART, das geht auch gerade so, Mega16 mit 24 Kanal Soft-PWM, steht 
fertig ausgebaut neben mir und blinkt ;-)

Nun möchte ich mind. 20 Frames pro Sekunde darstellen, wenn jetzt jede 
LED 3 Byte an Daten benötigt für die Helligkeit (256 Stufen) sind das 24 
Bytes pro Frame je Modul + Protokoll overhead (8 x 3). Das macht dann 
480 Bytes pro Sekunde (24 x 20) plus overhead je Modul.
Mit jedem Modul das später noch drann kommt steigt dann die benötigte 
Datenmenge pro Sekunde um diesen Wert. (480 x n)

Wenn ich also den Bus mit 56000 Baud laufen lasse und ein Baud ein Bit 
ist in diesem Fall sind das 7000 Byte pro Sekunde (56000/8).
Das heisst ich könnte maximal 14 Module an den Bus hängen (7000/480) 
ohne mit der Framerate runter zu gehen oder die Farbtiefe zu verringern, 
den Protokoll overhead jetzt mal ignoriert.

Oder habe ich da irgendwo nen Fehler drinn?

Mfg,
Peter

von ... (Gast)


Lesenswert?

Kommt hin.

von Michael U. (amiga)


Lesenswert?

Hallo,

kommt nicht hin.

56000 Baud sind rund 5600 Byte/s. Du hast Start- und Stopbit vergessen, 
also 56000/10. Zumindest, wenn Du eine übliche asyncrone Übertragung 
benutzt.

Gruß aus Berlin
Michael

von Peter F. (piet)


Lesenswert?

Michael U. schrieb:
> 56000 Baud sind rund 5600 Byte/s. Du hast Start- und Stopbit vergessen,
> also 56000/10. Zumindest, wenn Du eine übliche asyncrone Übertragung
> benutzt.

Danke für das Feedback!
Daran hatte ich garnicht gedacht... Mhm. das stellt mich jetzt vor ein 
Problem, erstmal kommen nur 4-6 an den Bus ich wollte dann aber auch mit 
der Zeit deutlich mehr drann hängen.
Deutlich langsamer als 16Mhz kann ich nich werden, der nächst passende 
Quarz für eine deutlich größere Baudrate ist zu klein mit ~14,5 der 
nächst größere ist zu groß mit ~18,5 Mhz...

Könnte ich einen ATtiny vor jeden ATMega16 setzen der die Kommunikation 
und das Protokoll behandelt und am Ende nur die Nutzdaten langsamer per 
Soft-UART an jeden µC weiterleitet...

Oder mehrere Stränge aufbauen, am Rechner kann ich ja mehrere 
USB-UART-RS485 Wandler anschließen. -_-

Mfg,
Peter

von avr (Gast)


Lesenswert?

Hallo Peter,

wenn der Bus nur die Atmel verbinden soll zwingt dich keiner,
die üblichen Baudraten zu benutzen.

Mit guten Treibern und ordentlicher Verkabelung könntest du
bei 16 MHz auch eine Baudrate von z.B. 100000 nehmen.
Das USART-Modul besteht nicht auf 9600 und co..

Falls ein PC mitmischen soll geht es natürlich nicht direkt
(obwohl auch PCs krumme Baudraten können) aber mit einem
Umsetzer (z.B. MEGA328 mit 2 RS232) ist das auch kein
Problem.

gruß avr

von Guido Körber (Gast)


Lesenswert?

Eine Sache nicht vergessen: Wenn Du alle Module nacheinander mit neuen 
Daten beschickst, dann gib es einen Welleneffekt da die LEDs 
nacheinander auf neue Helligkeiten wechseln.

von Peter (Gast)


Lesenswert?

müssen denn immer alle moduel mit neuen daten versorgt werden? Wenn sich 
etwas nicht ändern muss es auch nicht neu übertragen werden.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Stimmt, man könnte eine Adressierung verwenden.
1. Jedes Modul individuell ansprechen.
2. Alle Module gleichzeitig ansprechen (identische Daten) = Broadcast.
3. Modulgruppen werwenden: Alle Module einer Gruppen-ID gleichzeitig 
ansprechen.
4. Eine Liste an Modul-IDs mitschicken = beliebige Module gleichzeitig 
ansprechen (also eine Erweiterung von 1.)

von Peter F. (piet)


Lesenswert?

Danke für die vielen Anregungen!

avr schrieb:
> Mit guten Treibern und ordentlicher Verkabelung könntest du
> bei 16 MHz auch eine Baudrate von z.B. 100000 nehmen.
> Das USART-Modul besteht nicht auf 9600 und co..

Hey, danke für den Tip, daran habe ich ja garnicht gedacht das ich mit 
einem passendem Adapter ja auch "krumme" braudraten fahren kann.
Da ich RS485 über eine geschirmte TP Leitung mit Terminierung nutzen 
möchte sollte das kein Problem geben, denke ich, mit der Verkabelung.

Peter (Gast):
> Eine Sache nicht vergessen: Wenn Du alle Module nacheinander mit neuen
> Daten beschickst, dann gib es einen Welleneffekt da die LEDs
> nacheinander auf neue Helligkeiten wechseln.

Oh... daran hatte ich garnicht richtig gedacht, ob das wohl groß ins 
gewicht fällt?

Christian H. (netzwanze):
> 1. Jedes Modul individuell ansprechen.
> 2. Alle Module gleichzeitig ansprechen (identische Daten) = Broadcast.
> 4. Eine Liste an Modul-IDs mitschicken = beliebige Module gleichzeitig
> ansprechen (also eine Erweiterung von 1.)

Ich hatte bisher in der Theorie eine Lösung aus allen 3 Punkten 
erstellt, aber damit gibt es auch Probleme.
Jedes Modul hat eine eigene und es gibt eine Broadcast ID.
Ich wollte dann nacheinander, Adressierte Pakete an jedes Modul 
schicken, also doch quasi ein Broadcast.
Jedes Modul sucht sich aus diesem Broadcast dann den Datenblock das ihm 
gehört und stellt diesen dar.
Dabei währe es jetzt möglich auch nur einzelene Module anzusprechen und 
nur die Daten zu senden die sich geändert haben.

STARTSEQUENZ
01_LED1_LED2_LED3_LED4_LED5_LED6_LED7_LED8_NULL
02_LED1_LED2_LED3_LED4_LED5_LED6_LED7_LED8_NULL
04_LED1_LED2_LED3_LED4_LED5_LED6_LED7_LED8_NULL
ENDSEQUENZ

Gibt es vielleicht fertige Projekte die ähnlich aufgebaut sind wo ich 
mir mal anschaun kann wie andere das gelöst haben?

Mfg,
Peter

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.