Forum: Mikrocontroller und Digitale Elektronik LED Matrix zu dunkel


von Marc S. (fsa)


Angehängte Dateien:

Lesenswert?

Hallo. Ich habe mich mal hier angemeldet, um (vielleicht) Hilfe zu 
bekommen :)
Ich weiß das es so ein Thema schon gab, doch ich habe andere Probleme ;)

Ich habe eine LED Matrix(TC20-11HWA; 5x7) die ich mit meinem Arduino und 
2 Schieberegistern ansteuern will.
Der Schaltplan im Anhang stimmt nicht ganz mit meinem überein.
-Eine Reihe weniger
-Alle Transistoren sind BC548A
-R1-R8(68 Ohm) sind bei mir 0 Ohm
Wenn ich jetzt alle LEDs zum leuchten bringe, dann leuchten sie dunkel, 
aber orange(Originalfarbe rot). Wenn ich bei R1-R8 150 Ohm einsetze, 
leuchten die LEDs auch nur schwach und rot-orange. Ich habe eigentlich 
ein kräftiges Rot erwartet was ich auch bekomme wenn ich das Multiplexen 
langsamer stelle.(7 Reihen in 2 Sekunden)
Mein Multiplex Verfahren ist so:
-Spalte setzen
-Reihe 1 an
-Alle Reihen aus
-Spalte setzen
-Reihe 2 an
-...
Meine Googleergebnisse ergaben, das ich zu wenig Pulsstrom an die LEDs 
schicke. Weiß jemand wie ich mein kräftiges Rot bekomme und kann es mir 
berichten? :)
Danke im Voraus.

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:

> -R1-R8(68 Ohm) sind bei mir 0 Ohm

Ah.
Das gute alte: Strombegrenzung durch ein in die Knie gehendes Netzteil.


> Mein Multiplex Verfahren ist so:
> -Spalte setzen
> -Reihe 1 an
> -Alle Reihen aus
> -Spalte setzen
> -Reihe 2 an
> -...

Wie genau machst du das?

> Meine Googleergebnisse ergaben, das ich zu wenig Pulsstrom an die LEDs
> schicke. Weiß jemand wie ich mein kräftiges Rot bekomme und kann es mir
> berichten? :)

Indem du die LED länger brennen lässt. Zb jede Zeile von einem Interrupt 
zum nächsten.

von Tom M. (Gast)


Lesenswert?

Hast du Vorwiderstände an der Basis von Q1..Q8?
Welche Stromverstärkung haben deine Transistoren beim Maximalstrom in 
deiner Schaltung?
Passt 470R für "voll durchschalten" an der Basis von Q9..Q13?

von Marc S. (fsa)


Lesenswert?

Karl Heinz Buchegger schrieb:
>Ah.
>Das gute alte: Strombegrenzung durch ein in die Knie gehendes Netzteil.

Das ist nicht meine Absicht gewesen. Mein Arduino schickt noch 4.87 Volt 
raus (von 5) also da mache ich wohl was falsch...

>Wie genau machst du das?
Softwaremäßig?
Mit shiftOut Daten an beide Schieberegister senden. Ich habe eine 
Loop-Funktion(c.a 45 Frames). Dort setze ich in jedem Frame die nächste 
Reihe. Eine Aktualisierung braucht also 7 Frames.

>Indem du die LED länger brennen lässt. Zb jede Zeile von einem Interrupt
>zum nächsten.

Wie meinst du das?

Vielleicht sollte ich noch erwähnen das ich 8 Schieberegister benutze, 
aber nur 2 mit Daten befülle(vorerst eine LED-Matrix) und alle anderen 
auf NULL setze.

Ein Frame sieht dann so aus:
1
// Reihen
2
/*
3
d=Data
4
c=Clock
5
l=Latch
6
*/
7
8
shiftOut(d, c, MSBFIRST, 0);  // IC 8
9
shiftOut(d, c, MSBFIRST, 0);  // IC 7
10
shiftOut(d, c, MSBFIRST, 0);  // IC 6
11
shiftOut(d, c, MSBFIRST, FuncForShift(row));  // IC 5
12
13
// Spalten
14
shiftOut(d, c, MSBFIRST, 0);  // IC 4
15
shiftOut(d, c, MSBFIRST, 0);  // IC 3
16
shiftOut(d, c, MSBFIRST, 0);  // IC 2
17
shiftOut(d, c, MSBFIRST, 127);  // IC 1
Latch wird vorher gesetzt.

FuncForSchift rechnet mir die Zahl für das IC aus. Also wenn row 1 ist 
gibt die Funktion 1.
Wenn row 3 ist gibt dir Funktion 4.
Wenn row 4 ist gibt die Funktion 8.
Und so weiter.

Grüße.

von Marc S. (fsa)


Lesenswert?

>Hast du Vorwiderstände an der Basis von Q1..Q8?
Nein.

>Welche Stromverstärkung haben deine Transistoren beim Maximalstrom in
>deiner Schaltung?
Wo steht das im Datenblatt?

>Passt 470R für "voll durchschalten" an der Basis von Q9..Q13?
Das muss ich nach gucken, aber wo steht das im Datenblatt?
Datenblätter sind nicht so mein Freund, und ja das Kommentar "Sollten 
sie aber.." muss keiner hinschreiben :)
Falls jemand das Datenblatt möchte:
http://pdf1.alldatasheet.com/datasheet-pdf/view/50732/FAIRCHILD/BC548A.html

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:

>>Das gute alte: Strombegrenzung durch ein in die Knie gehendes Netzteil.
>
> Das ist nicht meine Absicht gewesen. Mein Arduino schickt noch 4.87 Volt
> raus (von 5) also da mache ich wohl was falsch...

Biete einer LED eine Spannung über ihrer Flussspannung an und sie wird 
anfangen wie wild Strom zu leiten. Bergrenzt wird das durch 2 Faktoren:
* entweder die LED brennt durch
* oder das Netzteil macht irgendwann nicht mehr mit und kann den Strom
  nicht mehr liefern.

>>Wie genau machst du das?
> Softwaremäßig?
> Mit shiftOut Daten an beide Schieberegister senden. Ich habe eine
> Loop-Funktion(c.a 45 Frames). Dort setze ich in jedem Frame die nächste
> Reihe. Eine Aktualisierung braucht also 7 Frames.
>
>>Indem du die LED länger brennen lässt. Zb jede Zeile von einem Interrupt
>>zum nächsten.
>
> Wie meinst du das?

Interrupt.
Timer aufsetzen. Im Overflow wird 1 Zeile eingeschaltet.
Beim nächsten Interrupt kommt die nächste Zeile drann, usw. usw.

> Vielleicht sollte ich noch erwähnen das ich 8 Schieberegister benutze,
> aber nur 2 mit Daten befülle(vorerst eine LED-Matrix) und alle anderen
> auf NULL setze.

Ist egal.
Die Frage ist: welchen Anteil an der kompletten Zeit leuchtet eine 
LED-Zeile?
Das ist die entscheidende Frage. Und bei dir ist das offenbar nicht lang 
genug. Was wohl daran liegt, dass du das Multiplexing nicht über einen 
Timer-Interrupt machst, sondern irgendwie anders.

von Falk B. (falk)


Lesenswert?

Mann O Mann. Wie kann man die Schaltung aus dem Artikel LED-Matrix 
kopieren und elementare Hinweise und Erklärungen ignorieren?

von Marc S. (fsa)


Lesenswert?

Karl Heinz Buchegger schrieb:

>Interrupt.
>Timer aufsetzen. Im Overflow wird 1 Zeile eingeschaltet.
>Beim nächsten Interrupt kommt die nächste Zeile drann, usw. usw.
Kann ich das auch mit der delay Funktion(Arduino Code) lösen? Sie lässt 
das Programm anhalten für #X Millisekunden.

>Was wohl daran liegt, dass du das Multiplexing nicht über einen
>Timer-Interrupt machst, sondern irgendwie anders.
Ja. Ich habe einfach eine loop Funktion die immer ausgeführt wird. Da 
ich in der Welt der Arduinos und Mikrocontroller neu bin, muss ich noch 
mal fragen wie ich Interrupts mit Arduinos löse? Ich komme eigentlich 
aus der Welt der Spieleprogrammierung mit C++ :) Der Artikel über 
Interrupts hat mir auch nicht weiter geholfen...

Falk Brunner schrieb:
>Mann O Mann. Wie kann man die Schaltung aus dem Artikel LED-Matrix
>kopieren und elementare Hinweise und Erklärungen ignorieren?

Was habe ich übersehen?

Danke.

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:
> Karl Heinz Buchegger schrieb:
>
>>Interrupt.
>>Timer aufsetzen. Im Overflow wird 1 Zeile eingeschaltet.
>>Beim nächsten Interrupt kommt die nächste Zeile drann, usw. usw.
> Kann ich das auch mit der delay Funktion(Arduino Code) lösen? Sie lässt
> das Programm anhalten für #X Millisekunden.

Mööööp.
Rote Karte!

Machs ordentlich oder lass es bleiben.
Dann  brauchst du dich auch nicht über fehlende Helligkeit wundern.

von Falk B. (falk)


Lesenswert?

@  Marc S. (fsa)

>ich in der Welt der Arduinos und Mikrocontroller neu bin, muss ich noch
>mal fragen wie ich Interrupts mit Arduinos löse?

Doku gelesen?

>Ich komme eigentlich
>aus der Welt der Spieleprogrammierung mit C++ :)

Und da gibts keine Timer und Interrupts? Selten so gelacht.

>Was habe ich übersehen?

Dass der Artikel eigentich fast alles haarklein erklärt, vor allem auch, 
dass man die Widerstände NICHT gegen 0 Ohm tauschen sollte.

von Marc S. (fsa)


Lesenswert?

Ich will es ja richtig machen, sonst hätte ich nicht um Hilfe gefragt...
Aber ich bräuchte ein kleine Erklärung für Interrupts. Für den Arduino 
habe ich das gefunden:

>The ATMega8 provides two pins (2 and 3) which can trigger software >interrupts 
when the attached digital signal changes.

Aber ich verstehe immer noch nicht was du mit Inerrupt's meinst und 
Timer aufsetzen oder ähnliches.

von Marc S. (fsa)


Lesenswert?

>Und da gibts keine Timer und Interrupts? Selten so gelacht.
Doch. Und ich wette, dass du nicht gelacht hast... Man braucht nur einen 
Timer. Der, der die Zeit für eine Aktualisierung misst. Den Rest MUSS 
man ohne Timer machen. Also ich verstehe nicht was du mir sagen willst 
und warum du "selten so gelacht" hast... Und vor allem wo habe ich 
behauptet das es so was nicht gibt!? C++ für Spieleprogrammierung ist im 
Moment was anderes als Arduino Sketch Code der C ähnelt!
Back to topic.

von Uwe (Gast)


Lesenswert?


von mr. mo (Gast)


Lesenswert?

Was die Kollegen dir sagen wollen ist folgendes:
Du sollst dir einen Timer Interrupt basteln. Heisst soviel wie, dass du 
einen Timer hast der z.B. alle 10ms einen Interrupt auslöst. Der 
Interrupt soll einfach hingehen und die aktuelle Zeile deiner Matrix 
ausschalten und die nächste Zeile einschalten. Wobei du natürlich der 
Zeile noch sagen sollst welche LEDs eingeschaltet werden sollen.

Wenn du nun eine feste Zeitbasis hast, dann werden auch alle LEDs 
gleichmäßig leuchten.

Sollange deine Hardware noch Fehlerhaft ist, solltest du daran erstmal 
basteln.

von Marc S. (fsa)


Lesenswert?

OK Hardware ist nun behoben. Zur Software:
Ich habe eine TimerLibary gefunden die mir eine Funktion aufruft wenn X 
Zeit vergangen ist.
Initialisierung:
1
float g_fSekunden=0.002f,
2
3
Timer1.initialize(g_fSekunden * 1000000.0f);
4
Timer1.attachInterrupt(up);

Die Funktion up setzte mir in jedem Aufruf alle Schieberegister neu. 
Also Spalte und nächste Zeile.

Doch es ist kein Unterschied der Helligkeit erkennbar :(

Was habe ich falsch gemacht? Wenn ich g_fSekunden höher setze, flackert 
die Anzeige.

Danke.

von Marc S. (fsa)


Lesenswert?

Hier der Code falls er wichtig ist:
1
void up()
2
{
3
digitalWrite(l, LOW);
4
5
shiftOut(d, c, MSBFIRST, 0);  // IC 8
6
shiftOut(d, c, MSBFIRST, 0);  // IC 7
7
shiftOut(d, c, MSBFIRST, 0);  // IC 6
8
shiftOut(d, c, MSBFIRST, FuncForShift(row));  // IC 5
9
10
// Spalten
11
shiftOut(d, c, MSBFIRST, 0);  // IC 4
12
shiftOut(d, c, MSBFIRST, 0);  // IC 3
13
shiftOut(d, c, MSBFIRST, 0);  // IC 2
14
shiftOut(d, c, MSBFIRST, 31);  // IC 1
15
16
digitalWrite(l, HIGH);
17
18
row++;
19
if(row> 7)
20
   row=1;
21
}

von Marc S. (fsa)


Lesenswert?

Keiner mehr eine Idee?

von blubb (Gast)


Lesenswert?

Ohne dir zu nahe treten zu wollen: Du solltest deine Matrix erstmal 
beiseite legen und mit den Grundlagen anfangen.

Der oben verlinkte Artikel "AVR-GCC Tutorial" ist da eine ganz gute 
Anlaufstelle.
Da musst du eben durch, anders gehts nicht. Ohne deine Spieleentwicklung 
abwerten zu wollen: embedded Software ist ein ziemlich anderer 
Bereich...

von Marc S. (fsa)


Lesenswert?

>Der oben verlinkte Artikel "AVR-GCC Tutorial" ist da eine ganz gute
>Anlaufstelle.

Hat mit dem Arduino für meine Ziele wenig zu tun, da ich die 
Arduinosoftware nutze ;)

Ich weiß das mit den Grundlagen, die gibt es immer. Doch jetzt will ich 
gar nicht so tief in die Materie. Mich interessiert im Moment nicht wie 
eine Chip innen Funktioniert ;)
Aber ich würde doch gerne wissen warum meine LEDs so dunkel sind.

Gemacht:
-Hardware verbessert
-Timer mit Interrupt

Ohne Multiplexen kriege ich auf die LEDs fast 5 Volt. Mit Multiplexen 
nicht mal einen...
Also kann es nur ein Softwarefehler sein.
Ich wäre echt erfreut wenn mir das einer erklären könnte :) Wenn ich die 
LEDs lange anlasse ist alles schön hell. Aber es flackert so stark das 
kein Bild mehr entsteht...

von mr. mo (Gast)


Lesenswert?

Marc S. schrieb:
> Ohne Multiplexen kriege ich auf die LEDs fast 5 Volt. Mit Multiplexen
> nicht mal einen...

Liegt an der Tatsache, dass du mit einem stink normalen Multimeter wohl 
nicht viel angezeigt bekommst. Mit einem Oscar könntest du mehr sehen.

> Also kann es nur ein Softwarefehler sein.

Das größere Problem ist, dass hier die meisten nicht mit dem Arduino 
rumhantieren und viel lieber in C programmieren. Wobei du irgendwie auch 
nicht mit dem ganzen Code rausrücken magst. Dann kommt noch dazu, dass 
keiner weiß wie dein Aufbau nun tatsächlich aussieht.

von blubb (Gast)


Lesenswert?

Du willst also etwas bauen, ohne wissen zu wollen wie das ganze 
funktioniert.
Ich garantiere dir jetzt schon: du wirst noch sehr oft hier aufkreuzen 
und das Projekt irgendwann frustriert in die Ecke werfen ohne dass das 
Teil läuft.

Dein Unwillen, kompletten Code oder einen Schaltplan rauszurücken tragen 
auch nicht unbedingt zur Lösung bei.
Auserdem happerts bei dir nicht nur an den Programmiergrundlagen. Du 
hast auch das Prinzip des Multiplexens, das du hier anwenden willst, 
nicht verstanden.

Aber ok, ein Tipp kriegst noch:

Wenn die LEDs bei längerer An-Zeit hell leuchten liegt daran, dass sie 
einen ausreichend hohen Strom kriegen.
Das flackern kommt natürlich von der längeren An-Zeit. Dein Auge  lässt 
sich bei niedrigen Frequenzen nicht mehr verarschen und kapiert, dass 
die LEDs nicht dauernd leuchten sondern ständig an- und abgeschalten 
werden.

Also musst du die Frequenz erhöhen bis dein Auge nicht mehr mitkommt, 
das flackern wird weniger und verschwindet.

Nun erscheint die LED aber dunkler. Du musst also den Strom erhöhen.
Angenommen deine LED will im Dauerbetrieb 20mA.
Wenn wir von einem Ein-Aus-Verhältnis von 1:1 ausgehn (halbe Zeit LED 
an, halbe Zeit aus) musst du nun doppelt soviel Strom, also 40mA 
durchpumpen.
Das machst du indem du den Vorwiderstand verringerst.
Im Mittel fließt immer noch der gleiche Strom.

Allerdings sollte deine Software keine Fehler mehr ausweisen. Denn 
bleibt dein Programm irgendwo hängen während die LED leuchtet fließt 
dauerhaft ein zu hoher Strom und die LED raucht ab.

Steht aber alles im von Falk verlinkten Artikel.

von Karl H. (kbuchegg)


Lesenswert?

> Dann kommt noch dazu, dass
> keiner weiß wie dein Aufbau nun tatsächlich aussieht.

... und was du als Netzteil benutzt.
Mit Multiplexen kann man keinen Strom sparen. Dein Netzteil muss 
5*7*15mA mindestens liefern können. Das sind über den Daumen 600mA. Kann 
es das?

von chris (Gast)


Lesenswert?

Moin moin,

vielleicht hilft dieser link um dein Problem zu beseitigen

http://www.ulrichradig.de/home/index.php/avr/avr-mega-dis,

im ersten Absatz wird das Problem beschrieben.

von Peter D. (peda)


Lesenswert?

Marc S. schrieb:
> -R1-R8(68 Ohm) sind bei mir 0 Ohm

Dann leben die LEDs nicht mehr lange bzw. sind schon geschädigt.
Zum Basteln würde ich erstmal den Widerstand so groß machen, daß nur die 
erlaubten 25mA fließen. Dann kann man sich das Multiplexen in Zeitlupe 
anschauen, ohne sie zu zerstören.

Die Lage der Widerstände bestimmt, daß Du Spaltenmultiplex machen mußt. 
D.h. einen Spaltentreiber ein und das dazugehärende Zeilenmuster.
Wenn ich Deinen Codeschnipsel richtig interpertiere, machst Du es genau 
falsch rum. Bzw. die Widerstände müßten dann in Reihe mit Q9..13.

Für mehrstellige Anzeigen ist Zeilenmultiplex sinnvoller. Als 
Zeilentreiber nimmt man 7 leistungs P-FETs. Die Spalten liegen an den 
Registern (mit Widerstand). Dann kann man die Register optimal nutzen 
und verschwendet nicht je 3 Ausgänge.
Ist auch für die Software deutlich einfacher, wenn die Spalten lückenlos 
aneinander gereiht sind, z.B. bei Laufschrift.

Wenn Du Dir mal das Datenblatt anschaust, sind die Conrad-Anzeigen auch 
die mit der schwächsten Intensität. Die besseren haben fast die 20-fache 
Helligkeit.
Vergleiche mal das Datenblatt mit der TC20-11SURKWA.

Ein Helligkeitswunder kannst Du also nicht erwarten. Ich hab die auch 
mal probiert, die haben auch erhebliche Exemplarschwankungen.



Peter

von oldmax (Gast)


Lesenswert?

Hi
Ich glaub nicht wirklich, das du die Matrix per Timer ISR aufrufst. Ich 
hab hier vor mir meine Rentneruhr mit 12 7 Segmentanzeigen und einem 
Atmega16 drin. Das ganze ist in ASM programmiert, aber das spar ich dir, 
dennoch, das Prinzip ist das gleiche.
Du initialisierst deinen Timer so, das er in jeder mSek einen Interrupt 
ausführt. Da steht in der Programmloop nix von. Die Timer-ISR ist völlig 
losgelöst. Eben wie ein eigenständiges Programm, jedoch ohne Loop und 
mit Rücksprung, wohin auch immer.

In dieser Timer-ISR
holst du die letzte Nummer der Zeile,
schaltest die Zeile aus,
erhöhst die Zeilennummer,
holst die neuen Daten für die Anzeige,
       sinnvoller Weise ist der Index auch die Zeilennummer,
legst die Daten auf die gemeinsamen Ausgänge
und schaltest die Zeile wieder ein
Zusätzlich mußt du prüfen,
ob die Zeilennummer größer der Zeilenzahl geworden ist
      und dann auf 0 setzen, um wieder von vorn anzufangen.
So, das nun in C, BASCOM oder meinem geliebten ASM
Alles andere wird im normalen Programm erledigt, b. B. die Daten für die 
Zeilen aufbereiten und in einem Pufferarray abzulegen. Du hast hier eine 
klassische Trennung, aber Zugriff aufs Array von 2 verschiedenen 
Routinen. Das Programm schreibt in den Puffer, die ISR visualisiert die 
Daten aus dem Puffer. 10 msek. halte ich für zu lang, denn die 
Wiederholfrequenz teilt diese 100Hz noch durch die Anzahl der Stellen 
oder in deinem Fall Zeilen. Das Ergebnis: die Anzeige flackert. Bei 1 
mSek. hast du eine sschöne gleichmäßige Anzeige.
Gruß oldmax

von Harald W. (wilhelms)


Lesenswert?

oldmax schrieb:

> Ich hab hier vor mir meine Rentneruhr

Aha, ist das eine Uhr, die die Tage bis zur Rente zählt?
:-)
Gruss
Harald

von oldmax (Gast)


Lesenswert?

Hi
exakt und nicht nur Tage.. sie löst im 1/10 Sekundentakt auf...  noch 
sind meine Kollegen relaxed...
Außerdem sind ein paar nette, auf 7Segment darstellbare Sprüche ab und 
zu sichtbar. Und wegnehmen darf sie auch keiner. Dann zickt sie gewaltig 
rum.
Ist halt ein Spaß, den ich meinen Chef gönne, damit sie wissen, wie 
lange ich sie noch ärgern darf...
Gruß oldmax

von Marc S. (fsa)


Lesenswert?

Zum Schaltplan: Ist genauso wie das Bild im ersten Post. Nur eine Reihe 
weniger und statt 68 Ohm jetzt 150 Ohm.

Software:
Hier der ganze Code mit TimerInterrupt:
1
#include <MsTimer2.h>
2
#include <Arduino.h>
3
4
int l = 8;  // Latch
5
int d = 7;  // Data
6
int c = 9;  // Clock
7
8
int row = 1;
9
10
int FuncForShift(int iDezimal)
11
{
12
  switch(iDezimal)
13
  {
14
  case 0:
15
    return 0;
16
    break;
17
  case 1:
18
    return 1;
19
    break;
20
  case 2:
21
    return 2;
22
    break;
23
  case 3:
24
    return 4;
25
    break;
26
  case 4:
27
    return 8;
28
    break;
29
  case 5:
30
    return 16;
31
    break;
32
  case 6:
33
    return 32;
34
    break;
35
  case 7:
36
    return 64;
37
    break;
38
  }
39
}
40
41
void setup()
42
{
43
  MsTimer2::set(1, up); // 1ms period
44
45
  pinMode(d,OUTPUT);  // Data
46
  pinMode(c,OUTPUT);  // Clock
47
  pinMode(l,OUTPUT);  // Latch
48
49
  //Reset
50
  digitalWrite(l, LOW);
51
  shiftOut(d, c, MSBFIRST, 0);  // IC 8
52
  shiftOut(d, c, MSBFIRST, 0);  // IC 7
53
  shiftOut(d, c, MSBFIRST, 0);  // IC 6
54
  shiftOut(d, c, MSBFIRST, 0);  // IC 5
55
  shiftOut(d, c, MSBFIRST, 0);  // IC 4
56
  shiftOut(d, c, MSBFIRST, 0);  // IC 3
57
  shiftOut(d, c, MSBFIRST, 0);  // IC 2
58
  shiftOut(d, c, MSBFIRST, 0);  // IC 1
59
  digitalWrite(l, HIGH);
60
61
  MsTimer2::start();    // Timer start
62
}
63
64
// Timer interrupt
65
void up()
66
{
67
  digitalWrite(l, LOW);
68
69
  // Reihen
70
  shiftOut(d, c, MSBFIRST, 0);  // IC 8
71
  shiftOut(d, c, MSBFIRST, 0);  // IC 7
72
  shiftOut(d, c, MSBFIRST, 0);  // IC 6
73
  shiftOut(d, c, MSBFIRST, 127);  // IC 5
74
75
  // Spalten
76
  shiftOut(d, c, MSBFIRST, 0);  // IC 4
77
  shiftOut(d, c, MSBFIRST, 0);  // IC 3
78
  shiftOut(d, c, MSBFIRST, 0);  // IC 2
79
  shiftOut(d, c, MSBFIRST, FuncForShift(row));  // IC 1
80
81
  digitalWrite(l, HIGH);
82
83
  row++;
84
  if(row > 7)
85
    row=1;
86
}
87
88
void loop() 
89
{
90
}

@Karl Heinz Buchegger:
Das Netzteil ist ein USB-Port der 500mA liefert. Aber wie kommst du zu 
der Rechnung? Beim Multiplexen habe ich doch Maximal 280mA(40x7).

@chris: Habe ich auch schon gelesen. Leider nicht viel. Außer das ich 
die falschen Anzeigen habe :(

@Peter Dannegger: Ich habe die Widerstände mit 150 Ohm ersetzt. Spalten- 
und Reihen Multiplexen ausprobiert. War kein Unterschied erkennbar.
Ich habe jetzt überall Transistoren verbaut.

Multiplexen in Zeitlupe gibt mir die gewünschte Helligkeit. Doch wenn 
ich keine Flackern haben will, habe ich nur noch leichtes Glimmen.
Was mir gestern auch aufgefallen ist:
Mit Multiplexen schalten vielleicht meine Transistoren nicht ganz durch.
Also die für die Reihen. Auf dem Kollektor habe ich 5 Volt. Die Basis 
wird direkt von den Schieberegistern angesteuert(ohne Widerstand, den 
habe ich nur bei den Spalten). An der Basis habe ich dann 0.7 Volt. 
Genauso wie am Ausgang den Schieberegisters. Das komische ist jetzt, 
dass ich am Emitter auch nur 0.7 und weniger Volt habe. Eigentlich 
sollte es doch mehr sein. Habe am Kollektor ja +5V. Wenn ich Zeitlupe 
Multiplexe habe ich am Emitter die gewünschten 5 Volt.

Danke für die Antworten und kommenden Antworten ;)

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:

> @Karl Heinz Buchegger:
> Das Netzteil ist ein USB-Port der 500mA liefert.

Laut Spez liefert ein USB Port 100mA. 500mA müssen vom Gerät angemeldet 
werden.

> Aber wie kommst du zu
> der Rechnung? Beim Multiplexen habe ich doch Maximal 280mA(40x7).

Na wenn du bei einem 1:7 Multiplex nur 40mA durch die LED jagst, wundert 
mich das jetzt nicht wirklich, wenn das ziemlich dunkel ist. Das 
entspricht ca. einer einzelnen LED, durch die du 7mA schickst. Das ist 
dann schon etwas dunkel.

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:

> Mit Multiplexen schalten vielleicht meine Transistoren nicht ganz durch.
> Also die für die Reihen. Auf dem Kollektor habe ich 5 Volt. Die Basis
> wird direkt von den Schieberegistern angesteuert(ohne Widerstand, den
> habe ich nur bei den Spalten). An der Basis habe ich dann 0.7 Volt.
> Genauso wie am Ausgang den Schieberegisters. Das komische ist jetzt,
> dass ich am Emitter auch nur 0.7 und weniger Volt habe. Eigentlich
> sollte es doch mehr sein. Habe am Kollektor ja +5V. Wenn ich Zeitlupe
> Multiplexe habe ich am Emitter die gewünschten 5 Volt.

Nochmal:
Da sind schnelle Rechteckschwungungen im SPiel. Mit deinem Voltmeter im 
Gleichspannungsmodus kannst du da nichts ausrichten ausser der Aussage: 
Yep, da tut sich was.

von Marc S. (fsa)


Lesenswert?

>Na wenn du bei einem 1:7 Multiplex nur 40mA durch die LED jagst, wundert
>mich das jetzt nicht wirklich, wenn das ziemlich dunkel ist. Das
>entspricht ca. einer einzelnen LED, durch die du 7mA schickst. Das ist
>dann schon etwas dunkel.
Wieso krigt eine LED nur 7mA? Wenn ich die Spalten Multiplexe habe ich 
pro Spalte 7 LED's also muss ich insgesamt 280mA durch die Spalte 
schicken. Oder versteh ich das falsch? Und wen ich mehr mA durch 
schicken will, muss ich dann den Basiswiederstand der Transistoren oder 
die anderen verringern?

von Administrant (Gast)


Lesenswert?

Marc S. schrieb:
> Multiplexen in Zeitlupe gibt mir die gewünschte Helligkeit. Doch wenn
> ich keine Flackern haben will, habe ich nur noch leichtes Glimmen.

Wenn ich richtig gelesen habe, multiplext du über 7 Zeilen, d.h. jede 
Zeile ist max. 1/7 der Zeit "an", die übrige Zeit aus. Da das Auge 
Helligkeit nicht linear wahrnimmt, wird 1/7 Zeit vielleicht noch als 
1/20 Helligkeit wahrgenommen. Von daher wundert mich dein Ergebnis 
erstmal nicht.

Wenn der Aufbau stabil läuft, die Rs vor den LEDs runterschrauben. Im 
Datenblatt der LEDs findest du sicher auch eine Angabe, wie hoch der 
Strom im gepulsten Betrieb sein darf. Den etwa halbieren und die Rs an 
den LEDs (Standardwert, abrunden) entsprechd dimensionieren.

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:
>>Na wenn du bei einem 1:7 Multiplex nur 40mA durch die LED jagst, wundert
>>mich das jetzt nicht wirklich, wenn das ziemlich dunkel ist. Das
>>entspricht ca. einer einzelnen LED, durch die du 7mA schickst. Das ist
>>dann schon etwas dunkel.
> Wieso krigt eine LED nur 7mA? Wenn ich die Spalten Multiplexe habe ich
> pro Spalte 7 LED's

Tschuldigung.
Hab nicht aufgepasst.

Du hast 5 Spalten, also leuchtet jede LED einer SPalte im Mittel nur 1/5 
der Zeit. Wenn du sie auf 40mA eingestellt hast, ist das also ein 
zeitliches Mittel von 40/5 -> 8mA. Auch noch nicht berauschend.

von spontan (Gast)


Lesenswert?

@Marc S.

Ein Tipp nebenbei, lies die empfohlenen Texte durch, versuch sie zu 
verstehen, vergiß das Multimeter bei nicht statischen Spannungen.

von Marc S. (fsa)


Lesenswert?

Also muss ich die 150 Ohm durch 5 Teilen und dementsprechend 30 Ohm 
benutzen? Und wenn ich dann 10 Spalten habe muss ich dann nur 15 Ohm 
benutzen?

von spontan (Gast)


Lesenswert?

Irgendwann grillst Du die LED, welchen Strom verträgt sie denn????? Den 
solltest Du nie überschreiten, auch nicht im Multiplexen.

von Karl H. (kbuchegg)


Lesenswert?

Marc S. schrieb:
> Also muss ich die 150 Ohm durch 5 Teilen

Genau genommen musst du von den 5V noch den Spannungsabfall an den 
beiden Transistoren wegrechnen.

von Karl H. (kbuchegg)


Lesenswert?

Allerdings gehts mir wie den anderen.
Warum soll man dir das alles hier noch mal vorkauen, wenn es sowieso im 
Artikel *** LED-Matrix *** steht. Das du den Artikel kennst wissen 
wir, denn du hast das Bild von dort geholt.

von Marc S. (fsa)


Lesenswert?

OK. Ich bin einsichtig :D Ich habe nun den Artikel nochmal intensiv 
durchgearbeitet und bin zu folgenden Ergebnissen gekommen:

Gegeben:
INenn=25mA
Uf=2.25V
N=5(Spalten Multiplexen)
S=7
USat=0.7V
Ube=0.7V (Bin ich mir nicht sicher, was genau bedeutet diese Spannung?)

Ergebnis:
IZeile = 25 mA * 5 = 125 mA
iSpalte = 25 mA  5  7 = 875 mA
Rv = 10.8 Ohm
Pv = 168.75 mW

Ich hoffe das ist nun richtig :)

Jetzt habe ich noch eine Frage. Wenn ich Zeilen Multiplexen will, muss 
ich dann einfach die 470 Ohm Widerstände als Basiswiederstand vor 
Q1...Q8 hängen und die anderen Widerstände(die dann neu berechnet werden 
müssen) zwischen Spalte und Kollektor von Q9...Q13? Habe ich das jetzt 
alles richtig verstanden?
Danke ;)

von Bernhard S. (b_spitzer)


Lesenswert?

Ich würde für Q1 bis Q8 PNP-Transistoren einsetzen (diesmal mit 
Basiswiderstand) und die Ausgabe für das obere SRG invertieren.

von Marc S. (fsa)


Lesenswert?

Warum? Ich würde doch lieber bei den Transistoren bleiben ;) Weil ich 
mich nach dem Tutorial richte :)
Und stimmt das nun oder nicht? :)

von Shuzz (Gast)


Lesenswert?

Wärst Du jetzt noch so freundlich, mal einen kompletten Schaltplan zu 
posten?

Aus Deinem Code entnehme ich nämlich, dass Du nicht nur zwei sondern 
insgesamt acht Schieberegister ansteuerst, korrekt?
Das stimmt dann iwie nicht mehr so ganz mit dem ersten Bild überein... 
;)

Ansonsten noch ein Vorschlag für Deine FuncForShift:
1
int FuncForShift(int iDezimal)
2
{
3
 return (iDezimal > 0)?(1<<(iDezimal-1)):0;
4
}

Da Deine row Variable sich aber ohnehin nur im Bereich von 1-7 bewegt 
reicht auch
1
int FuncForShift(int iDezimal)
2
{
3
 return (1<<(iDezimal-1));
4
}

von Karl H. (kbuchegg)


Lesenswert?

Shuzz schrieb:

> int FuncForShift(int iDezimal)
> {
>  return (1<<(iDezimal-1));
> }
> [/c]

Nicht so cool.
Aus mehreren Gründen.

int ist schon mal ganz schlecht. Das zwingt dem AVR eine 16 Bit 
Behandlung auf, die hier völlig unnötig ist. uint8_t tut es auch. 
Generell immer den kleinsten Datentyp nehmen, der ausreichend ist.

Ein Shift mit einer variablen Anzahl an Operationen ist für einen AVR 
ein Albtraum. Dafür gibt es keine Assmebler Instruktion. Daher bleibt 
dem Compiler nichts anderes übrig als diese Operation mit einer SChleife 
zu realisieren.
1
uint8_t FuncForShift( uint8_t Dezimal )
2
{
3
  static uint8_t Values[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
4
5
  return Values[Dezimal-1];
6
}

Und was man auch noch tun sollte: Das beinharte darauf bestehen, dass 
bei 1 zu zählen angefangen wird, ablegen! In C fangen wir bei 0 zu 
zählen an. Interessanterweise vereinfacht das nämlich so manchen Code 
nicht unwesentlich.

von Jens (Gast)


Lesenswert?

...sollte man das nicht lieber im PROGMEM ablegen?

So werden 8 RAM-byte dauerhaft verbraucht, oder?

JJ

PS.: wofür static? damit es nicht bei jedem Funktionsaufruf neu angelegt 
wird?

von Karl H. (kbuchegg)


Lesenswert?

Jens schrieb:
> ...sollte man das nicht lieber im PROGMEM ablegen?

Kannst du.
Aber wegen 8 Bytes würd ich da nicht umtun. Wir wollen in der ISR ja 
dann auch auch noch ein wenig auf Speed achten.


> PS.: wofür static? damit es nicht bei jedem Funktionsaufruf neu angelegt
> wird?

Yep.

von Marc S. (fsa)


Lesenswert?

Normalerweise zähle ich immer ab 0. In C/C++ bin ich absolut kein 
Anfänger mehr, doch in C mit Mikrocontroller schon ;)
könnte mir jemand sagen mit was dieser Schaltplan gemacht worden ist? 
Dann kann ich einen machen. Und ja ich steure 8 Schieberegister an, aber 
bei nur 2 verwende ich die Ausgänge.
Das mit dem 10 Ohm Widerstand stimmt übrigens nicht. Also es kann beim 
besten willen nur noch an der Software liegen. Ich habe jetzt für eine 
Reihe schon ein Poti eingebaut. Ich kriege die Anzeige nicht heller, 
egal mit welchem Widerstand.

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Marc S. schrieb:
> Ergebnis:
> IZeile = 25 mA * 5 = 125 mA
> iSpalte = 25 mA  5  7 = 875 mA

Ich will dir ja nicht den Spaß verderben, aber hast du schon mal einen 
Blick in das Datenblatt geworfen?

Die HWA laufen unter "Bright Red" und haben die Kennlinie im Anhang. 
Damit kannst du dir eigentlich Ströme >20mA sparen. Das "Bright" bezieht 
sich vermultich auf die Farbe und nicht auf die Helligkeit.

Eventuell kannst du ja noch etwas retten wenn du sie mit 1:5 multiplext.

von andi6510 (Gast)


Lesenswert?

Hatte (unabhängig von allen SW und HW-Problemen in dieser Diskussion) 
das gleiche Problem mit diesen Displays: Die Dinger sind einfach viel zu 
dunkel!!! Lies bitte dies hier durch - da steht auch drinnen, welche 
Displays man statt dessen verwenden sollte:
https://groups.google.com/d/msg/de.sci.electronics/KxDPfBQS4no/YKLD9UlyL4oJ
Grüße,
Andi

von Marc S. (fsa)


Lesenswert?

TC20-11 SRWA soll gut sein. Doch ich bekomme es nirgendwo! Am liebsten 
wäre mir Reichelt/Conrad oder Voelkner. Weiß da jemand was?
Also bedeutet das, das meine Anzeige dran schuld ist und ich nach den 
Verbesserungen eigentlich alles richtig hatte?

von Bernhard S. (b_spitzer)


Lesenswert?

Marc S. schrieb:
> Warum? Ich würde doch lieber bei den Transistoren bleiben ;) Weil ich
> mich nach dem Tutorial richte :)
> Und stimmt das nun oder nicht? :)
Argh - Kollektorschaltung... ok, passt.

andi6510 schrieb:
> Die Dinger sind einfach viel zu dunkel!!!
Halte mal eine rote Filterscheibe davor. Das erhöht den Kontrast 
ungemein.

von andi6510 (Gast)


Lesenswert?

Marc S. schrieb:
> TC20-11 SRWA soll gut sein. Doch ich bekomme es nirgendwo! Am liebsten
> wäre mir Reichelt/Conrad oder Voelkner. Weiß da jemand was?
> Also bedeutet das, das meine Anzeige dran schuld ist und ich nach den
> Verbesserungen eigentlich alles richtig hatte?

naja, meine hatte ich bei RS bestellt - die wollen aber seit neustem die 
Umsatzsteuer-ID als Nachweis eines Gewerbes sehen. Daher hat es ein 
gewerbetreibender Freund für mich bestellt. Möglicherweise kennst Du ja 
auch einen. Preise und Lieferbedingungen sind bei denen ansonsten OK. 
Man kann auch Einzelteile bestellen.
(Ich frage mich, wie die verhindern wollen, dass die Leute einfach 
irgendeine Umsatzsteuer-ID von einer beliebigen Homepage aus dem 
Impressum klauen und dort angeben... Naja, möglicherweise ist die ID ja 
irgendwie mit dem Namen verknüpft...)

Ich hatte die TA07-11-Typen im Einsatz - davon hätte ich noch ein 
TA07-11-SRWA übrig, falls Du den haben möchtest. Hat aber gemeinsame 
Anode und andere Abmessungen - passt also nicht in dein Design.

Der Tipp mit der roten Filterscheibe ist im übrigen hilfreich - heller 
werden die aber trotzdem nicht. Nur kontrastreicher.

A.

von Peter D. (peda)


Lesenswert?


von Marc S. (fsa)


Lesenswert?

Ich habe mal reichelt angeschrieben. Sie sagen ich bekomme noch eine 
Nachricht. Aber was sollte mich deine denn kosten? Und wie möchtest du 
sie mir zukommen lassen? :)

von Marc S. (fsa)


Lesenswert?

Soll ich per hbe oder farnell bestellen? Ich blicke da gerade nicht so 
durch...

von Marc S. (fsa)


Lesenswert?

Bei hbe finde ich die Anzeige nicht.

von axelr (Gast)


Lesenswert?

Hat schon jemand darauf hingewiesen, das der TO ACHT Schieberegister 
ansteuert und somit sein DutyCycle auf 1 zu 64 hochgeht? (Gehts doch, 
oder?)

Fiel mir nur eben auf, habe aber eigenlich garkeine Zeit, das mir 
genauer anzusehen...

Gruß
Axelr.

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.