Forum: Mikrocontroller und Digitale Elektronik IRMP und ws2811


von Vzycl (Gast)


Lesenswert?

Hi
Ich habe vor mir ein Moodlight zu bauen.
Es soll aus 9 ws2811 Chips bestehen woran je 3 rgb Led hängen.
Fernsteuerbar über Ir Fernbedienung

Allerdings hab ich schon bei der Planung Probleme.
Und zwar beim Microcontroller.
Eigentlich wollte ich einen kleinen nehmen und dachte an Attiny45 mit 
8MHz.

Fernbedienung wollte ich mit dem IRMP auswerten.
Dieser muß min. 10000 pro Sekunde aufgerufen werden für das Nec42 
Protokoll.
Also würde alle 800 Takte der Interrupt aufgerufen werden.

Soweit noch in Ordnung. Nun kommt allerdings noch die Steuerung der 
ws2811 Kette hinzu.
Dafür hab ich die Light_ws2812 Library von  Tim  (cpldcpu) ausgesucht.

Nur komm ich jetzt auf ein Zeitproblem.
Für die Led müssen 24x9 Bits übertragen werden was bei den 8MHz 2268 
Takte verbrauchen würde.
Allerdings hab ich wegen dem IRMP nur 800 zur Verfügung (Eigentlich noch 
weniger da der IRMP ja auch noch was braucht,  leider steht da nicht wie 
viel genau. )

Jetzt stellt sich die Frage ob ein solcher Aufbau überhaupt möglich ist 
und wenn ja,  wie?

von Vzycl (Gast)


Lesenswert?

Keiner eine Idee?
Bei so viel Profis hier im Forum schon seltsam.

Mir ist bis jetzt nur dazu eingefallen das auf 2 Tinys aufzuteilen.
Einmal IR, einmal ws2811 Steuerung.
Oder aber einen anderen LED Treiberchip.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Da ich keine Ahnung von den WS2811-Dingern habe und daher auch nicht 
weiß, wie zeitkritisch das Timing ist, klingt Deine Idee, einfach zwei 
ATTinys dafür zu nehmen, gar nicht so schlecht.

von Tim  . (cpldcpu)


Lesenswert?

Tja, zwei zeitkritische Protokolle per Bitbanging gleichzeitig zu 
bedienen ist ein nicht einfach zu lösendes Problem.

- Verträgt das IR-Protokoll Unterbrechnungen? Hat es Redundanz? 
Vielleicht ist es ja gar kein Problem, wenn ab und zu ein paar Zyklen 
ausfallen?

- Ansonsten könntest Du Deine LEDs in mehrere Strings aufteilen, so dass 
die einzelnen, kurzeren, Strings schneller programmiert werden können.

- Natürlich könnte man auch Versuchen, beide Codes zu "verheiraten" und 
zu parallelisieren. Das solltest Du aber nur machen, wenn Du Spass an 
taktzyklengenauer Assemblerprogrammiernug hast.

Die Idee mit dem zweiten Mikrokontroller sieht zwar auf den ersten Blick 
unelegant aus, wird aber von der Entwicklungszeit her das einfachste 
sein. Ein Attiny10 oder 85 kostet ja eh nicht viel...

von Vzycl (Gast)


Lesenswert?

> - Verträgt das IR-Protokoll Unterbrechnungen? Hat es Redundanz?
> Vielleicht ist es ja gar kein Problem, wenn ab und zu ein paar Zyklen
> ausfallen?
Also Redundanz ist nicht vorhanden.
Unterbrechung vom IR währen ärgerlich.
Gut IR ist auch nur zu einem bruchteil der Laufzeit nötig. Halt immer 
dann wenn ich per Fernbedienung etwas ändern will. Ansonsten soll das 
Programm für die Farbsteuerung ablaufen. (Farbwechsler bzw. fester Wert)
Nur ist es dann grad am blödesten wenn was verloren geht und man sich 
wundert was das ding nun schon wieder hat.

> - Ansonsten könntest Du Deine LEDs in mehrere Strings aufteilen, so dass
> die einzelnen, kurzeren, Strings schneller programmiert werden können.
Hm auf 3x3 und dann pro Interrupt 1/3 erledigen. Da muß ich mal drüber 
nachdenken, nachrechnen ob das hinhauen könnte.

> - Natürlich könnte man auch Versuchen, beide Codes zu "verheiraten" und
> zu parallelisieren. Das solltest Du aber nur machen, wenn Du Spass an
> taktzyklengenauer Assemblerprogrammiernug hast.
Ähm, nein.
Assembler kann ich nicht.

von Vzycl (Gast)


Lesenswert?

Hab mal ein wenig rumgerechnet.


Tiny85 @ 8MHz

IR Interrupt min. 10.000/sec
  = 800 Takte

WS2811 Steuerung

Bit7-1 je 10 Takte
Bit0 14 Takte

 = 84

 x3 = 252 Takte pro Ws2811 Chip

  x3 = 756 Takte Dreierkette


  800
 -756
 ----
   44 Takte für IRMP

Dazu kommt noch Auswahlanweisung welche Kette drann ist.
Wird wohl nix


----------------------------------------------------------------------


Tiny85 @ 16MHz PLL

IR Interrupt min. 10.000/sec
  = 1600 Takte

WS2811 Steuerung

Bit7-1 je 20 Takte
Bit0 21 Takte

 = 161

 x3 = 483 Takte pro Chip

  x3 = 1449 Takte pro Dreierkette


  1600
 -1449
 -----
   151 Takte für IRMP

Plus Auswahlanweisung welche Kette drann ist.


----------------------------------------------------------------------


Und dann ist noch nichtmal das Farbprogramm mit dabei.
Läuft zwar nicht im Interrupt aber brauch ja auch etwas Zeit.


Ich glaub ich verrenn mich da grad ein bischen.

von Thomas T. (knibbel)


Lesenswert?

Ich habe auch mal etwas gerechnet, da ich es sehr interessant fände, das 
Projekt mit nur einem Controller zu realisieren:

Ich rechne mit einem 16MHz-Takt (62.5ns Zykluszeit), da ich hierfür 
schon eine geeignete WS2811-Ansteuerung hätte...

Irq-Frequenz: 15000 Irqs/Sekunde => alle 66,67us ein Irq => rund 1000 
Befehle pro Irq abarbeitbar.

Die Ansteuerung der WS-Chips sollte in einem Rutsch geschehen. 24 Bits 
pro WS-Chip, 9 Chips => 216 Bits mit jeweils 1,25us Bitzeit => 270us 
Übertragungszeit für alle WS-Daten.

Daraus folgt: Eine vollständige Übertragung alles WS-Daten bringt den 
Interrupt aus dem Takt. Es gehen Irqs verloren.

Möglichkeit 1: Man überträgt pro Irq nur ein WS-Datum (24 Bits). Im 
nächsten Irq dann das nächste WS-Datum und so weiter. Könnte klappen, 
man muss nur aufpassen, das die Pausen zwischen den Übertragungen nicht 
zu lang wird, da sonst der WS-Chip eine 50us-Pause erkennt und einen 
Reset macht. Das ließe sich durch erhöhen der Irq-Frequenz realisieren 
(auf z.B. 30000 Irqs pro Sekunde). Wenn alle WS-Daten übertragen sind, 
übertragt man ein paar Irqs lang nichts und hat automatisch seine 
50us-Pause für einen Reset.

Möglichkeit 2: (Wurde schon erwähnt) Auslagerung des IRMP auf einen 
extra Controller. Beide Controller würde ich dann seriell verbinden und 
die Fernbedienungscodes dann seriell weiterreichen. Dieses läßt sich 
wohl am schnellsten realisieren.

Möglichkeit 3: Man schreibt sich eine eigene Erkennung für die 
Fernbedienung. Die Interruptroutine wird auf sagen wir 1000 Irqs pro 
Sekunde gesetzt. In jedem Irq werden alle WS-Chips bedient und andere 
Irqs blockiert. Zusätzlich wird der IR-Empänger so angeschlossen, dass 
er einen Irq auslösen kann (Pin-Change-Interrupt). Sobald jetzt ein Irq 
vom IR-Empänger auftritt werden die WS-Chips nicht mehr versorgt und es 
erfolgt nachdem die WS-Übertragung beendet ist, eine Prüfung auf das 
Startbit (Pulsbreite) der IR-Übertragung (mit zeitlicher Latenz von bis 
zu ca. 270us). Wenn kein Startbit erkannt wird, werden die WS-Chips 
wieder mit Daten versorgt. Wird ein Startbit erkannt (9ms-Puls, 
4,5ms-Pause), erfolgt eine genaue Untersuchung und Auswertung der 
folgenden IR-Pulse, ohne das die WS-Chips mit Daten versorgt werden und 
den IR-Empfang und Auswertung des Signals stören.

Gruß,
Thomas

von Vzycl (Gast)


Lesenswert?

Werde für mein Vorhaben 2 Tinys nutzen.
Habe den ersten auch schon halb fertig.
Irmp läuft darauf und Fernbedienung wird erkannt, denke ich, jedenfalls 
blinkt Kontroll Led im Tackt der Fernbedienung :)

Fehlt noch die Datenübertragung zum zweiten Tiny.
Leider haben die ja kein Hardware I2C sondern nur USI.(Serielle 
Schnittstelle ohne Protokoll)
Muss da noch mehr nachlesen ob man die einfach so zusammenschalten kann.

Einwas gutes hat diese Lösung mit 2 Chips allerdings.
Ich könnte noch eine weitere Ansteuerung später mit hinzufügen.
Funk z.B.
Allerdings sollte dann wohl I2C zwischen den Chips verwendet werden.

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.