Hallo, ich bin grad dabei ein paar LED zu multiplexen, leider leuchten
sie sehr schwach. Wenn ich flash oder den reset betätige leuchten die
LED so wie sollen. Im multiplexbetrieb habe ich gerade mal 0,65V statt
5V pro Pin.
Ich denke das Multiplexen geht zu schnell oder hat einfach ein
schlechtes timing.
Hier mal der Code, vielleicht kann mir jemand das Verhalten erklären. Da
das Problem bereits direkt am uC zu erkennen ist, denke ich, dass es an
der Software liegen muss.
Klar, durch das Multiplexen teilst du sie gerade durch fünf, daher deine
0,65V - einzigste Möglichkeiten: Programm schneller machen..., geringere
Vorwiderstände an den LED's.
Und wenn du den Reset betätigst, dann bleibt dein Programm ja kurze Zeit
an einer Stelle stehen, deshalb wird nicht mehr geplext und die LEDs
bekommen ihre volle Spannung.
ISR (TIMER2_COMP_vect)
{
PORTD ^= (1 << (PD5));
update();
}
... und update macht alle 6 Spalten
Multiplexing macht man anders:
Bei jedem ISR Aufruf wird
die aktuelle Spalte abgeschaltet.
die nächste Spalte mit den richtigen Spaltenwerten bestückt
diese Spalte eingeschaltet
diese Spalte zur aktuellen Spalte erklärt.
und das wars. Die LED brennen bis zum nächsten ISR AUfruf, wo sie dann
abgeschaltet werden und die jeweils nächste Spalte angezeigt wird.
Also nicht in einem ISR Aufruf alle 6 Spalten durchgehen, sondern 6 ISR
Aufrufe bis alle 6 Spalten einmal abgearbeitet sind.
Eine LED Matrix, 6 Breit 4 Hoch. Hab aber bisher nur 8 angeschlossen zum
testen. Gesteuert werden sie mit einem CD4508B.
1 Datenbus (PB0..3)
1 Steuerbus (PD0..5)
Wie löse ich das am elegantesten @Karl heinz Buchegger?
Luke Skywalker schrieb:> Eine LED Matrix, 6 Breit 4 Hoch.
Und wie ist sie elektrisch angeschlossen?
(wozu die ganzen Abfragen da in deiner ISR. Das ist mir nicht klar)
> Hab aber bisher nur 8 angeschlossen zum> testen. Gesteuert werden sie mit einem CD4508B.
Das ist ja nur ein Latch, verändert daher die logishe Funktion nicht.
> Wie löse ich das am elegantesten @Karl heinz Buchegger?
Bis jetzt hab ich noch nicht mal durch das Studium deiner ISR
rausgefunden ob man besser Zeilen oder Spalten multiplex betreiben
sollte
Also: wie ist das ganze angeschlossen.
Ich lade nachher ein Foto hoch, bin derzeit noch auf Arbeit.
Die Abfragen in der ISR sind für eine Uhr. Es soll letzendlich eine
Binäruhr werden.
So wie ich jetzt multiplexe möchte ich es auch lassen, da die latch(es?)
4 bit groß sind.
OK.
Ich geh mal auf Zeilenmultiplexen.
D.h. 6 LED nebeneinander, die sind am Port D angeschlossen, richtig?
Und mit Port B wählt man aus, von welcher Zeile es jeweils die 6
nebeneinander liegenden LED sein sollen
Anfangen möchte ich damit
int ledMatrix[6][4];
das ist Unsinn.
Du hast 6 nebeneinander liegende LED. Die können nur entweder ein oder
aus sein.
D.h. von einem uint8_t kann jedes Bit wunderbar eine LED abdecken.
Daher definier ich:
uint8_t ledMatrix[4];
4 Bytes. In jedem Byte sind die unteren 6 Bit für jeweils 1 LED
zuständig.
1
uint8_tledMatrix[4];
2
uint8_tactLine;
3
uint8_tlineCode[]={1<<PB0,1<<PB1,1<<PB2,1<<PB3};
4
5
ISR(TIMER2_COMP_vect)
6
{
7
PORTB=0;// aktuelle Zeile abschalten, welche es auch immer war
8
9
actLine++;// welches ist die nächste Zeile?
10
if(actLine==4)
11
actLine=0;
12
13
PORTD=ledMatrix[actLine];// die enstprechenden Bits für diese Zeile ausgeben
14
PORTB=lineCode[actLine];// und die Zeilentreiber entsprechend einschalten.
15
}
fertig. Thats it.
Die Bytes in ledMatrix werden reihum an die jeweils richtige Zeile
ausgegeben.
Du brauchst jetzt noch eine Funktion, die dir in ledMatrix das jeweils
richtige Bit setzt.
zb wenn die LED in der 3. Spalte / 2. Zeile gesetzt werden soll, dann
muss
ledMatrix[1] |= 1<<3;
ausgeführt werden.
ledMatrix[1], weil es sich um die 2.te Zeile handelt
1<<3, weil die 3. Spalte gemeint ist.
Luke Skywalker schrieb:> So wie ich jetzt multiplexe möchte ich es auch lassen, da die latch(es?)> 4 bit groß sind.
Wie hast du die verteilt?
Ich werd aus deiner ISR nicht schlau, wie du die 6 LED einer Zeile
angeschlossen hast.
Mit einem 4508 gehts ja wohl nicht.
Du hast 10 Signalleitungen, 1 4508 hat aber nur 8 Latches.
Ausserdem will der ja auch noch angesteuert werden. Da gibt es eine
Strobe Leitung und ein Output Disable.
Was hast du damit gemacht?
(Der 4508 war eine Schnapsidee, was ist an einem ULN2803 falsch?)
D:4 Pins Eingänge (Zeilen)
Q:4 Pins deren Ausgänge
Strobe:1 Pin pro Latch (Spalte)
Reset: GND
Dis(EN): GND
und GND bei Latch A bzw. Vss bei Latch B.
Foto folgt dann und somit hoffentlich mehr Klarheit. Geduld.
Habe die 4508 hier liegen, deswegen verwende ich sie. Vielen Dank für
die Info mit dem ULN.
Luke Skywalker schrieb:> Habe die 4508 hier liegen, deswegen verwende ich sie.
Wie auch immer.
Ist dir das Prinzip des Multiplexens jetzt klarer und wie man das
konkret in einer ISR macht?
Eigentlich sehr einfach.
Deine Hardware ist im Code da oben jetzt noch nicht vollständig
berücksichtigt, aber für dein 2 bisher bestückten Spalten sollte es auf
jeden Fall erst mal reichen. Sofern ich den Anschluss richtig
rausgelesen habe.
So, da ist die Zeichnug.
Karl heinz Buchegger schrieb:> int ledMatrix[6][4];>> das ist Unsinn.
Das ist das direkte Abbild meiner Matrix.
Karl heinz Buchegger schrieb:> Ist dir das Prinzip des Multiplexens jetzt klarer und wie man das> konkret in einer ISR macht?
Naja, also vom Prinzip her klappt das Multiplexen mit meinem Code ja
bereits, deswegen will ich jetzt nicht alles umwerfen nur weil es
schöner aussieht, wenn man Bitmanipulation benutzt.
Ich glaube wenn ich spaltenweise multiplexe macht es mehr Sinn, wegen
dem 4-Bit Latch.
Also könnte ich die jeweils nächste Spalte die bearbeitet werden soll
der Funktion update() mitgeben, den ganzen Port bestücken und mit einem
mal anschalten. So bleiben die LED so lange an, bis die ISR neu
aufgerufen wird und die nächste Reihe dran ist.