Lies erstmal das hier: Neopixel Timing. Und der Code ist aus einem Projekt von mir kopiert, er funktioniert.
Statt 1-1-0-0 und einem 0 am Ende hätte ich auch 1-NOP-0-NOP- NOP schreiben können. Dauert genausolange. Ich fand aber so ist es übersichtlicher. Mit dem Timing, der Anzahl der Takte habe ich mit dem LA und dem Neopixel rumgespielt. Mit drei Takten High für eine Null gehts auch noch, mit nur einem nicht. Hab mich als Kompromiss für 2 entschieden. Die Low-Zeit ist nach Datenblatt zu lang (Shift und Loop), wie im Link beschrieben passt das aber. Und natürlich bleibt ein Portbit so stehen, wie es war.
Der Code in meinem Link macht das ähnlich. Der benutzt ein Macro fürs Timing, der am Ende auch nichts anderes macht, als NOPs einzufügen. Und der Code sieht auch nicht viel anders aus, wenn man I2C, SPI oder UART mit Bitbanging macht. Alles was schneller als 20-30µs ist, ist für einen Interrupt auf den 8-Bittern zu schnell. Und selbstverständlich kann das so sauber laufen. Code ist deterministisch.Wie machen das denn die Libraries? Wenn die alle mit solchem Bitgeschubse arbeiten, kann das eigentlich mit einem µC nicht wirklich sauber laufen, oder?
MfG Klebwax
Lesezeichen