Forum: Mikrocontroller und Digitale Elektronik TLC5940 - Anweisung geben


von Jonas H. (fujitsu313)


Lesenswert?

Hey Leute,

ich versuche zur Zeit ein Programm für meine 8x8 LED-Matrix zu 
schreiben. Die Matrix wird über 4 TLC5940 angesteuert, diese sind an 
einem Arduino Serial v2.0 (Atmega328) angeschlossen.

Das ist ein Teil meines Programmes, ich versuche über den Serial Monitor 
im Arduino Programm die drei LEDs zum leuchten zu bringen. gebe ich nun 
0, 1 oder 2 im Serial Monitor ein gehen die LEDs an. Gebe ich nun aber 
64, 65 oder 66 ein passiert nichts..

Später sollen dann die LEDs mit den Zahlen 0-63 eingeschaltet und mit 
den Zahlen 64-127 ausgeschaltet werden. Ein VB.Net Programm sendet dann 
über die serielle Verbindung dem Arduino die einzelnen Werte.

Hat jemand eine Idee, warum das ganze nicht funktioniert?

Gruß Jonas

PS: Hatte noch keine Zeit die einzelnen Zeilen im Code zu 
beschriften..., bzw. zu erklären was genau passiert...
1
int incomingByte;      
2
3
#include "Tlc5940.h"
4
5
void setup()
6
{
7
  Serial.begin(9600);
8
  Tlc.init();
9
  Tlc.clear();
10
}
11
12
void loop()
13
{
14
  int direction = 1;
15
  for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {
16
17
   
18
19
 if (Serial.available() > 0) {
20
 
21
    incomingByte = Serial.read();
22
 
23
  
24
  if (incomingByte == '0') {
25
 
26
     Tlc.set(0, 4095);
27
      Serial.write(incomingByte);
28
      delay(75);
29
    }
30
 
31
     if (incomingByte =='64') {
32
 
33
        Tlc.set(0, 0);
34
      Serial.write(incomingByte);
35
      delay(75);
36
    }
37
    
38
      
39
      
40
      if (incomingByte == '1') {
41
 
42
     Tlc.set(1, 4095);
43
      Serial.write(incomingByte);
44
      delay(75);
45
    }
46
 
47
     if (incomingByte =='65') {
48
 
49
        Tlc.set(1, 0);
50
      Serial.write(incomingByte);
51
      delay(75);
52
    }
53
    
54
      
55
      
56
      if (incomingByte == '2') {
57
 
58
     Tlc.set(2, 4095);
59
      Serial.write(incomingByte);
60
      delay(75);
61
    }
62
 
63
     if (incomingByte =='66') {
64
 
65
        Tlc.set(2, 0);
66
      Serial.write(incomingByte);
67
      delay(75);
68
    }
69
 
70
 Tlc.update();
71
 delay(75);
72
  }
73
  
74
  }
75
76
}

von narf (Gast)


Lesenswert?

Hey,

ich habe den TLC 5940 zu Fuß angesteuert. Bei 4 Chips in Serie läuft das 
in etwas so:

4x Daten in den ersten schieben.
Latchen
Dann den TLC chip takten damit er den PWM Zyklus machen kann.

Das takten klappt prima per Timer output des Atmegas, dann ist die CPU 
nur mit Daten reinschieben beschäftigt.

Meine 8x8 Matrix läuft mit einem attiny2313 und einem TLC5940 - das Teil 
ist schnell genug um auch noch ein Multiplexing zu machen wenn du keine 
4096 Helligkeitsabstufungen brauchst. Bei 8x Multiplexing sind das ja 
noch theoretische 512 Stufen.

Den Rest musst Du schon selbst erledigen - wenn Du keine Zeit hast Deine 
Aufgaben zu erledigen habe ich die erst recht nicht!

von kandinsky (Gast)


Lesenswert?

... Ich bin kein C-Programmierer, aber das hier

' int incomingByte;
' if (incomingByte =='64') {

kommt mir komisch vor!

von Lehrmann M. (ubimbo)


Lesenswert?

kandinsky schrieb:
> ... Ich bin kein C-Programmierer, aber das hier
>
> ' int incomingByte;
> ' if (incomingByte =='64') {
>
> kommt mir komisch vor!

Da liegst du richtig.

if(incomingByte==61)


64 ist ja kein Zeichen. Wenn überhaupts wäre es eine Zeichenkette 
(String) und stünde in "".

http://sites.google.com/site/artcfox/demystifying-the-tlc5940

nimm das PDF unten und lies dir das ganz durch. Das ist für Vollidioten 
erster Klasse geschrieben. Das kann jeder verstehen =)

Da drin ist auch soweit ich das noch präsent habe ein Link zu einem 
FlowChart von TI. Wenn man noch nicht so viel kann, dann kann man das 
problemlos nach C übersetzen.

Allerdings würde ich empfehlen C nochmal anzufangen und nicht 
Script-Kiddie zu spielen und alles im www. zusammensuchen.

Das Programm hilft Null weil das einzig wichtige (die ganzen Funktionen 
die mit tlc..() anfangen fehlen. Ich bin mir noch nicht sicher, ob du C 
umfassend verstanden hast.

narf schrieb:
> Das takten klappt prima per Timer output des Atmegas, dann ist die CPU
> nur mit Daten reinschieben beschäftigt.

Das sollte er aber eigentlich nicht sein. Der ATMEGA sollte eher vor 
Langeweile sterben...

Nimm dem SPI-Output bei Fosc/4 wie im Dokument oben beschrieben.

narf schrieb:
> Meine 8x8 Matrix läuft mit einem attiny2313 und einem TLC5940 - das Teil
> ist schnell genug um auch noch ein Multiplexing zu machen wenn du keine
> 4096 Helligkeitsabstufungen brauchst. Bei 8x Multiplexing sind das ja
> noch theoretische 512 Stufen.

Das musst du mir jetzt nochmal erklären... Die 2^12 * 16 Bits musst du 
ja so und so reinschreiben. Von daher stehen dir immernoch 2^12=4069 
(zumindes theoretische) Helligkeitsstufen zur Verfügung. Ob du die 
danach noch Multiplext hat ja nur Sekundär mit der Helligkeistabstufung 
zu tun. Ich verstehe nochnicht wie du auf diese Rechnugn 4096 / 8 = 512. 
Meinst du wegen der Anzeigezeiten oder wie ?

von Lehrmann M. (ubimbo)


Lesenswert?

Lehrmann Michael schrieb:
> Das ist für Vollidioten
> erster Klasse geschrieben.

Also ich wollte damit nicht sagen, dass du ein Vollidiot bist. Wollte 
nur sagen, dass es damit jeder kann =)

von Jonas H. (fujitsu313)


Lesenswert?

Hey,

Wow, danke für die ganzen Infos, wenn ich genug Zeit hab schau ich mir 
die mal in Ruhe an.

@Michael:
Ein Vollidiot bin ich doch irgendwie ;), bin ja neu in der µc-Welt und 
wollte erstmal "klein" mit dem Arduino anfangen.

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.