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.
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.
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?
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.
>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
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.
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.
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.
@ 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.
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.
>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.
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.
OK Hardware ist nun behoben. Zur Software:
Ich habe eine TimerLibary gefunden die mir eine Funktion aufruft wenn X
Zeit vergangen ist.
Initialisierung:
1
floatg_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.
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...
>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...
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.
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.
> 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?
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
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
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
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
intl=8;// Latch
5
intd=7;// Data
6
intc=9;// Clock
7
8
introw=1;
9
10
intFuncForShift(intiDezimal)
11
{
12
switch(iDezimal)
13
{
14
case0:
15
return0;
16
break;
17
case1:
18
return1;
19
break;
20
case2:
21
return2;
22
break;
23
case3:
24
return4;
25
break;
26
case4:
27
return8;
28
break;
29
case5:
30
return16;
31
break;
32
case6:
33
return32;
34
break;
35
case7:
36
return64;
37
break;
38
}
39
}
40
41
voidsetup()
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
voidup()
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
voidloop()
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 ;)
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.
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.
>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?
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.
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.
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.
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.
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 ;)
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
intFuncForShift(intiDezimal)
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
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.
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.
...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?
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.
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.
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.
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
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?
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.
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.
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? :)
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.