TLC5940 Mux Library & 74HC595 (Final Status)

Dies ist ein kleines Beispielprogramm:

#define  NUM_TLCS  3
#define  NUM_ROWS  8
#define  NUM_COLUMNS 8
#include "Tlc5940Mux.h"

volatile uint8_t isShifting;
uint8_t shiftRow;

byte red[8 * 8] = {255, 255, 255, 255, 255, 255, 255, 255,
                     0,   0,   0,   0,   0,   0,   0,   0,
                     0,   0,   0,   0,   0,   0,   0,   0,
                   255, 255, 255, 255, 255, 255, 255, 255,
                   255, 255, 255, 255, 255, 255, 255, 255,
                     0,   0,   0,   0,   0,   0,   0,   0,
                     0,   0,   0,   0,   0,   0,   0,   0,                                                                                                         
                   255, 255, 255, 255, 255, 255, 255, 255};
                  
byte green[8 * 8] = {  0,   0,   0,   0,   0,   0,   0,   0,
                     255, 255, 255, 255, 255, 255, 255, 255,
                       0,   0,   0,   0,   0,   0,   0,   0,
                       0,   0, 255, 255, 255, 255,   0,   0,
                       0,   0, 255, 255, 255, 255,   0,   0,
                       0,   0,   0,   0,   0,   0,   0,   0,
                     255, 255, 255, 255, 255, 255, 255, 255,
                       0,   0,   0,   0,   0,   0,   0,   0};
                       
byte blue[8 * 8] = {  0,   0,   0,   0,   0,   0,   0,   0,
                      0,   0,   0,   0,   0,   0,   0,   0,
                    255, 255, 255, 255, 255, 255, 255, 255,
                    255, 255,   0, 255,   0, 255, 255, 255,
                    255, 255, 255,   0, 255,   0, 255, 255,
                    255, 255, 255, 255, 255, 255, 255, 255,
                      0,   0,   0,   0,   0,   0,   0,   0,      
                      0,   0,   0,   0,   0,   0,   0,   0};
                      
byte blue2[8 * 8] = {  0,   0,   0,   0,   0,   0,   0,   0,
                       0,   0,   0,   0,   0,   0,   0,   0,
                     255, 255, 255, 255, 255, 255, 255, 255,
                     255, 255, 255,   0, 255,   0, 255, 255,
                     255, 255,   0, 255,   0, 255, 255, 255,
                     255, 255, 255, 255, 255, 255, 255, 255,
                       0,   0,   0,   0,   0,   0,   0,   0,      
                       0,   0,   0,   0,   0,   0,   0,   0};

// SHIFT_DATA_PIN (PC0 is analog 0) = '595 SER pin (Pin 14)
#define SHIFT_DATA_PORT PORTC
#define SHIFT_DATA_PIN  PC0
#define SHIFT_DATA_DDR  DDRC
// SHIFT_CLK_PIN (PC1 is analog 1) = '595 SRCLK (Pin 11)
#define SHIFT_CLK_PORT  PORTC
#define SHIFT_CLK_PIN   PC1
#define SHIFT_CLK_DDR   DDRC
// '595 RCLK is hooked to tlc XLAT pin (Arduino digital Pin 9, 74HC595 Pin 12)

int led_red;
int led_green;
int led_blue;

static inline void
shift8_595_row(uint8_t row)
{
  // the output of the '595 for the selected row should be low, all others
  // high
  uint8_t output = (1 << row);
  for (uint8_t bit = 0x80; bit; bit >>= 1) {
    if (bit & output) {
      SHIFT_DATA_PORT |= _BV(SHIFT_DATA_PIN);
    } else {
      SHIFT_DATA_PORT &= ~_BV(SHIFT_DATA_PIN);
    }    
    // pulse the '595 sclk
    SHIFT_CLK_PORT |= _BV(SHIFT_CLK_PIN);
    SHIFT_CLK_PORT &= ~_BV(SHIFT_CLK_PIN);
  }
}

ISR(TIMER1_OVF_vect)
{
  if (!isShifting) {
    disable_XLAT_pulses();
    isShifting = 1;
    sei();
    TlcMux_shiftRow(shiftRow);
    shift8_595_row(shiftRow);
    shiftRow++;
    if (shiftRow == NUM_ROWS) {
      shiftRow = 0;
    }
    enable_XLAT_pulses();
    isShifting = 0;
  }
}

void setup()
{
  SHIFT_DATA_DDR |= _BV(SHIFT_DATA_PIN);
  SHIFT_CLK_DDR  |= _BV(SHIFT_CLK_PIN);
  TlcMux_init();
}

void loop()
{
   for (byte Wiederholung = 0; Wiederholung <= 50; Wiederholung++)
   {
     for (uint8_t row = 0; row < NUM_ROWS; row++) 
     {
        for (uint8_t col = 0; col < NUM_COLUMNS; col++) 
        {
           Matrix_Pixel(row, col, red[(row * 8) + col], green[(row * 8) + col], blue[(row * 8) + col]);
        }
     }
     delay(500);
     for (uint8_t row = 0; row < NUM_ROWS; row++) 
     {
        for (uint8_t col = 0; col < NUM_COLUMNS; col++) 
        {
           Matrix_Pixel(row, col, red[(row * 8) + col], green[(row * 8) + col], blue2[(row * 8) + col]);
        }
     }
     delay(500);
   }
   RandomLight(NUM_ROWS, NUM_COLUMNS, 100, 250);
}

void RandomLight(byte NumRow, byte NumColumn, int Wiederholung, int Geschw)
{
  for (int Nr = 1; Nr <= Wiederholung; Nr += 1)
  {
     for (int Reihe = 0; Reihe < NumRow ; Reihe += 1)
     {
        for (int Zeile = 0; Zeile <= NumColumn; Zeile += 1)
        {
           Matrix_Pixel(Reihe, Zeile, random(255), random(255), random(255));
        }
     }
     delay(Geschw);
  }
}

void Matrix_Pixel(uint8_t row, uint8_t column, byte red, byte green, byte blue)
{
   led_red = map(red, 0, 255, 0, 4095);
   led_green = map(green, 0, 255, 0, 4095);
   led_blue = map(blue, 0, 255, 0, 4095);
   TlcMux_set(row, column, led_red / 1.8);
   TlcMux_set(row, column + 16, led_green);
   TlcMux_set(row, column + 32, led_blue);
}

Wenn zwischen den Ausgängen des 74HC595 und den Anoden der Matrix MOSFET's eingesetzt werden muss folgende Zeile

  // the output of the '595 for the selected row should be high, all others low
    uint8_t output = (1 << row);

in

  // the output of the '595 for the selected row should be low, all others high
  uint8_t output = ~(1 << row);

geändert werden !

http://tlc5940arduino.googlecode.com/svn/trunk/Tlc5940Mux/tlc5940mux_circuit_example.png

Benutzt habe ich folgende RGB Matrix:

60mm square 8*8 LED Matrix - super bright RGB (circle)
http://iteadstudio.com/store/index.php?main_page=product_info&cPath=35_37&products_id=189

RGB Matrix -> 74HC595
17 -> 15
18 -> 1
19 -> 2
20 -> 3
29 -> 4
30 -> 5
31 -> 6
32 -> 7

Hoffe das diese Bibliothek auch mit dem Atmega1284 funktioniert.
Muss die MCU wechseln da der Variabelnspeicher des Atmega328 zu klein ist !

hallo Megaionstorm colles projekt war gstern gleich mal darnn eine matrix mit 8x7 RGB Led´s zusammen zubauen die 3 Tlc habe ich hin bekommen

die anoten der RGB`s habe ich auch mit dem 74hc595 verbunden wie du es beschrieben hast .

also wenn ich dein code beispiel teste bekomme ich immer fehler meldung im diseble_XLAT_pulses´was not declared in this scope .
und ist es auch möglich diese matrix mit dmx anzusteuren . ???
gruss danke Tronig

Welche IDE Version ?

Welcher Arduino wird benutzt ?

TLCMux Library korrekt installiert ?

habe die 1.0.1 ich möchte das ganze mit einem arduino denke schon habe alles in die libraries ordener gepackt .

Falls eine der Library Dateien von der IDE nicht gefunden wird kannst Du Sie mit der Funktion 'Sketch/Datei hinzufügen', 'Sketch/Add file" hinzufügen !

Dies für den Fall das Du auch die Meldung '... Tlc5940Mux.h: No such file or directory'
erhälst !

Der Installationspfad der TLCMux Library sollte
'arduino-1.0.1/libraries/Tlc5940Mux'
sein !

In diesem Verzeichnis befinden sich dann die Unterverzeichnise 'examples' und 'pinouts' !

also soweit so gut die fehler meldung ist nun weg .
muss 2 rgb´s auswechseln Danke dir und ich habe auch nur 7 ROW ebenen
hast du da schon irgendwie nee idee wie ich diese nun per DMX oder lauf schrift zb durchlaufen lasse .

Du definierst den Lauftext in einem Array, einmal jeweils für Rot, Grün unf Blau.
Hier kommt dann der Viewport zum einsatz.

Das mit dem Viewport ist folgendermassen.

Dies ist das was Du darstellen willst, als Beispiel.
In diesem Fall 'HI'.

000000000000000000000000000000000000000000
011001100000001100000000000000000000000000
011001100000001100000000000000000000000000
011111100000001100000000000000000000000000
011111100000001100000000000000000000000000
011001100000001100000000000000000000000000
000000000000000000000000000000000000000000

Der Lauftext und damit das Array ist aber grösser als das Display selber.
Du kannst ja nur 8X7 Punkte auf der Matrix darstellen.
Das was Du davon zur Zeit darstellst ist der Viewport.
In diesem Fall ein grosses H.

000000000000000000000000000000000000000000
011001100000001100000000000000000000000000
011001100000001100000000000000000000000000
011111100000001100000000000000000000000000
011111100000001100000000000000000000000000
011001100000001100000000000000000000000000
000000000000000000000000000000000000000000

Wenn Du jetzt Schritt für Schritt den Viewport nach rechts verschiebst erhält Du eine Laufschrift nach links.

000000000000000000000000000000000000000000
011001100000001100000000000000000000000000
011001100000001100000000000000000000000000
011111100000001100000000000000000000000000
011111100000001100000000000000000000000000
011001100000001100000000000000000000000000
000000000000000000000000000000000000000000

In diesem Beispiel währe der Viewport elf mal um jeweils eine Spalte nach rechts weiterbewegt worden. Was auf der Matrix wie ein linkscrollender Text aussieht.

Der Tlc5940Mux Library liegt auch ein Serial Example bei, dies beschäftigt sich mit dem Thema Laufschrift.

Dieser Sketch hat bei mir bisher allerdings noch nie funktioniert !

ich benutze den arduino mit einem atmega168 irgenwo muss ich
doch die pin des arduino´s configurieren
und das mit dem Viewport blick ich nicht wie du das meinst

Kleiner Tip:
Tausch den Atmega168 gegen einen Atmega328 aus, dann hast Du doppelt so viel Speicher.
Dieses etwas mehr an Speicher wirst Du bei deinem Vorhaben vermutlich auch brauchen !

Die Pins sind schon in den Dateien der Library configuriert worden !

Deshalb kann man auch nicht ohne die Library selber zu verändern andere Pins benutzen !

und das mit dem Viewport blick ich nicht wie du das meinst

Schau dir mal das Serial example an, vielleicht wird dann manches verständlicher !

möchte aber das ganze erstmal verstehen das ganze dann werde ich eine anderen besorgen habe leider nur den da

aslo ich habe mich mal hingesetz und gezeichnet.
sollte doch so richtig sein oder

tronig rgb multi.fzz (51.4 KB)

tronig und Du hoffst, daß der 74HC595, bei allen LED eingeschaltet, 480mA geben kann?

Der 595 kann total 70mA und pro Ausgang 35mA treiben. Du mußt einen Treiber wie zB den A2981 zwischen dem 595 und den Anoden der LEDs schalten.
Grüße Uwe

Die Anoden der RGB Matrix sind direkt an dem 74HC595 angeschlossen, ohne Fets oder so !

Genau so habe ich zu Anfang den 74HC595 mit den Anoden der Matrix verbunden gehabt und es hat funktioniert !

Erst später habe ich dann die Darlington Transistoren zwischen den 74CH595 und den Anoden der Matrix geschaltet, habe dann aber bemerkt das die Leds wesentlich heller leuchten !

Hallo!
Könnte mir eventuell noch einmal jemand erklären, was genau die Funktion 'static inline void shift8_595_row(uint8_t row)' macht, bzw. wie die arbeitet und wie man dadurch die Spalten und Reihen geschaltet bekommt? Ich blick da irgendwie noch nicht so durch :~
Aus welcher Datei kann ich denn lesen an welche Pins ich den Tlc und den 595 anschließen muss? Ich habs mir erstmal einfacher gemacht und eine einfarbige 8x8 Matrix gebastelt, also hab ich auch nur von jedem einen..

Danke schonmal!
Moritz

Wie der Tlc5940 mit dem Arduino verbunden wird steht auf dieser Website unter HARDWARE SETUP:
http://code.google.com/p/tlc5940arduino/

Wie der 74HC595 mit dem Arduino verbunden wird steht im in diesem Thread erwähnten Sketch !