Forum: Analoge Elektronik und Schaltungstechnik 16 TLC5940 an ca. 80RGB LED´s via timer und spi angesprochen


von Patrick S. (patrick22285)


Lesenswert?

Morgen Männers =)

Ich bin es wieder, diesmal mit einem Projekt von unserer Techniker 
Schule
ich und zwei Mitschüler wollen ein Mensch ärger dich nicht Spiel
mit RGB-LEDs nachbauen wo man über zwei Taster pro Spieler und einen 
gemeinsamen Würfeltaster das Spiel bedient bzw Spielt. Wir möchten die 
RGB-LED´s mit den 16 TLCs Ansteuern 8 für die Lauffelder und 8 für start 
und Zielfelder mit einer Testplatine hat auch der Einfache 
Versuchsaufbau auch super hin gehauen mit dem Code den ich in meinem 
anderen Thread gepostet hab, wurde der Versuchsaufbau dann Positive 
abgeschlossen anschließend haben wir alle Platinen geätzt, gebohrt und 
gelötet. Jetzt wo das Projekt Hardwaremäßig steht und wir wieder den 
Mikrocontroller angeschlossen haben versuchsweise nur die Lauffelder mit 
8 TLC´s und ca 40 RGB LED´s wollen die Leds nicht mehr wirklich leuchten 
ich hab sie Stromtechnisch erstmal noch an das STK500 angeschlossen das 
sich als Dauerlösung auf keinen fall eignet ein TLC Leuchtet voll die 
anderen haben eine bis drei Leds am Leuchten jetzt wir der erste TLC 
schon recht warm die anderen bleiben Kalt.

Meine Frage:
könnte das wirklich nur an dem Netzteil liegen

bzw warum Leuchtet der sechste TLC voll
und die anderen eher schlecht als recht

wenn ich ein andere Spannungsquelle nehm muss ich Logischer weise auch 
die TLC damit versorgen ?

hier ist nochmal der C-Code:

#include <avr/io.h>
#include <avr/interrupt.h>

/*
 * GccApplication16.c
 *
 * Created: 21.01.2013 18:38:31
 *  Author: Lethaface
 */
#define VPRG_DDR DDRB
#define VPRG_PORT PORTB
#define VPRG_PIN PB0

#define BLANK_DDR DDRB
#define BLANK_PORT PORTB
#define BLANK_PIN PB3

#define XLAT_DDR DDRB
#define XLAT_PORT PORTB
#define XLAT_PIN PB2

#define DCPRG_DDR DDRB
#define DCPRG_PORT PORTB
#define DCPRG_PIN PB4

#define S_IN_DDR DDRB
#define S_IN_PORT PORTB
#define S_IN_PIN PB5

#define S_OUT_DDR DDRB
#define S_OUT_PORT PORTB
#define S_OUT_PIN PB6

#define SCLK_DDR DDRB
#define SCLK_PORT PORTB
#define SCLK_PIN PB7

#define TLC5940_n 1



uint8_t gsDaten[24 * TLC5940_n] = {

  0x00, 0x00, 0x00,      // Channel 14+15
  0x00, 0x00, 0x00,      // Channel 12+13
  0x00, 0x00, 0x00,      // Channel 10+11
  0xff, 0xff, 0xff,      // Channel 8+9
  0xff, 0xff, 0xff,      // Channel 6+7
  0xff, 0xff, 0xff,      // Channel 4+5
  0xff, 0xff, 0xff,      // Channel 2+3
  0xff, 0xff, 0xff,      // Channel 0+1
};


void Init_RGB(void)
{
  // Ports als Ausgänge versehen
  DDRB = 
(1<<SCLK_PIN)|(1<<S_OUT_PIN)|(1<<S_IN_PIN)|(1<<VPRG_PIN)|(1<<BLANK_PIN)| 
(1<<XLAT_PIN)|(1<<DCPRG_PIN);
  DDRD = 0xff;

  S_OUT_PORT |= (1<<S_OUT_PIN);

  SCLK_PORT &= ~(1 << SCLK_PIN);

  DCPRG_PORT &= ~(1 << DCPRG_PIN);

  VPRG_PORT |= (1 << VPRG_PIN);

  XLAT_PORT &= ~(1 << XLAT_PIN);

  BLANK_PORT |= (1 << BLANK_PIN);



  // Aktivieren der SPI Schnittstelle, Masterports, einstellen der Daten 
transfers und das Interrupt
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPIE);
  // Einstellen des fck faktors (fck/2) und aktivieren des Interrupt
  SPSR=(1<<SPI2X);//|(1<<SPIF);

  //Einstellen der Taktrate des Zählers: 8Mhz und Timerart CTC (Clear 
Timer on Compare Match Timer 1)
  TCCR1A=(1<<COM1A0);
  TCCR1B=(1<<CS11)|(1<<WGM12);
  //4096 in das vergleichsregister schreiben zum herstellen desGLSCLK 
Taktimpulse hergestellt
  OCR1AH=0x10;
  OCR1AL=0x00;


  TIMSK |= (1 << OCIE1A);
}

ISR (TIMER1_COMPA_vect)
{

  static uint8_t xlatPulse = 0;
  uint8_t i = 0;


  BLANK_PORT |= (1 << BLANK_PIN);

  if (VPRG_PORT & (1 << VPRG_PIN))
  {
    VPRG_PORT &= ~(1 << VPRG_PIN);
    if (xlatPulse)
    {
      XLAT_PORT |= (1 << XLAT_PIN);
      XLAT_PORT &= ~(1 << XLAT_PIN);
      xlatPulse = 0;
    }
    SCLK_PORT |= (1 << SCLK_PIN);
    SCLK_PORT &= ~(1 << SCLK_PIN);
  }
  else if (xlatPulse)
  {
    XLAT_PORT |= (1 << XLAT_PIN);
    XLAT_PORT &= ~(1 << XLAT_PIN);
    xlatPulse = 0;
  }
  BLANK_PORT &= ~(1 << BLANK_PIN);

  // Nach den 4096 GSCLKŽs können jetzt die daten geschickt werden
  for (i = 0; i < TLC5940_n*24; i++)
  {
    SPDR = gsDaten[i];
    while (!(SPSR & (1 << SPIF)));
  }
  xlatPulse = 1;

}

int main(void)
{

  sei();
  Init_RGB();
  while(1)
  {



  }
  return 0;
}

Das Gehäuse die Programmstruktur(als Textausgabe) und die "Hardware" 
stehen schon nur will das der Verbund zwischen uController mit den 
Treibern noch nicht richtig hinhauen(nur Einzelnd).

Ich bedanke mich schonmal für die Mühe.

von Falk B. (falk)


Lesenswert?

@  Patrick S. (patrick22285)

>Ich bin es wieder, diesmal mit einem Projekt von unserer Techniker
>Schule

Wenn du noch in der Schule bist, solltest du mal etwas über 
Netiquette lernen. Lange Quelltexte gehören in den Anhang.

>ich und zwei Mitschüler wollen ein Mensch ärger dich nicht Spiel
>mit RGB-LEDs nachbauen wo man über zwei Taster pro Spieler und einen
>gemeinsamen Würfeltaster das Spiel bedient bzw Spielt. Wir möchten die
>RGB-LED´s

RGB-LEDs

>8 TLC´s und ca 40 RGB LED´s wollen die Leds nicht mehr wirklich leuchten
>ich hab sie Stromtechnisch erstmal noch an das STK500 angeschlossen das
>sich als Dauerlösung auf keinen fall eignet ein TLC Leuchtet voll die
>anderen haben eine bis drei Leds am Leuchten jetzt wir der erste TLC
>schon recht warm die anderen bleiben Kalt.

>könnte das wirklich nur an dem Netzteil liegen

Eher nicht.

>bzw warum Leuchtet der sechste TLC voll
>und die anderen eher schlecht als recht

Wahrscheinlich weil bei 16 TLC5940 bei der Verteilung der SPI-Signale 
mal wieder was daneben gegangen ist. So wie immer.
Man braucht eine solde Signalführung, vor allem auch gescheite Masse, 
siehe Wellenwiderstand. Wenn die Kabel recht lang sind, muss man 
auch terminieren.

>wenn ich ein andere Spannungsquelle nehm muss ich Logischer weise auch
>die TLC damit versorgen ?

Technikerschule? Ohje! Sowas konnte früher (tm) ein Schüler der 7. 
Klasse im ESP-Unterricht beantworten! Jaja, früher war doch alles 
besser.

>hier ist nochmal der C-Code:

Das nächste Mal bitte als Anhang.

Welcher Controller?

von Patrick S. (patrick22285)


Lesenswert?

Dank dir für deine Antwort

Falk Brunner schrieb:
> Welcher Controller?

Den Atmega32 16 PU

Falk Brunner schrieb:
>Technikerschule? Ohje! Sowas konnte früher (tm) ein Schüler der 7.
>Klasse im ESP-Unterricht beantworten! Jaja, früher war doch alles
>besser.

Da wurde bestimmt auch nicht soviel wert aufs Präsentieren gelegt wie in 
der heutigen zeit.

Endschuldige bitte das ich den Quelltext einfach so gepostet hab das 
nächste mal kommt er wieder in den Anhang

Falk Brunner schrieb:
>Wahrscheinlich weil bei 16 TLC5940 bei der Verteilung der SPI-Signale
>mal wieder was daneben gegangen ist. So wie immer.
>Man braucht eine solde Signalführung, vor allem auch gescheite Masse,
>siehe Wellenwiderstand. Wenn die Kabel recht lang sind, muss man
>auch terminieren.

Sowas lernt man zum Beispiel nicht auf der Technikerschule mit 
Schwerpunkt
Automatisieren und sonstige Hilfen/ Richtungsanweisungen bekommt man 
eben nicht da muss es im Selbststudium erfolgen.

Wir haben auf jedenfall eine Länge der Leiterbahnen die länger ist als 
17,5 cm sind.

von Falk B. (falk)


Lesenswert?

@  Patrick S. (patrick22285)

>Den Atmega32 16 PU

>DCPRG_PORT &= ~(1 << DCPRG_PIN);

Erstes Problem mit der SPI. Das SS-Pin MUSS als Ausgang konfiguriert 
werden. Siehe Datenblatt.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Ansteuerung_per_SPI-Modul

>Da wurde bestimmt auch nicht soviel wert aufs Präsentieren gelegt wie in
>der heutigen zeit.

Was willst du präsentieren, wenn du kein Wissen hast? Oder bist du auf 
der BWLer Schauspielschule?

>Wir haben auf jedenfall eine Länge der Leiterbahnen die länger ist als
>17,5 cm sind.

Tja, dann verlegt sie gut. Verdrillte Leitung für Takt/GND, es reicht 
verdrillter Klingeldraht, muss nicht CAT7 Netzwerkkabel sein. 
Linienförmige Signalführung, nicht sternförmig, möglichst keine 
Stichleitungen. Am Ende eine AC-Terminierung.

von Patrick S. (patrick22285)


Angehängte Dateien:

Lesenswert?

Falk Brunner schrieb:
> Tja, dann verlegt sie gut. Verdrillte Leitung für Takt/GND, es reicht
> verdrillter Klingeldraht, muss nicht CAT7 Netzwerkkabel sein.
> Linienförmige Signalführung, nicht sternförmig, möglichst keine
> Stichleitungen. Am Ende eine AC-Terminierung.

ohne stichleitungen ist es ja kaum möglich meine kürzeste ist 5 mm und 
meine längste 15mm die Takt Dräthe sin mit dem GND Verdrillt ich hab 
jetzt aber auch schon Ergebnisse an einer seperaten Platine

ich setzte alle bits auf 1 im GSData Array und hab an den ersten
drei Channels(0-2) nur Channel 1 durchgeschaltet (Grün)

Channel 3 Leuchtet nur mit Halber Intensität    (Rot)
Channel 4 bis 7 sind Aus
Channel 8 Leuchtet mit gefühlten 75% Intens.(Blau)
Channel 9 und 11 Leuchten (Lila)
Channel 10 ist aus und der Rest 12 bis 15 ist nicht angeschlossen

wenn ich das Array Verändere ändert sich auch die Durchschaltung der 
LEDs
also einzelne kann ich Aus- bzw Einschalten.

ich hab 1mm Breite Leiterbahnen mit einer Aura von 0,6mm da ich 
sichergehen wollte das der erste Ätzversuch auch klappt anbei ist jetzt 
noch der neue Code wo ich einmal den SS als Ausgang geschaltet hab den 
SPI CLK auf 500Khz da mir ein Niedriger wert zu sehr Flackerte

Die AC Terminierung hab ich bis jetzt noch nicht durchgeführt kommt aber 
in kürze

von Falk B. (falk)


Lesenswert?

@Patrick S. (patrick22285)

>ohne stichleitungen ist es ja kaum möglich meine kürzeste ist 5 mm und
>meine längste 15mm

Das ist OK, ich würde mal sagen bis 50mm geht das schon noch.

> die Takt Dräthe sin mit dem GND Verdrillt ich hab
>jetzt aber auch schon Ergebnisse an einer seperaten Platine

>wenn ich das Array Verändere ändert sich auch die Durchschaltung der
>LEDs
>also einzelne kann ich Aus- bzw Einschalten.

>ich hab 1mm Breite Leiterbahnen

Autobahn. 0,3mm reicht locker.

>mit einer Aura von 0,6mm da ich
>sichergehen wollte das der erste Ätzversuch auch klappt anbei ist jetzt
>noch der neue Code wo ich einmal den SS als Ausgang geschaltet hab den
>SPI CLK auf 500Khz da mir ein Niedriger wert zu sehr Flackerte

Dann machst du was falsch. Das schieben der Daten lässt die Anzeige 
nicht flackern. Denn die Daten aus dem Schieberegister werden mit einem 
Schlag ins das Speicherregister übernommen.

Naja, ein Oszilloskop ist hier schon recht nützlich.

Zu deinem Code.

Man macht ERST die Initialisierung, sei() kommt zum Schluß, kurz vor der 
endlosen Hauptschleife.

OCR1A kann man direkt mit 16 Bit beschreiben, das klärt der Compiler für 
dich.

Dein Programm ist merkwürdig. Denn 1. kann man SCK nicht per CPU 
steuern, wenn das SPI-Modul aktiv ist. Muss man auch nicht.

2. fehlt in deiner ISR ein Zähler, damit erst nach eben4096 GS-Takten 
neue Daten in die TLCs geschoben werden.

3. Der BLNAK Pulse für den Reset des GS PWM Zählers muss nicht so lange 
sein, der kann deutlich kürzer sein.

4. Der LATCH Pulse kann direkt nach dem Rausschieben des letzten Bytes 
erfolgen.

Etc.

Viel zu tun.

von Patrick S. (patrick22285)


Lesenswert?

- kurzer zwischen Status -

Nach reichem Studium der Datenblätter..

versteh ich das so:

Das der TLC5940 der einen Takt von 30Mhz (GSCLK 4096 a 16ns H/L) 
benötigt das wiederum eine Frequenz von  30-31 Mhz ist und somit mein 
Atmega32 16PU (16Mhz) der nur einen Takt von 8 Mhz erzeugen kann.

Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir 
ja nicht.

ergo

Wir benötigen entweder einen Quarz oder einen Mikroprozessor der die 
Taktrate erzeugt.

im Demystifying the TLC5940 wird ein Atmega 328 verwendet der einen 
ClkOut besitz und somit dann einen direkten Cpu Clock an CLKO von 20 Mhz 
an den Treiber schickt ich denke das könnte so eventuell "Praktisch" 
noch hinhauen bei niedrigeren Frequenzen erscheint es mir schon fast 
unmöglich.

Hab ich das jetzt alles so richtig aufgefasst oder bin total auf dem 
Holzweg?

von R.T.F.M. (Gast)


Lesenswert?

Patrick S. schrieb:
> Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir
> ja nicht.

?

Patrick S. schrieb:
> Nach reichem Studium der Datenblätter..

...bereits nach flüchgem Lesen sollte sich folgender (etwas 
vereinfachter, die BLANK-Dauer vernachlässigend) Zusammenhang 
erschließen:

GSCLK == 4096 * PWM-Frequenz

bzw.

PWM-Frequenz == GSCLK / 4096


Bei 8MHz GSCLK werden die LEDs bspw. mit 1953 Hz "flackern".

von Falk B. (falk)


Lesenswert?

@  Patrick S. (patrick22285)

>Das der TLC5940 der einen Takt von 30Mhz (GSCLK 4096 a 16ns H/L)
>benötigt

Falsch! Er KANN bis zu 30 MHz getaktet werden, MUSS aber nicht.

>Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir
>ja nicht.

WIR schon, DU nicht.

>Wir benötigen entweder einen Quarz oder einen Mikroprozessor der die
>Taktrate erzeugt.

Nö.

>Hab ich das jetzt alles so richtig aufgefasst oder bin total auf dem
>Holzweg?

You are heavy on the woodway.

von Patrick S. (patrick22285)


Angehängte Dateien:

Lesenswert?

so jetzt hab ichs mal mit dem Oszilloskop Gemessen
ich hab zweit Timer im Compare Match- und  CTC modus auf CPU Takt beide 
geben bei überlauf ein Toggle weswegen der GSCLK Takt nur 4,16 Mhz 
erzeugt
der andere das Blank Signal mit einer Taktung von 1086.95 Hz ich

Timer 1 der das Blank Signal erzeugt Braucht für eine Periode 0,00092 S

Timer 0 der das GSCLK Signal erzeugt braucht für 4096 Perioden 0,00098 S

über ein Interrupt am Timer 1 hab ich über High Low setzten ein 
Versuchten
Impuls zu erzeugen allerdings mein ich das das nicht so "einfach" 
klappt.

der Quellcode ist im Anhang

das Bild was der Chip Produziert ist das gleiche wie einst oben das

Patrick S. schrieb:
> ich setzte alle bits auf 1 im GSData Array und hab an den ersten
> drei Channels(0-2) nur Channel 1 durchgeschaltet (Grün)
>
> Channel 3 Leuchtet nur mit Halber Intensität    (Rot)
> Channel 4 bis 7 sind Aus
> Channel 8 Leuchtet mit gefühlten 75% Intens.(Blau)
> Channel 9 und 11 Leuchten (Lila)
> Channel 10 ist aus und der Rest 12 bis 15 ist nicht angeschlossen

ich hoffe der Ansatz ist jetzt besser

von Falk B. (falk)


Lesenswert?

@  Patrick S. (patrick22285)

>ich hoffe der Ansatz ist jetzt besser

Er ist die blanke Katatrophe. Immer in der Endlosschleife Daten 
rauschieben und unkoordiniert in der IST einen XLAT Puls erzeugen ist an 
Unbrauchbarkeit kaum zu überbieten.

von Patrick S. (patrick22285)


Lesenswert?

Falk Brunner schrieb:
> @  Patrick S. (patrick22285)
>
>>ich hoffe der Ansatz ist jetzt besser
>
> Er ist die blanke Katatrophe. Immer in der Endlosschleife Daten
> rauschieben und unkoordiniert in der IST einen XLAT Puls erzeugen ist an
> Unbrauchbarkeit kaum zu überbieten.

eigentlich meinte ich die Timer...

Falk Brunner schrieb:
> Dein Programm ist merkwürdig. Denn 1. kann man SCK nicht per CPU
> steuern, wenn das SPI-Modul aktiv ist. Muss man auch nicht.

Auf Seite 135 des langen Datenblattes wirst du eines besseren belehrt ;)

aber Dein Schreibstil @Falk Brunner ist echt Image schädigend für das 
Forum den man postet hier keine Threads um blöde Antworten zu bekommen.
Wenn dir hier meine Fragen auf den Keks gehen bist du nicht gezwungen zu 
Antworten.

Ich dachte nur, das Ich hier in einem Forum bin wo man gerne über seine 
Interessen  schreibt und dem Anderen vielleicht hilft falls dieser ein 
Problem hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.