Hallo,
Ich plane zur zeit eine 16x16 Matrix und tastete mich deshalb mit Hilfe
eines Tutorials (http://arduino.cc/en/Tutorial/ShiftOut) erstmal an das
shiften mit dem arduino.
Das funktionierte Super und nun möchte ich daraus eine 8x8 Matrix
erstellen, welche mit 2xudn2981 an den Anoden laufen soll (udn2981 in
Reihe zum 595).
Leider habe ich aber das Problem, dass sobald ich die udn dazubaue
nichts mehr durchkommt. Muss ich bei diesen Bausteinen noch etwas in der
Programmierung beachten?
Zum testen verwende ich das Letzte Programm aus dem tut.
Vcc und gnd habe ich verbunden
Vielen dank für eure Hilfe
Patrick
Weil ich ja irgendwann auf eine 16x16 Matrix mit angehängtem Schaltplan
kommen will. ( es sind viele Bauteile drauf die ich erstmal nicht
benötige.)
http://wyolum.com/docs/Nachbau/Nb_v2_SCH.pdf
Momentan reicht mir natürlich ein udn für die Anoden.
Einen Fehler sehe ich auf die Schnelle nicht. Das die UDN mit +5V aktiv
sind ist ja klar.
Die 595 an den Kathoden müssen dann bei 0V aktiv sein.
Warum meinst du das du an den Anoden UDN brauchst und bei den Kathoden
keine? Da sollten es dann aber ULN sein.
Die Platine habe ich noch Zuhause von einem qlocktwo Projekt. Und der
Ersteller hat den obigen Schaltplan verwendet. Dort funktioniert es auch
aber in meinem Probeaufbau leider nicht.
Kann es sein, dass es nicht reicht die Platine über USB zu Speisen?
Sondern muss über Netzteil versorgt werden.
Bisher noch nicht :(.
Wenn ich die LEDs aber direkt am 595 Ausgang betreibe funktionierts.
Wenn ich aber dazwischen noch den udn habe funktioniert nix.
Auf was muss ich Inder Programmierung achten? Habe das Programm aus dem
arduino Tutorial verwendet
Ok, ich habe jetzt nochmal alles neu aufgebaut auf meinem Steckbrett und
jetzt funktioniert es.
Habe sodann eine 4x4 Matrix aufgebaut, um sie dann an einem 595 zu
betreiben.
Angehängtes Programm habe ich draufgeladen, aber es macht noch nicht das
was es soll (1/1 soll leuchten).
Was ist falsch an meinem Programm? Ich will, dass ich mit TurnOn(1,1),
die erste LED anschalten kann...und so weiter
Ok, das war nicht gut was ich da geschrieben habe.
Hier mein neuer Code (Allerdings würde ich gerne wissen, wie ich es
jetzt richtig schreiben muss, dass ich erst die erste LED leuchten
lassen kann und dann die zweite?
Denn wenn ich es mit Delay schreibe, flackern beide LED´s):
1
intlatchPin=8;
2
intclockPin=12;
3
intdataPin=11;
4
5
bytei;
6
bytej;
7
8
bytedataToSend;
9
byteledData[4];
10
11
voidTurnOn(intx,inty)
12
{
13
ledData[x-1]|=1<<y-1;
14
}
15
16
voidsetup(){
17
pinMode(latchPin,OUTPUT);
18
pinMode(clockPin,OUTPUT);
19
pinMode(dataPin,OUTPUT);
20
}
21
22
voidloop(){
23
24
TurnOn(1,1);
25
26
for(i=0;i<4;i++)
27
{
28
bytedataToSend=(1<<(i+4))|(15&~ledData[i]);
29
30
// setlatch pin low so the LEDs don't change while sending in bits
Dein ganzer Denkansatz ist falsch.
Bei einer LED-Matrix geht es nicht im Einzelfall darum, welche LED
konkret zu leuchten hat, sondern um ein allgemeines Schema.
Du hast im Speicher eine Speicherfläche (ein Array), welches deine LED
repräsentiert. WEnn du eine LED leuchten lassen willst, dann setzt du
dort das zugehörige Bit auf 1 bzw. umgekehrt.
Und dann gibt es noch einen allgemeinen Mechanismus, den man am besten
an einen Timer koppelt, der die ganze Zeit nichts anderes tut, als
reihum aus diesen Daten heraus Zeile für Zeile laufend an die Matrix
rauszuschaufeln. D.h. der ganze Ausgabekram hat in der loop eigentlich
nichts verloren, sondern wird Timer-gesteuert in regelmässigen
Zeitabständen aufgerufen.
Und der Ausgabekram gibt auch nicht alle Zeilen auf einmal aus, sondern
immer nur eine. Und beim nächsten Aufruf dann die nächste Zeile.
ALso:
rann an die Bulleten und gelernt, wie man Hardware Timer samt Interrupts
auf einem Arduino benutzt. Geht genau so, wie auch auf nicht Arduino
Systemen. Lediglich die Codeaufteilung ist ein wenig anders, weil du ja
spezielle Funktionen hast, die aufgerufen werden (setup(), loop())
anstatt nur einer einzigen main()
FAQ: Timer
Ok, jetzt bin ich ein bisschen überfordert.
Was muss ich durch den Timer tauschen?
Und wenn ich das erledigt habe, kann ich die "Bilder" wechseln?
Hättest du einen konkreten Änderungsvorschlag für mich?
Patrick schrieb:> Ok, jetzt bin ich ein bisschen überfordert.
Das hab ich mir schon gedacht :-)
D.h. eine LED Matrix fachgerecht aufzubauen ist noch zu schwierig für
dich :-)
> Hättest du einen konkreten Änderungsvorschlag für mich?
Schau dir erst mal in der FAQ: Timer den Timer Abschnitt an!
Dann lass eine LED Timergesteuert blinken.
Wenn du dann das Zusammenspiel von Hardware-Timer und ISR durchschaut
hast, dann kann es mit der Matrix weiter gehen.
Den Abschnitt habe ich mir schon durchgelesen und es auch verstanden.
Mein Problem ist, dass ich nicht verstehe:
- warum ich den Timer verwenden soll, da ich ja jede led bereits so
ansteuern kann wie ich will
- wie mir der Timer bei meinem jetzigen Problem helfen kann.
Kannst du mir mit meinem Programm helfen?
Patrick schrieb:> Den Abschnitt habe ich mir schon durchgelesen und es auch verstanden.>> Mein Problem ist, dass ich nicht verstehe:>> - warum ich den Timer verwenden soll, da ich ja jede led bereits so> ansteuern kann wie ich will> - wie mir der Timer bei meinem jetzigen Problem helfen kann.>> Kannst du mir mit meinem Programm helfen?
1
byte aktuelleZeile;
2
byte ledData[4];
3
4
ISR( ... )
5
{
6
die aktuelle Zeile der Matrix abschalten
7
8
aktuelleZeile++;
9
if( aktuelleZeile == 4)
10
aktuelleZeile = 0;
11
12
die LED der aktuellen Zeile auf das Schieberegister ausgeben
gilt das
> Habe sodann eine 4x4 Matrix aufgebaut, um sie dann an einem 595 zu
betreiben.
eigentlich noch und stimmt die Annahme, dass du sowohl Zeilen als auch
Spalten an einem 595 liegen hast?
Denn dann muss die Ausgabe ein bischen abgeändert werden, damit es nicht
zu Ghosting kommt.
1
ISR( ... )
2
{
3
eine 0 auf das SR ausgeben und aktivieren (schaltet alle LED ab)
4
5
aktuelleZeile++;
6
if( aktuelleZeile == 4)
7
aktuelleZeile = 0;
8
9
die LED der aktuellen Zeile auf das Schieberegister ausgeben
Aktuell habe ich eine 4x4 Matrix an einem 595 (Anoden und Kathoden an
einem)
Nächster Schritt sind zwei 595 für 8x8 Matrix( Anoden und Kathoden
getrennt)
Letztlich wird's so sein, dass eine 16x16 Matrix an 4x 595 betrieben
werden
Das mit 16x16 ist dann nur der theoretische maximalaufbau.
Es werden dann davon nur 10x11 LEDs verwendet.
Aber wie multiplext man eine 16x16 Matrix stattdessen?
Patrick schrieb:> Das mit 16x16 ist dann nur der theoretische maximalaufbau.> Es werden dann davon nur 10x11 LEDs verwendet.>> Aber wie multiplext man eine 16x16 Matrix stattdessen?
Als 2 Matrizen 8*16 gleichzeitig parallel.
Sonst wirds höchst wahrscheinlich zu dunkel.
Aber das wirst du schon noch sehen.
Ok, ich danke dir, dass du dich in mein falsches Programm gedacht hast
und versuche das Programm zu Hause zu ändern.
Ich berichte, wenns was Neues gibt
So, jetzt habe ich es endlich geschafft einen halbwegs funktionierenden
Code zu schreiben.
Was müsste ich noch verbessern?
Was muss geändert werden, dass die gewünschte LED dauerhaft abgeschaltet
werden kann?
Danke
Patrick
Das stopISR bzw. StartISR kannst du dir sparen. Brauchst du nicht. Du
darfst jederzeit auf ledData etwas schreiben. In der ISR wird ledISR nur
lesend verwendet. Daher ist das kein Problem, wenn hier geschrieben
wird.
Starte den Timer in setup() und dann lässt du ihn einfach laufen.
1
voidturnOff(intx,inty)
2
{
3
stopISR();
4
ledData[x-1]&=0<<y-1;
5
startISR();
6
}
so löscht man aber kein Bit.
Bit auf 1 sezten variable |= ( 1 << Bitnummer );
Bit auf 0 setzen variable &= ~( 1 << Bitnummer );
logisch überlegen:
eine 0 kannst du nach links bzw. rechts schieben solange und so oft du
willst. Da kommt immer wieder nur 0 raus. Oder: was mathematisch
äquivalent ist: 0 multipliziert mit irgendeiner anderen Zahl ergibt
wieder 0.
D.h. du hast hier nur möglichst kompliziert geschrieben
ledData[x-1] = 0;
und das ist wohl kaum das, was du willst, denn wenn man egal was mit 0
verundet, dann kommt da auf jeden Fall 0 raus und diese 0 weist du an
ledData zu.
Hallo,
mein Projekt erweist sich leider immer noch als sehr schwierig.
Wollte das Programm jetzt so aufspielen, dass 4x 74hc595 verwendet
werden.
2x 74hc595 + 2x UDN2981 --> Anoden der Matrix
2x 74hc595 --> Kathoden der Matrix
Leider funktioniert nichts. Wo übersehe ich einen Fehler?