- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 54

Thema: 7-Segmentanzeige mit Farbsteuerung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Okay, das ist neu, funktioniert das auch egal wo du die pausen machst? also z.B. mitten im Byte oder nur an bestimmter Stelle? Die DOku scheint mit +/-150nS sehr strikt zu sein was das angeht

    Dann könnte man auch relativ gemütlich mit SPI arbeiten, pro millisekunde ein byte a 2 bits codiert ... dann frage ich mich warum bei mir mit der SPI lösung nach 10 LEDs nurnoch mist rausgekommen war
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    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

    Klicke auf die Grafik für eine größere Ansicht

Name:	WS2812_7us_Pause.png
Hits:	5
Größe:	30,2 KB
ID:	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.
    Geändert von Siro (16.05.2018 um 19:32 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Nach dem Studium des PDF-Datasheetes der RGBDIGITs hats jetzt bei mir
    etwas Klick gemacht. Andere sind warscheinlich schon weiter und könnten
    mich korrigieren. Also, offensichtlich läuft der Spass folgendermassen ab:
    - Es werden 24-bit Datenpakete mit 800kbit/s benötigt
    - Jede Bitinfo beginnt mit H und endet mit L
    - L- und H-Bits werden durch das unterschiedliche H/L Verhältnis bestimmt
    - Ub und Takteingang haben 5V, also TTL-Pegel
    Diese Informationen dürften reichen, um einige RGBDIGITs zu bestellen und
    den Rest, falls nicht schon jemand mehr weiss, empirisch rauszukriegen,
    ohne die Bauteile zu schädigen. Mt einem teilautomatisierten BASCOM-
    Programm und einen ATiny mit 16-Bit-Timer, sollten dann folgende
    restlichen Fragen zu klären sein:
    - genaue Zuordnung der Bits zur Funktion
    - wieviel 24-Bit-Datenpakete pro Anzeigedigit
    - muss permanent mit Daten refresht werden oder nicht
    - könnte man Daten aus dem letzten PinOut sinnvoll nutzen
    Es wird daraufhin die Entshidung fallen, ob die komplette
    Anzeige über den Hauptchip des eigentlichen Systems oder
    über einen eigenen ATiny bedient wird.
    VG Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Um Siro hier nochmal zu zitieren, es ist nur wichtig dass die Zeit der H-Phase stimmt, die L-Phase kann deutlich länger ausfallen als im Datenblatt beschrieben! Du musst dir also nciht unbedingt einen abbrechen die Bits auch bei 800kHz raus zu senden, solange du nur die einzelnen H-Flanken richtig machst.

    Zu deinen Fragen:

    - eine 7-Segment Anzeige hat wie der Name es verrät 7 Segmente (eventuell noch ein 8tes für einen Punkt wenn denn einer verbaut ist)
    - die Segmente werden über eine Standardisierte Reihenfolge angesprochen mit der Segmentbezeichnung a,b,c,d,e,f,g (evtl. h für den Punkt), wie die verteilt sind verrät die Wikipedia oder ein beliebiges Elektronik Buch
    - ein refresh ist nicht nötig, solange du die Pulsleitung low hälst, das Datenblatt sagt eine Pause von mind. 50µS bevor die LEDs sich automatisch mit den eingepulsten Daten updaten!

    -von welchem letzten PinOut sprechen wir hier?

    Nimm dir einfach folgende Daten als Hilfestellung:

    1/800kHz = 1.25µS * 24Bits/LED = 30µS/LED * 7( Segmente/7SegModul = 210(240)µS/7SegModul

    Wie ich schonmal geshrieben habe, musst du also nurnoch einen Kompromiss finden, wie oft du das Display aktualisieren können willst, die Zeit zum senden der Daten in Abhängigkeit der anzahl verwendeter Module von der Zeit zwischen 2 aktualsierungen abziehen und bewerten ob die verbleibende Zeit für deine restlichen Programmaufgaben ausreicht
    Geändert von Ceos (17.05.2018 um 10:41 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Habe eben auch noch mal ins Datasheet geschaut. Pro Digit werden 24 Bit gesendet, danach mindesten 50 microsec Low.
    Bei mehreren 24 Bit-Pakten wertet das höchste Digit das erste Paket aus und blendet dies dann bei der Weitersendung aus.
    Für das nächste Digit ist das ursprünglich 2te dann das erste usw .
    Warscheinlich wird bei 8 Stellen und 8 Datenpaketen dann beim letzten PINout nix mehr rauskommen, weil sie dann
    alle benutzt und ausgeblendet wurden.
    Auf Grund des Timings und der möglichen Toleranzen, sollte eine Taktfrequenz von 10MHz für den Ansteuerchip
    problemlos ausreichend. Bi optimistisch, langsam lösst sich der Knoten
    VG Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    danach mindesten 50 microsec Low
    Vorsicht, nicht dass du das falsch verstehst:

    wenn du bits sendest, schnabuliert jede einzelne LED nacheinander 24bits und sendet die nachfolgenden bits einfach weiter ohne hinzusehen (daisy chain ... von daisy duck der schnattertante)

    wenn die erste LED in der reihe aber für mindestens 50µS ein low sieht, latcht sie die 24bits in das PWM register und stellt die Farbe dar udn warte auf frische 24bits ... wenn du also scho nachd er ersten LED eine 50µS pause machst, aktualisierst du immer nur die erste LED und die weiteren LEDs sehen niemals je ein bit.

    Hoffe das sit so ausführlich genug erklärt

    bei 10Mhz hättest du 12.5 Rechentakte pro ganzem Puls Zeit, da musst du aber schon ordentlich optimieren, geh mal lieber auf 16Mhz für 20 Takte
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Nach deinem letzten Datenbit bleibt einfach die Datenleitung auf Low. Wie lange spielt dabei keine Rolle.
    Kannst sie also auch dauerhaft auf Low lassen, wenn sich nichts in der Anzeige ändern soll.
    Die Information bleibt in den Chips erhalten. Du must also erst wieder eine "komplett" neue Kette reinschieben
    wenn sich etwas in der Anzeige ändern soll.
    Alle LEDs schieben zunächst ihren Daten wieder raus zur nächsten LED und ändern noch NICHT den zuletzt angezeigten Wert bis die etwas längere Pause kommt.
    Erst dann werden ALLE Daten übernommen und angezeigt.
    Man schiebt also zuerst die Daten für die letzte LED rein, dann für die vorletzte usw.
    Die Daten für die erste LED werden demnach als letztes reingeschoben. Dann folgt die lange Pause die mindestens 50us sein soll
    aber auch ewig lang sein darf.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Man schiebt also zuerst die Daten für die letzte LED rein, dann für die vorletzte usw.
    das ist falsch! ... zumindest wenn es "normale" WS2812 sind, kann sein dass in dem modul die segmente anders herum verdrahtet sind, das habe ich jetzt nicht nachgeprüft, aber bei normalen WS2812 werden pro LED 24bits veschluckt und dann jedes weitere bit einfach weitergleitet, bis zum übernahmesignal (mind. 50µS low) und danach wartet die LED wieder auf 24 frische bits und jedes weitere wird dann wieder weiter getratscht
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. 7 Segmentanzeige multiplexen
    Von Maverick83 im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 01.06.2011, 14:19
  2. Picaxe <-> 7-Segmentanzeige
    Von D!PSW!TCH im Forum PIC Controller
    Antworten: 16
    Letzter Beitrag: 04.11.2007, 15:58
  3. Farbsteuerung im HSV modell
    Von Jörn Arne im Forum Assembler-Programmierung
    Antworten: 5
    Letzter Beitrag: 05.10.2007, 23:40
  4. 7 Segmentanzeige
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 17.08.2007, 21:26
  5. Anschlussbelegung 7 Segmentanzeige
    Von Elektronikus im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 19.12.2004, 19:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen