INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
10x10x10 LED Würfel
23.05.2016, 20:27
Beitrag #9
RE: 10x10x10 LED Würfel
(23.05.2016 19:56)dinamo schrieb:  Hallo, kann mir wirklich keiner weiterhelfen??
Ist wirklich wichtig.
DANKE

ähm also mit nem Platinenlayout fangen wir nix an... da ist ein Schaltbild gefragt.
Und du schreibst mal von ULN und einmal von UDN Treibern....gibt es da wirklich beide ???
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.05.2016, 07:45 (Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2016 07:45 von amithlon.)
Beitrag #10
RE: 10x10x10 LED Würfel
Hallo,

(23.05.2016 20:27)Bitklopfer schrieb:  ähm also mit nem Platinenlayout fangen wir nix an... da ist ein Schaltbild gefragt.
Und du schreibst mal von ULN und einmal von UDN Treibern....gibt es da wirklich beide ???
lgbk

Schaltplan war irgendwo dabei.

(23.05.2016 19:56)dinamo schrieb:  Hallo, kann mir wirklich keiner weiterhelfen??
Ist wirklich wichtig.
DANKE

Vielelicht solltest Du Multiplex-Ansteuerung erstmal mit 4x LEDs o.ä. üben, bevor Du 10x 100 multiplexen willst?
100 LEDs einer Ebene mit einem gemeinsamen 150 Ohm Vorwiederstand ist mehr als fragwürdig geplant.

Ansonsten eben normales Multiplex.
Timerinterrupt, der alle paar ms eine Ebene rausschiebt.
aktuelle Ebene ausschalten, Bitmuster der nächsten Ebene rausschieben, nächste Ebene einschalten.

Das immer im Kreis über alle Ebenen. Wie das mit Timing und Helligkeit bei gegebenem LED-Strom passt, mußt Du wohl selber ausrechnen/probieren.
Im HAuptprgramm kannst Du dann die gewünschten Bitmuster, die angezeigt werden sollen, in die Arrays schreiben.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.05.2016, 17:03
Beitrag #11
RE: 10x10x10 LED Würfel
Hat der Arduino überhaupt genügend CPU-Leistung, um 1000 LEDs zu verwalten ?
Mein Nano läuft schon mit einer 2D Matrix mit 16x8 LEDs am Anschlag.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2016, 07:36
Beitrag #12
RE: 10x10x10 LED Würfel
Hallo,

(24.05.2016 17:03)Mathias schrieb:  Hat der Arduino überhaupt genügend CPU-Leistung, um 1000 LEDs zu verwalten ?
Mein Nano läuft schon mit einer 2D Matrix mit 16x8 LEDs am Anschlag.

ich sage es mal so: eine 7x50 Laufschrift mit 74xx164 direkt als Spaltentreiber mißbraucht mit jeweils eigenem Vorwiderstand an jeder Spalte und 7x MosFet als Zeilentreiber läuft hier mit einem ATMega8 mit 7,xxx MHz als Laufschrift.

Ist kommerziell (Pearl PE9441). Das Ding ist mir mal zugeflogen, ich wollte die Software eigenlich mal neu schreiben, weil die Textprogrammierung per serieller Schnittstelle nicht gerade dafür gedacht ist, ständig die TExte zu ändern.

Ist aber noch nicht passiert, hat nur einen ESP8266-ß1 als MQTT-Client bekommen...

Ich wollte damit nur sagen: 350 LEDs gehen mit den knapp 8MHz, ich halte auch 1000 bei 160MHz für machbar. Statt jeweils 50 Bit sind 100 rauszuschieben und statt 7 Zeilen sind es 10. Allerdings mit den Arduino-Kallsen und z.B. dem Overhead von digitalWrite() usw. wird es nicht gehen.
Zumindest die Multiplex-Interruptroutine muß kurz und schnell sein, Schieben an die 164er per SPI usw.

Wenn der Multiplex läuft, weiß man, wieviel CPU-Zeit der frißt. Der Rest für die main() muß reichen, die Bilder in die Arrays zu bekommen.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2016, 16:49 (Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2016 16:49 von Mathias.)
Beitrag #13
RE: 10x10x10 LED Würfel
Zitat:Ist kommerziell (Pearl PE9441). Das Ding ist mir mal zugeflogen,
...
Ich wollte damit nur sagen: 350 LEDs gehen mit den knapp 8MHz,
Könnte es sein, das dort mehrere MAX 7219 verbaut sind ?
Somit hätte der Arduino natürlich genug Reserve, da der IC das Multiplexen übernimmt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2016, 20:01 (Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2016 20:13 von amithlon.)
Beitrag #14
RE: 10x10x10 LED Würfel
Hallo,

(25.05.2016 16:49)Mathias schrieb:  
Zitat:Ist kommerziell (Pearl PE9441). Das Ding ist mir mal zugeflogen,
...
Ich wollte damit nur sagen: 350 LEDs gehen mit den knapp 8MHz,
Könnte es sein, das dort mehrere MAX 7219 verbaut sind ?
Somit hätte der Arduino natürlich genug Reserve, da der IC das Multiplexen übernimmt.

nein, es sind 7x 74xx164 (genaue Version müßte ich meinen Schmierzettel suchen, wo ich die Schaltung skizziert hatte) verbaut, gesteuert per SPI.
Quarz ist ein 7,xx MHz Baudratenquarz wegen der seriellen Schnittstelle.
Die Zeilentreiber sind 4x Dual LogicLevel-MosFETs. Von den 8 sind 7 genutzt.
Serieller PEgelwandler ist mit einem Transistor, es kann nur empfangen werden.
4 Pins des AVR sind noch für eine Tastenprogrammierung vorgesehen, die "Programmierschachtel" war aber nicht mehr aufzufinden, als ich das Teil geerbt habe.

Ich wollte den verbauten Mega8 eigentlich mal neu programmieren, weil mich für meine Anwendung z.B. stört, daß beim neu schicken eines Anzeigetextes über die serielle der Multiplex gestoppt wird und ein paar kurz LEDs an bleiben, außerdem fehlt im neuen Text im ersten Durchlauf eine oder mehrere Spalten, die bleiben aus.

Stört in der Originalanwendung als Werdelaufschrift nicht, der schickt man ja nicht dauern einen neuen Text.
Als Anzeiger für MQTT-Nachrichten stört es mich aber eigentlich...

SPI kann mit maximal Clk/2 laufen also mit rund 3,5MHz. Bei 7x Shift also rund 625kHz. Bei 7 Zeilen also noch rund 89kHz Refreshrate ohne Daten aus dem Speicher zu holen. Mit Overhead der ISR usw. sollten also noch gute 2-3kHz Refreshrate machbar sein,dann aber mit 100% CPU-Zeit.
Bei real vielleicht 200Hz Refresh sollte sich der Mega8 sich also noch ziemlich langweilen.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2016, 21:32
Beitrag #15
RE: 10x10x10 LED Würfel
Vielleicht mache ich einen Überlegunsfehler.
Meine 8x16 Matrix habe ich mit 3x 74HC595 mit Multiplex aufgebaut.

Ich kann mit der Wiederholfrequenz, genau ein bisschen höher gehen, als ich ein flimmern feststellen kann.
Gehe aber ein bisschen zu hoch, dann blockiert es mir das ganze Programm.

Code:
void ShiftRegister::update() {
    digitalWrite(latchPin, LOW);
    for (int i = shiftCount - 1; i >= 0; i--) {

        digitalWrite(dataPin, reg[i]);

        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);
    }
    digitalWrite(latchPin, HIGH);
}
Da ich drei 74HC595 verwende, ist shiftCount 24.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.05.2016, 08:26 (Dieser Beitrag wurde zuletzt bearbeitet: 27.05.2016 08:27 von amithlon.)
Beitrag #16
RE: 10x10x10 LED Würfel
Hallo,

(25.05.2016 21:32)Mathias schrieb:  Vielleicht mache ich einen Überlegunsfehler.
Meine 8x16 Matrix habe ich mit 3x 74HC595 mit Multiplex aufgebaut.

Ich kann mit der Wiederholfrequenz, genau ein bisschen höher gehen, als ich ein flimmern feststellen kann.
Gehe aber ein bisschen zu hoch, dann blockiert es mir das ganze Programm.

Code:
void ShiftRegister::update() {
    digitalWrite(latchPin, LOW);
    for (int i = shiftCount - 1; i >= 0; i--) {

        digitalWrite(dataPin, reg[i]);

        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);
    }
    digitalWrite(latchPin, HIGH);
}
Da ich drei 74HC595 verwende, ist shiftCount 24.

digitalWrite() ist eine Funktion, die im Verhätlnis zum direkten Zugriff auf das AVR-Register "ewig" braucht. Das liegt daran, daß jedesmal intern erst die Zuordnung der Arduino Pinnummer zu Port und Bit erfolgt.
Das ist praktisch, weil es so auf jede, Arduino passt, egal, welche CPU drauf wohnt und an welchen Port der Pin mit Nummer "x" eigentlich ist und wie die Portregister angesprochen werden müssen.
Wenn Du raussuchst, welcher Port und Pin am AVR Deine Clock- und Datenleitung sind, kannst auch direkt (aus der Arduino-IDE drauf zugreifen.

Code:
#define  clockPin     PB3            // Port und Pin des ATMega
#define  dataPin      PB1            // Port und Pin des ATMega
#define  latchPin      PB2            // Port und Pin des ATMega

#define  shiftPort    DDRB          
// wenn die Letungen an verschiedenen Ports sind eben noch
#define  dataPort    DDRx
// usw.

// Deine loop
void ShiftRegister::update() {
    shiftPort &= ~(1<<latchPin)   // setzt auf L
//    digitalWrite(latchPin, LOW);

   for (int i = shiftCount - 1; i >= 0; i--) {

        if ( reg[i] == 0)
        {
          shiftPort &= ~(1<<dataPin)   // setzt auf L
//          digitalWrite(dataPin, reg[i]);
        }
        else
        {
          shiftPort |= (1<<dataPin);    // setzt auf H
        }
        
    shiftPort |= (1<<clockPin);    // setzt auf H
//        digitalWrite(clockPin, HIGH);

       shiftPort &= ~(1<<clockPin)   // setzt auf L
//       digitalWrite(clockPin, LOW);
    }
    shiftPort |= (1<<latchPin);       // setzt auf H
//    digitalWrite(latchPin, HIGH);

Das Bit-Gefummel optimiert der Compiler normalerweise sehr gut, da bleibt dann z.B. von shiftPort |= (1<<clockPin); // setzt auf H
nur ein SBI Port,Pin übrig und das kosten einen CPU-Zyklus.

Ist nur so als Anregung gedacht, dürfte so 5-10x schneller sein.

Alternative ist shiftOut(), wird intern auch wesentlich besser optimiert.
wäre dann nur
Code:
void ShiftRegister::update() {
   digitalWrite(latchPin, LOW);

   shiftOut(dataPin, clockPin, order, reg[0]);
   shiftOut(dataPin, clockPin, order, reg[1]);
   shiftOut(dataPin, clockPin, order, reg[²]byte);

   digitalWrite(latchPin, HIGH);
}

order ist die Reihenfolge, ob erst das höchtswertige Bit geschoeben wird oder das niederwertigste (MSBFIRST,LSBFIRST).
byte muß eben jeweils 8 Bit für ein Register enthalten.
Da mußt Du Deinen Datenaufbau von reg[] anpassen.

Array mit 3 Byte, in jedem Byte die Daten für ein Schiebergister.

Ich hoffe, ich habe hier beim Morgenkaffee nicht zuviele Tippfehler eingebaut.

Arduino ist praktisch wegen günstiger Hardware und der IDE, die Abstraktionen haben aber auch Nachteile, bei solchen Sachen speziell in der Geschwindigkeit.

Ich nutze das gern, weil es Zeit, Aufwand und Kosten spart, komme aber eigentlich aus der Assembler Ecke...

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Code für Würfel korrekt? JanGamer11 12 804 12.01.2016 19:41
Letzter Beitrag: Claus_M

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste