Forum: Mikrocontroller und Digitale Elektronik schnelles Protokoll zur RGB LED Steuerung


von nikolaus (Gast)


Lesenswert?

Guten Tag,

ich stehe vor folgendem Problem: Ich habe viele (ca 200, werden aber 
noch mehr, maximal 700) ATTiny13A (mit 9.6MHz), an denen RGB LEDs 
angeschlossen sind und per Software PWM gedimmt werden.
Also sind an jedem AVR noch 2 Pins frei (3x LED, VCC, GND, RESET).
Diese ganzen AVRs muss ich nun miteinander vernetzen, damit sie über ein 
Protokoll die RGB Daten empfangen können. Das sind 40Bit Nutzdaten pro 
AVR (16bit Adresse, 8bit rot, 8bit grün, 8bit blau).
Diese Daten sollen ca 30mal pro Sekunde aktualisiert werden.
Also müssen pro Sekunde maximal 40 Bit*700*30 = 840 000 Bit = 105 000 
Byte übertragen werden...
Die AVRs haben keine interne Hardware Schnittstelle...
Mit welchem Protokoll/Interface würdet ihr das lösen?
Auf dem AVR sind noch ca 400Byte Speicher frei...

Viele Grüße ;)

von Lord Z. (lordziu)


Lesenswert?

Willst du das nicht lieber über entsprechende Treiber lösen? zB WS2801? 
Die kann man kaskadieren und es entfällt das Programmieren von 200-700 
µC.

von Uwe (Gast)


Lesenswert?

Clk und Data mit RS422 (EIA-422) Treibern und jeder 10. Empfänger ist 
ein Repeater. Jeder tiny braucht 2 RS422 Empfänger.
http://de.wikipedia.org/wiki/EIA-422

von Uwe N. (ex-aetzer)


Lesenswert?

Hallo,

ich würde das ganze mit Software TWI lösen, vielmehr bleibt ja nicht ...
Aber warum 16Bit Adresse ? Wenn du max. 700 µCs adressieren willst, dann 
reichen doch 10Bit zur Adressierung aus.

nikolaus schrieb:
> Diese Daten sollen ca 30mal pro Sekunde aktualisiert werden.
Möchtest du Animationen darstellen ?

nikolaus schrieb:
> Auf dem AVR sind noch ca 400Byte Speicher frei...

guter Grund, um mal wieder den Assembler auszupacken ;)

Gruss Uwe

von nikolaus (Gast)


Lesenswert?

Lord Ziu schrieb:
> Willst du das nicht lieber über entsprechende Treiber lösen? zB WS2801?
> Die kann man kaskadieren und es entfällt das Programmieren von 200-700
> µC.
Aber so kann ich doch keine einzelnen LED's steuern, oder hab ich da was 
im Datenblatt übersehen?

Uwe schrieb:
> Clk und Data mit RS422 (EIA-422) Treibern und jeder 10. Empfänger ist
> ein Repeater. Jeder tiny braucht 2 RS422 Empfänger.
> http://de.wikipedia.org/wiki/EIA-422
Einen extra Treiber wollte ich vermeiden, aber das währe wohl eine 
einfache und sichere Lösung...

Uwe N. schrieb:
> ich würde das ganze mit Software TWI lösen, vielmehr bleibt ja nicht ...
> Aber warum 16Bit Adresse ? Wenn du max. 700 µCs adressieren willst, dann
> reichen doch 10Bit zur Adressierung aus.
Ja, die Reichen auch aus, ich habe mit 16 Bit gerechnet um auch einen 
"Puffer" zu haben, eigentlich reichen 10 Bit locker aus.

>> Diese Daten sollen ca 30mal pro Sekunde aktualisiert werden.
> Möchtest du Animationen darstellen ?
Ja, mehr oder weniger ;) die LED's werden aber nicht in einer Matrix 
angeordnet

> guter Grund, um mal wieder den Assembler auszupacken ;)
Das habe ich auch vermutet :D

Ich überlege ob ein Software SPI nicht auch eine schlechte Idee wäre... 
einfach CLK an den INT0 Pin anschließen und bei jedem Interrupt dann den 
anderen Pin auslesen... Und damit es gut funktioniert die Leitungen mit 
einem MOSFET Treiber ansteuern... Und natürlich alle paar µC's einen 
Repeater...
Nur wenn mal ein AVR ein Bit verschluckt spinnt alles total...

Was haltet ihr davon?

von Uwe N. (ex-aetzer)


Lesenswert?

nikolaus schrieb:
> Was haltet ihr davon?

Ungünstig wenn du nur 2 Pins frei hast: du brauchst entweder viele, 
viele CSs Leitungen oder wenigstens 3 freie Pins: CLK, DIN und DOUT zum 
durchschieben der Daten an den nächsten µC.

von nikolaus (Gast)


Lesenswert?

Uwe N. schrieb:
> Ungünstig wenn du nur 2 Pins frei hast: du brauchst entweder viele,
> viele CSs Leitungen oder wenigstens 3 freie Pins: CLK, DIN und DOUT zum
> durchschieben der Daten an den nächsten µC.
Jeder µC hat doch eine eigene Adresse, also kann ich alle CLK und DATA 
Leitungen verbinden (also nicht alle, dann wäre die Leitungskapazität zu 
hoch, aber bestimmt 20 oder so)

von Uwe N. (ex-aetzer)


Lesenswert?

nikolaus schrieb:
> Ja, die Reichen auch aus, ich habe mit 16 Bit gerechnet um auch einen
> "Puffer" zu haben, eigentlich reichen 10 Bit locker aus.

Einen Buffer von immerhin 324 Möglichkeiten hast du auch bei 10Bit ...

Gruss Uwe

von nikolaus (Gast)


Lesenswert?

> Einen Buffer von immerhin 324 Möglichkeiten hast du auch bei 10Bit ...

Ich meinte bei der Übertragungsgeschwindigkeit ;)

von Uwe N. (ex-aetzer)


Lesenswert?

nikolaus schrieb:
> Jeder µC hat doch eine eigene Adresse, ...

SPI benutzt keine direkte Adressierung wie TWI, wenn du eine Daisy Chain 
Konfiguration nutzt (dann würden 3 Pins reichen), dann muss du, wenn du 
z.B. den 10 µC in der Kette ansprechen willst, eben 11 x (xBit) senden, 
bis der Datenstrom in dem gewünschten µC eingetaktet ist.

Deshalb würde ich lieber TWI nutzen, da kann man auch mal einzelne µCs 
ansprechen.

EDIT: Dinge wie Repeater lass ich jetzt mal aussen vor.

von nikolaus (Gast)


Lesenswert?

Uwe N. schrieb:
> SPI benutzt keine direkte Adressierung wie TWI, wenn du eine Daisy Chain
> Konfiguration nutzt (dann würden 3 Pins reichen), dann muss du, wenn du
> z.B. den 10 µC in der Kette ansprechen willst, eben 11 x (xBit) senden,
> bis der Datenstrom in dem gewünschten µC eingetaktet ist.
>
> Deshalb würde ich lieber TWI nutzen, da kann man auch mal einzelne µCs
> ansprechen.
>
> EDIT: Dinge wie Repeater lass ich jetzt mal aussen vor.

Der µC hat ja kein SPI, deswegen hätte ich das auch in Software 
realisieren müssen, und dann kann ich so Sachen wie eine Adresse ja 
einbauen ;)

von Dennis X. (Gast)


Lesenswert?

Uwe N. schrieb:
> Deshalb würde ich lieber TWI nutzen, da kann man auch mal einzelne µCs
> ansprechen.

Hallo,
RS485 wäre doch hier sicherlich auch angebracht oder? Ich mein mit 
gewissen Umsetzerbausteinen ist das auch wirklich Bus tauglich. Hab 
sowas in der Art auch schon einmal gemacht. Da würde die 
Übertragungsrate auch sicherlich nicht knapp werden. Aber hier ist noch 
kein Wort über die Kabellänge gesprochen worden. Je nach dem fällt hier 
dann IIC sowiso weg.

Dennis

von Uwe N. (ex-aetzer)


Lesenswert?

Dennis X. schrieb:
> RS485 wäre doch hier sicherlich auch angebracht oder?

Ja sicher, es muss etwas "langstreckentaugliches" sein, der TO möchte 
i.M. aber reine Protokoll-Fragen klären :)

von Sam .. (sam1994)


Lesenswert?

Ich würde ein abgeändertes SPI-Protokoll empfehlen, um das soft-PWM 
möglichst wenig zu verfälschen.

Z.B:

1. Data-High -> alle Attinys müssen innerhalb z.B 30 Takten in einer
   nop-Sequenz sein.
2. Data-Low -> alle Attinys springen per Interrupt in die
   Empfangroutine, die Zeit, die sie brauchen ist konstant,
   da sie vorher alle nur nop ausgeführt haben.
3. Die Daten kommen mit 4.8Mbit/s, nach den ersten 16bit ist eine Pause
   von 3 Takten, die nicht addressierten Avrs, beenden den Empfang
4. Der addressierte Attiny empfängt die Daten.

Das ist asynchron und dafür reicht eine Leitung.

4.8Mbit Empfang kann man so erreichen:
1
sbic PORTx, y
2
ori reg, 0
3
...
4
sbic PORTx, y
5
ori reg, 7


Wie kommt man eigentlich auf die Idee 700 Attinys zu verbinden?

von Lord Z. (lordziu)


Lesenswert?

nikolaus schrieb:
> Lord Ziu schrieb:
>> Willst du das nicht lieber über entsprechende Treiber lösen? zB WS2801?
>> Die kann man kaskadieren und es entfällt das Programmieren von 200-700
>> µC.
> Aber so kann ich doch keine einzelnen LED's steuern, oder hab ich da was
> im Datenblatt übersehen?

Na klar kannst du.

Ein WS2801 steuert genau eine RGB-LED. 3 Anschlüsse vom WS2801 gehen auf 
R,G,B von der LED.

Den WS2801 steuerst du über 2 Leitungen an. Du kannst für jeden WS2801 
z.B. angeben, welchen PWM-Wert Anschluß1 (R), Anschluß2 (G), Anschluß3 
(B) haben soll.

Somit kannst du mit einem WS2801, einer RGB-LED und 3 Rs alle Farben 
darstellen die gehen. Und die KSQs sind auch schon auf dem Chip.

Und du kannst die Dinger hintereinanderschalten. Wenn du zB 10 Stück 
kaskadierst, dann schickst du über deine (immer noch nur) 2 Leitungen 
vom µC halt nicht nur einen Steuerbefehl, sondern 10 Befehle, je einen 
pro LED.

Bevor du versuchst 700 µC aufzubauen, womöglich noch mit serieller 
Verbindung und dem ganzen Aufwand der sich aus der Adressierung und 
sonst was ergibt, würde ich diese Lösung erstmal genauer unter die Lupe 
nehmen.

Ganz zu schweigen davon, dass du für ~ 0,50€ pro Chip sicher billiger 
hinkommst, als mit der 700-Controller-Lösung.

von nikolaus (Gast)


Lesenswert?

Samuel K. schrieb:
> 1. Data-High -> alle Attinys müssen innerhalb z.B 30 Takten in einer
>    nop-Sequenz sein.

Wie meinst du das genau? Es kann ja sein, dass gerade wenn die 
Übertragung losgeht ein ATTiny in der ISR der PWM ist...

von Sam .. (sam1994)


Lesenswert?

Das funktioniert nur wenn in der ISR sofort per sei die Interrupts 
freigegeben werden. In C muss man das mit __attribute__(naked) machen.
1
INT0_vect:
2
  sbic PORTx, y
3
  rjmp nop_seq
4
  
5
  sbic PORTx, 0
6
  ori reg, 0
7
  ...
8
  
9
  ;SREG wiederhestellen
10
  pop x ;nicht in die pop_seq zurückspringen
11
  pop x
12
  ;oder (auf Attiny13 schneller)
13
  ;in x, SPL
14
  ;subi x, -2
15
  ;out SPL, x
16
  reti
17
18
nop_seq:
19
  ;SREG für später sichern
20
  nop
21
  nop
22
  nop
23
  nop
24
  ...
25
  Nach maximal 30-8 Takten wird zurueck in INT0_vect gesprungen
26
  dann werden die Daten eingelesen
Die Übertragung dauert vielleicht 15µs, wenn das zuviel ist musst du die 
Attinys wohl synchronisieren.

von Anon Y. (avion23)


Lesenswert?

Hallo zusammen,
was spricht eigentlich gegen rs232?
Man muss dann einen attiny25 verwenden. Das ist aber in jedem Fall 
sinnvoll, weil es der Nachfolger des attiny13 mit mehr Speicher ist. 
Dazu 250kHz PWM und noch einiges anderes mehr zum gleichen Preis.

RS232 läuft dann in Hardware ab. Nur wenn ein byte fertig ist muss es 
gelesen werden. Das kann man in einer state machine erledigen.

von Dennis X. (Gast)


Lesenswert?

rs232??? da muss doch an jeden μC die entsprechende hardware oder denk 
ich gerade schief? aber ein projekt mit 700 μC möchte ich auch nicht 
finanzieren...
vielleicht mal bisschen genauer um was es geht..

dennis

von Karl H. (kbuchegg)


Lesenswert?

Dennis X. schrieb:
> rs232??? da muss doch an jeden μC die entsprechende hardware

wozu?
Solange nur 1 Tiny mit einem anderen Tiny spricht ist es doch völlig 
Wurscht ob das auf RS232 +-12 Volt Pegeln oder auf 5V-TTL Pegeln 
passiert.

von Anon Y. (avion23)


Lesenswert?

Entsprechende Hardware = rx und tx mit TTL-level.

von Sam .. (sam1994)


Lesenswert?

Gegen wohl alle Protokolle spricht die Aufwändigkeit. Sobald der µC 
empfängt, ist das SoftPWM blockiert. Daher scheidet SPI, UART, TWI von 
vornerein aus.

Tiny25 ist deutlich teurer als Tiny13

von Didi S. (kokisan2000)


Lesenswert?

Tiny13 für solch eine Anwendung verdient mein Respekt! Die 
Programmierung ist schon sportlich. Allerdings 700 Controller 
programmieren ist bestimmt kein vergnügen. Hoffentlich gibts da nie ein 
Firmwareupdate.

Ich habe schon mal 120 RGB gebraucht und die dann mit WS2801 betrieben. 
Das war zwar unsportlicher, hat aber dafür sofort funktioniert ;-)

In den Stückzahlen bekommst Du den WS2801 schon für 40 Cent.
http://shop.soda-light.de/product_info.php?info=p14_ws2801-rgb-led-treiber.html&XTCsid=hkbjipm1r5a3t3cm5bhnijtkl1

Bei 700 Stück ist vielleicht noch mehr drin.

Gruß
kokisan

von nikolaus (Gast)


Lesenswert?

Hallo,

ich habe nun nochmal etwas genauer darüber nachgedacht...
Ich werde die LEDs in Gruppen von maximal 256 Geräten unterteilen.
Dann muss ich nur noch 32 Bit (8 Bit Adresse, und jeweils 8 Bit 
Farbdaten) übertragen.
Also habe ich für jedes Paket 130µs Zeit. (1s/(30 Bilder/s)/256 = 130)
in den 130µs müssen dann 32 Bit übertragen werden, das macht also 
130µs/32 = 4µs bzw ca 250kHz.
Der AVR läuft mit 9.6MHz, d.h. pro Takt braucht er ca 0.1µs, also hätte 
ich ca. alle 40 Takte einen Interrupt.
Denkt ihr das ist in Assembler ein lösbares Problem oder wird das zu 
knapp?

Danke schonmal für eure Hilfe ;)

von Sam .. (sam1994)


Lesenswert?

40 Takte geht gut, bedenke aber dass dein softpwm unterbrochen werden 
muss, sonst funktionmiert es nicht mehr.

Sag bitte nicht, dass das eine Led-Matrix wird...

von nikolaus (Gast)


Lesenswert?

Samuel K. schrieb:
> Sag bitte nicht, dass das eine Led-Matrix wird...
Nein, keine Matrix ;) Dafür gäbe es wesentlich elegantere Möglichkeiten 
als jeder LED einen extra µC zu verpassen :D
Es wird ein anderes Beleuchtungsprojekt/Designprojekt, bis jetzt 
existiert die Idee aber nur in meinem Kopf ;)

von Ralph (Gast)


Lesenswert?

nikolaus schrieb:
> Es wird ein anderes Beleuchtungsprojekt/Designprojekt, bis jetzt
> existiert die Idee aber nur in meinem Kopf ;)

Mit der Hardwareauslegung sollte sie auch da bleiben.

von Dennis X. (Gast)


Lesenswert?

Hmm mir wirkt das ganze auch etwas komisch. Beschreibe doch mal was es 
werden soll. Bin irgendwie so neugierig.

von Stefan (Gast)


Lesenswert?

Hallo,

schau dir doch mal an wie die Profis aus der Beleuchtungstechnuk das 
gelöst haben.

Stichwort: DMX512

Gruss Stefan

von R2D2 (Gast)


Lesenswert?

DMX ist hier weder von der Hardware noch vom Protokoll her sinnvoll.

RS-485 zur Kommunikation zwischen benachbarten Mikrocontrollern ist 
Overkill und das DMX-Protokoll unterstützt nur die Übertragung von 
512Bytes, was hier offensichtlich nicht ausreicht.

Mein Vorschlag: Wenns keine fertiger LED-Treiber sein soll würde ich 
zumindest nicht einen sondern mehrere Busse machen. Damit hält man die 
Datenrate auf jedem Bus niedrig und kann sich für jedes Bit etwas Zeit 
lassen.

Leider gibt's mal wieder keine Infos zum Projekt, sonst könnte man evtl. 
noch sinnvollere Lösungen vorschlagen.

von Dennis X. (Gast)


Lesenswert?

R2D2 schrieb:
> Leider gibt's mal wieder keine Infos zum Projekt, sonst könnte man evtl.
> noch sinnvollere Lösungen vorschlagen.

Danke!

von gaast (Gast)


Lesenswert?

Ich würde ja damit anfangen, die völlig unnötige Auflösung von 8 Bit pro 
Farbe zu reduzieren.

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.