Gast
#3326758
Hmm, irgendwie hab ich grad ne Hirnblockade. Ich hab jede Menge Funktionen, die ein unterschiedliches Gefunkel auf einem Ledstripe auslösen. Diese Funktionen sitzen in der Endlosschleife in main. Während des Ablaufs dieser Funktionen ist die CPU (ATmega328p) ziemlich belegt, da es sich um einen digital angesteuerten Stripe (WS2812b) handelt, welches seine Kommandos mit 800kHz erwartet und dann eben dauernd welchselnde Farben an jede LED hingefeuert bekommt. Nun muss aber Zeit für eine Erkennung von Befehlen bleiben. Die CPU ist aber so busy, dass die Befehle, die über UART reinkommen, mehrere 10sek benötigen, um erkannt zu werden. Der UART liest schon ein, das ist interruptgesteuert, aber die Auswertung in main geht halt sehr langsam. Das einzige, was mir dazu einfällt, ist: Die Befehlsauswertung in einem Timerinterupt zu machen, ggfs. eine globale Stop-Variable zu setzen und diese dann in allen Funktionen abzuchecken. Das müsste gehen, aber Auswertung in einem Interrupt ist auch nicht so dolle. Obige Funktionen haben alle irgendwo auch ein delay, damit man den Farbverlauf zeitlich steuert. Die Frage ist, kann man die irgendwie umbauen, so dass die Funktionen 'Zeitscheiben' an main abgeben? Oder wie bekommt man das hin in einem AVR ohne BS? Ideen willkommen. Grüsse PS: Hier mal eine dieser Funktionen (nicht von mir): void LEDStrip::_Show() { //spi_write_lpd8806(fBuffer, fBufferSize); // AR WS_out(fBuffer, fBufferSize, 0);<---- das ist der Zeitfresser } void LEDStrip::ColorChase(rgb_t background, rgb_t color, uint16_t delayTime, uint16_t repeatCount) { _Fill(background); while (repeatCount--) { for (uint16_t i = 0; i <= End(); i++) { _Set(i == 0 ? End() : i - 1, background); _Set(i, color); _Show(); delay(delayTime); } } }