Bei mir ergibt sich das Timing bedingt durch die Software,
dass ich zwischen den Bytes 7 us Low habe und
zwischen den einzelnen Bits habe ich zur Zeit 3,8us Low.
Ich habe 57 Leds dran
Übrigens sieht man hier den "Fehler" in der RIGOL-Software vom MSO1104Z. Die automatische Min Max Funktionion für die Pulsbreite funktioniert nicht richtig.
Das wurde mir sogar bestätigt,......Die Cursorpositionen stimmen aber BX-AX = 7us
Mein LedArray sieht so aus:Code:void LedShiftOut(U8* leds, U8 count) { U8 one_byte; U8 bit_count; // damit keine Multiplikation verwendet wird: count=(count+count+count); // 3 Bytes pro Led RGB DISABLE; // alle Interrupts sperren while (count) { CLRWDT(); // den Watchdog bedienen, fass erforderlich one_byte = *leds++; // aktuelles Datenbyte laden // 8 Bits durchlaufen: for (bit_count = 0; bit_count < 8; bit_count++) { if (one_byte & 0x80) // wenn das oberste Bit 7 gesetzt ist dann { LATA5 = 1; // lange High Phase einleiten NOP(); NOP(); NOP(); LATA5 = 0; // High Phase beenden NOP(); // testweise länger auf low NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); } else // Kurze High Phase weil das Datenbit Low ist { LATA5 = 1; // kurze High Phase einleiten NOP(); LATA5 = 0; // High Phase beenden NOP(); // testweise länger auf low NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); } one_byte <<= 1; // Das Datenbyte 1 mal links verschieben } count--; // Anzahl auszugebener Datenbytes -1 } ENABLE; // Interrupt wieder einschaalten __delay_us(50); // Das Ende der Datenübertragung erreicht wenn die Leitung länger als 50us Low bleibt. }
aufgerufen wird dann so:Code:// so viele LEDs sollen angesteuert werden: #define LED_COUNT 57 /* Jede LED hat 3 Bytes insgesamt also 24 Bits */ typedef struct // __pack weil wir keinen Speicher verschwenden wollen { U8 green; /* 8 Bit fuer die Helligkeit */ U8 red; /* 8 Bit fuer die Helligkeit */ U8 blue; /* 8 Bit fuer die Helligkeit */ } TLed; /* Type Bezeichner ist TLed */ TLed LedArray[LED_COUNT];
ab 7,5us Low Phase flippen die LEDs bei mir ausCode:// Beispiel wie die Farben gesetzt werden, hier für LED Nr 4 (Zählung geht von 0..) LedArray[3].green = 0x00; // grün aus LedArray[3].red = 0x7F; // halbe Helligkeit für rot LedArray[3.blue = 0x10; // bissle Blau dazu LedShiftOut(&LedArray,LED_COUNT);
- - - Aktualisiert - - -
@Ceos:
ich hatte das auch schon, dass nach einigen LEDs nur noch Blödsinn rauskam.
Bei mir war tatsächlich eine LED defekt. Die habe ich ausgetauscht und dann lief es richitg.
Hatte auch erst gedacht das es an der Software bzw. Timing liegt.







Zitieren

Lesezeichen