FastLED.show(); (WS2801) unterbricht Interrupts für IR-Empfänger

Hallo,

Ich habe einen LED-Streifen mit WS2801 Controllern und 5V, Gnd, Data- und Clocklines, an welche ich mit FastLED und der Methode FastLED.show(); die Anweisungen übertrage.
Dazu sollen gleichzeitig die Werte der Fernbedienung eingelesen werden, um später ausgewertet werden zu können. Allerdings scheint FastLED.show(); die Interrupts zu unterbrechen, weshalb keine IR-Werte eingelesen werden können. Ohne FastLED.show(); funktioniert das einwandfrei.
Gibt es eine Möglichkeit, das Problem zu beheben ohne extra einen zweiten Mikrokontroller dazuschließen zu müssen?

Beispielcode

 while(true){
   for(int Led = 21; Led != -1; Led--) {    
      drillStrip[Led] = CRGB::Blue;
      drillStrip[Led - 1] = CRGB::DarkBlue;
      FastLED.show();
      delay(30);
      }   
    if (irrecv.decode(&results)) { 
      irrecv.resume();
      if ( results.value == 16734885)
        return; 
    }            
  }

Istalger

Wo ist der Sketch?

sschultewolter:
Wo ist der Sketch?

Habe ich jetzt noch hinzugefügt.

Das Problem wird hier wohl eher die Programmierung sein. Mir ist jetzt nicht bewusst, ob die FastLed Lib Interrupts im SPI Modus (WS2801) sperrt. Es würde aber schon Sinn machen, die Programmierung der While und For schleife anzupassen. So kannst du nur alle ~600ms auf iR zugreifen

hi,

ich hab' dasselbe vor jahren probiert und hatte die selben probleme. weil ich es dann anders gelöst habe (keine fernbedienung, sondern webseite), hab' ich mich nicht weiter damit beschäftigt.

später hab' ich dann gelesen, daß es lösungen dafür gibt. soweit ich mich erinnere, war es ein post von helmuth (ist hier derjenige, der sich am meisten mit den LED-streifen beschäftigt). vielleicht meldet er sich noch, wenn nicht, mach ihn doch morgen mit einer PN aufmerksam.

gruß stefan

Hi,

Probleme mit Interrupts gibt es nur in der Kombination AVR + clockless Ledcontroller (Neopixels, WS2812, TM1809).

Mit den extern getakteten WS2801 funktioniert IR + FastLED problemlos. Interrups werden auf AVRs nur bei o.g. Chips gesperrt während LED Daten geschrieben werden.

Zur gesamten Problematik bei Interesse bitte mal hier lesen.

Das Problem ist in diesem Fall also der Code, nicht FastLED. Willkommen im Forum und noch ein Hinweis:
Bitte immer den vollständigen Sketch posten, das Problem liegt i.d.R. dort, wo Du es nicht vermutest.

Grüße,

Helmuth

hi,

ich dachte, ich hätte irgendwann von Dir gelesen, das problem mit 2812 und IR wäre lösbar...

sonst bleibt halt nur der wechsel auf APA oder ähnliches.

gruß stefan

Nee, Daniel hat da ziemlich viel Zeit investiert war zwischendurch auch sehr optimistisch, aber er hat es nicht hinbekommen.

Hier der Link zu seinem Bericht von damals.

Kurzversion: Wenn es jemand schaffen würde, einen Interrupt Handler zu schreiben, dem 90 Clock Cycles reichen, würde es gehen.

Lösung bzw. Workaround: Je nachdem, was billiger ist - entweder einen Teensy nehmen, oder APA102. :wink:

Grüße,

Helmuth

hi,

oder einen kleinen arduino dranschrauben, der dann einzelne bytes rüberschickt. das problem ist ja offensichtlich nicht, daß er nicht bytes empfangen kann, sondern nur nicht "aufpasst", wenn zu irgeneiner zeit grad IR-signale kommen.

für serial hab' ich das byte puffer, für IR nicht.

gruß stefan

Yep. Nochmal zurück zur Ausgangsfrage von @Istalger.

Deine WS2801 + FastLED + IR geht auf einem Arduino Uno.

Gruß,

Helmuth