TLC5940 & SD Card

Die TLC5940 Library benutzt die Arduino Pins 3, 9, 10, 11 und 13.

Für eine SD Card werden die Pins 4, 11, 12 und 13 benutzt.

Gibt es eine Möglichkeit beides unter einem Hut zu bringen ?

Die Libs umschreiben.

Die Libs umschreiben.

Wenn ich mich nicht irre werden sowohl für den TLC5940 als auch für den SD Card Zugriff Hardware SPI benutzt !

Ohne den ganzen spaß näher zu kenn, würd ich mal tippen das du nur zwei unterschiedliche Chip select Pins brauchst. Zur Not müsste es halt ein externes Logikgattern tun.
MfG Jago

Ohne den ganzen spaß näher zu kenn

Wird demnächst ausführlich als Projekt (Final Stage) vorgestellt !

So einfach geht das nicht.
Die TLC-Bibiothek verwendet 2 Timer um die Ansteuerungsfrequenz zu erzeugen (GSCLK und BLANK) Dies Kontinuirlich da ansonsten der TLC kein PWM durchführt. Deswegen sind die pins 3 und 10 blockiert. Die restlichen PIN werden nur für die Übertragung der Registerwerte gebraucht. Ich befürchte, daß die SPI Funktion auch einen Timer verwendet.

Die Datenübertragung für SD und den TLC wäre kein Problem.

Grüße Uwe

@Uwe: Ah okay, ich bin davon ausgegangen das dass Problem darin besteht zwei SPI Schnittstellen zu verwenden.

@Megaionenstorm: So meinte ich das doch garnicht :cold_sweat: Wollte damit nur sagen das ich die Datenblätter nicht genau studiert hab. Ist schon vollkomm okay wie du die Problemstellung geschrieben hast. (Okay ein wenig mehr ausschmücken könnte mans schon, aber ne Projektvorstellung ist nicht nötig. Ist ja auch klar was du mit einen PWM-LED-Treiber machst, du baust einen Fusionsreaktor).

Also gut !

Ich benutze zur Zeit eine RGB-Matrix und betreibe diese mit der TLC5940Mux Library.
Bei dieser wird der TLC5940 genauso an den Arduino angeschlossen wie bei der TLC5940 Library.

Desweiteren benutze ich die SD Library der Arduino 0023 IDE.

Jedesmal wenn die Programmausführung diesen Punkt erreicht kommt es nur noch zu einem wildem Geflacker und die SD Card lässt sich nicht initialisieren:

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }

Wenn ich diese Zeilen wieder aus dem Sketch entferne funktioniert die Matrix Wiedergabe wieder fehlerfrei, die SD Funktionen hingegen nur ohne TLC5940Mux Library !

Statt den Hardware SPI Port für den TLC5940 zu verwenden, besteht auch eine "Software" Lösung dafür. Der Nachteil ist, dass diese langsamer ist.

tlcMux_config.h

/** Determines how data should be transfered to the TLCs.  Bit-banging can use
    any two i/o pins, but the hardware SPI is faster.
    - Bit-Bang = TLC_BITBANG
    - Hardware SPI = TLC_SPI (default) */
#ifndef DATA_TRANSFER_MODE
#define DATA_TRANSFER_MODE    TLC_SPI
#endif

/* This include is down here because the files it includes needs the data
   transfer mode */
#include "pinouts/chip_includes.h"

/* Set DATA_TRANSFER_MODE to TLC_BITBANG and change the pins below if you need
   to use different pins for sin and sclk.  The defaults are defined in
   pinouts/ATmega_xx8.h for most Arduino's. */

Gibt es keine Möglichkeit die SD-Funktionen zwischendurch zu deaktivieren, eben das Gegenteil zu SD.begin ?

Megaionstorm:
Also gut !

Ich benutze zur Zeit eine RGB-Matrix und betreibe diese mit der TLC5940Mux Library.
Bei dieser wird der TLC5940 genauso an den Arduino angeschlossen wie bei der TLC5940 Library.

Desweiteren benutze ich die SD Library der Arduino 0023 IDE.

Jedesmal wenn die Programmausführung diesen Punkt erreicht kommt es nur noch zu einem wildem Geflacker und die SD Card lässt sich nicht initialisieren:

  if (!SD.begin(4)) {

Serial.println("initialization failed!");
   return;
 }




Wenn ich diese Zeilen wieder aus dem Sketch entferne funktioniert die Matrix Wiedergabe wieder fehlerfrei, die SD Funktionen hingegen nur ohne TLC5940Mux Library !

Da habe ich zuwenig aufmerksam gelesen.
Wenn Du eine Matrix mit dem TLc ansteuerst dann werden dauernd neue Werte auf den TLC ausgegeben um die LED-Matrix zu multiplexen. Wenn Du jetzt auch noch die SD-Karte ansprichst dann kommen beide sich ins Gehege. Eine Lösung ist die SD-Ansteuerung so in die TLCMux-Bibiothek zu integrieren daß sie sich einander nicht stören. Das sit aber ein kompliziertes und schwieriges Unterfangen.
Versuchs mal zuerst mit einer SW-Emulation derSPI-Schnittstelle für die SD-Karte.

Grüße Uwe

Hallo Uwe,

Versuchs mal zuerst mit einer SW-Emulation derSPI-Schnittstelle für die SD-Karte.

Wo gibt es den sowas, ist mir bei meiner Suche noch nicht über den Weg gelaufen !

Gibt es keine Möglichkeit die SD-Karte über I2C zu steuern ?

nein.I2C und SPi sind inkompatibel.

I2C arbeitet mit einer Taktleitung und eine Datenleitung die bidirektional verwendet wird. Die Adressierung des angesprochenen Bausteins erfolgt über eine Adresse die als ersten Wert bei einer Datenübertragung vom Master gesendet wird.

SPI arbeitet mit 4 Leitungen: einer Taktleitung, einer Sendeleitung einer Empfangsleitung und einen Enable für jeden Baustein. Wenn der Enable LOW ist gelten die Daten auf dem Bus für diesen Baustein. SPI - Arduino Reference
Du könntest mittels eines weiteren Controller ein I2C-SPI Interface programmieren.

Schau Dir mal shiftOut() bzw shiftIn() an. http://arduino.cc/en/Reference/ShiftOut http://arduino.cc/en/Reference/ShiftIn

Grüße Uwe

Du könntest mittels eines weiteren Controller ein I2C-SPI Interface programmieren.

Ja das kann man machen, die zusätzliche MCU liest die Daten über ISP von der SD-Card und schickt diese dann über I2C an die andere MCU !

in der sdfatlib ist soft SPI bereits implementiert.

Bedauerlicherweise führt die Benutzung der SOFTWARE SPI nicht zur geringsten Verbesserung !

Hinzu kommt das die Displayausgabe einfriert und nicht mehr in Gang kommt wenn ich einen Befehl wie Serial.println() benutze !

Durch die Wire Library und I2C konnte ich bisher noch keine Störung feststellen !

Werde also als nächstes, wie Uwe vorgeschlagen hat, einen 2. Atmega328 nehmen und ihn zum Auslegen der SD-Card und zur Datenübertragung dieser Daten zum ersten Atmega328 benutzen !
Eben über I2C !

Habe in einem anderem Forums Eintrag folgenden Text gefunden:

I believe he meant in the interrupt service routine that processes the serial character input flow and places the characters in a buffer and adjusts the buffer pointers.

Vermute mal das hier der Konflikt zwischen TLC5940Mux und der Serial Library ihren Ursprung hat !

Weil die TLC5940Mux die Matrix über den ISR multiplext und ihr die Serial dazwischen Funkt !

hi, forum,

ich hab' mir grad TLC5940er bestellt und werde wohl bald vor dem gleichen problem stehen. deshalb ein paar fragen von mir zum besseren verständnis:
ich dachte, der 5940 macht das alles selbständig, das heißt, ich sag' ihm, schick auf ausgang 12 ein pwm-signal von zb. 16/256el und er tut das, bis ich ihm was anderes sage. die library hielt ich für beiwerk, um genze matrizen reihenweise anzusteuern. damit lag ich wohl eindeutig falsch. muß der 5940 ständig neu initialisiert werden oder warum ist das so? und gibt es ICs, die, einmal beschickt, alleine funktionieren wie ein 74HC595?
wenn ich einen 2en uno nehme, um nur die 5940er zu steuern, was ist der beste weg, um die beiden arduinos kommunizieren zu lassen (ich weiß, kanonen auf spatzen, aber warum nicht? in weitere folge kann man ja statt eines uno nur den fertig programmierten atMega328 mit ein bißchen beiwerk verwenden) ?

gruß stefan

Demystifying the TLC5940:

Ein Atmega328, 3 TLC5940 und 1 74HC595: