7-Segmentanzeige mit Farbsteuerung
Hallo ... von einem niederländischen Anbieter gibt es ein System namens rgbdigit. Hier handelt es sich um
einstelllige, jedoch kaskadierbare Siebensegmentanzeigen, deren einzelne Segmente mittel RGB-Led-Chips
individuell beleuchtet werden. Gibt es dazu schon praktische Erfahrungen, insbesonders, wie das Busprotokoll aufgebaut ist? Für Infos und nachfolgenden Erfahrungsaustausch wahre ich sehr dankbar.
Micha
Liste der Anhänge anzeigen (Anzahl: 1)
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
Anhang 33462
Ü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
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.
}
Mein LedArray sieht so aus:
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];
aufgerufen wird dann so:
Code:
// 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);
ab 7,5us Low Phase flippen die LEDs bei mir aus
- - - 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.