Forum: Mikrocontroller und Digitale Elektronik Led Matrix 10x10; Multiplexing; Programm funktioniert nicht


von qa729 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe mir eine kleine LED Matrix mit 10 x 10 Leds gebaut und möchte 
diese nun über C programmieren. Habe auch schon ein kleines Testprogramm 
geschrieben, um zu sehen ob es funktioniert.

Laut dem Testprogramm sollten eigentlich die Leds 15 und 1 leuchten, 
jedoch leuchten reell die Leds 1,5,11,15,81,85,91,95.

Die Matrix ist folgendermaßen aufgebaut:

PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1
x   x   x   x   x   O   x   x   x   O   Transistor auf PB2
x   x   x   x   x   O   x   x   x   O   Transistor auf PB3
x   x   x   x   x   x   x   x   x   x   Transistor auf PB4
x   x   x   x   x   x   x   x   x   x   Transistor auf PB5
x   x   x   x   x   x   x   x   x   x   Transistor auf PB6
x   x   x   x   x   x   x   x   x   x   Transistor auf PB7
x   x   x   x   x   x   x   x   x   x   Transistor auf PC0
x   x   x   x   x   x   x   x   x   x   Transistor auf PC1
x   x   x   x   x   O   x   x   x   O   Transistor auf PC2
x   x   x   x   x   O   x   x   x   O   Transistor auf PC3

Die leuchtenden LEDs sind mit einem großen O gekennzeichnet.

Wahrscheinlich liegt der Fehler an meinen Programmierkenntissen, die 
Schaltung habe ich überprüft.

Ich hoffe hier kann mir jemand helfen, indem er meinem Fehler auf die 
Schliche kommt.

Anbei liegt das Tesprogramm.

Schonmal herzlichen Dank im Vorraus!

qa729

von Peter D. (peda)


Lesenswert?

Du solltest das Pferd besser nicht von hinten aufzäumen.

Multiplexen lebt davon, daß man die LEDs für ein konstantes 
Zeitintervall leuchten läßt.
Durch zufällige Programmlaufzeiten des Main wirst Du daher nie 
glücklich.

Fange also erstmal damit an, einen Timerinterrupt zu programmieren, 1ms 
ist eine gute Multiplexzeit.
Dann klappts auch mit dem Multiplexen.



Peter

von qa729 (Gast)


Lesenswert?

Mir ist bewusst das Multiplexing sehr zeitkritisch ist, und das ganze 
ist ja nur ein Testprogramm. Trotzdem werde ich, wenn ich das ganze mit 
einem Timer Interrupt alle 1ms oder ähnliches ansteuere kein anderes 
Ergebnis bezüglich des Leuchtens feststellen können. Das Leuchten der 
Leds werde ich egal ob mit oder ohne Timer Interrupt gleich lösen.

Ich hätte so oder so nicht um den Timer herumkommen können, da ich 
verschiedene Ausführungszeiten in der Main haben werde.

Trotzdem würde mich immer noch interessieren wieso die Leds so 
undefiniert leuchten (Wobei mir aufgefallen ist das zumindest die Zeilen 
stimmen...).

Danke für die schnelle Antwort, aber leider hat sie nicht gerade zur 
Lösung meines Problems beigetragen.

von Jean P. (fubu1000)


Lesenswert?

Hallo,
mach mal die Semikolons hinter den for-Schleifen und hinter den 
if-Abfragen weg.
Ausserdem beginnt dasn array led[100] bei led[0] und nicht bei led[1].
Zudem reicht ein unsigned char array.


Gruß

von Peter D. (peda)


Lesenswert?

qa729 wrote:

> Danke für die schnelle Antwort, aber leider hat sie nicht gerade zur
> Lösung meines Problems beigetragen.

Nur, weil Du es nicht ernst genommen hast.

Du denkst, for-Schleifen haben eine definierte Laufzeit, aber das ist 
völliger Quatsch mit Soße.

Du kannst keinen Transistor in Emitterschaltung für 1µs ein- und 
ausschalten!


Wenn Du Timerinterrupts dermaßen verabscheust, dann nimm wenigstens die 
Funktionen der delay.h.


Peter

von Alexander S. (esko) Benutzerseite


Lesenswert?

Für row hast du sicher auch Aufrufe von 3 bis 11?!

Ich denke der ganze Code ist vom Ansatz her falsch.

Du solltest dir mal aufmalen was in welcher Reihenfolge passieren muss.
Reihenpin low
Reihenpin high
Spaltenpin low
Spaltenpin high
warten/timer

von qa729 (Gast)


Lesenswert?

Danke für die Hilfe! Ich glaube das dies die Lösung ist. Ich habe 
einfach nicht darauf gedacht das ein Transistor eine bestimmte 
Schaltzeit hat.

Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es 
einfacher zum nachdenken, und das 0te Teil im Array wird 
höchstwahrscheinlich sowieso wegoptimiert.

Die Semikolons hinter den ifs und fors werde ich auch einmal entfernen, 
liegt wahrscheinlich daran das ich schon lange nichts mehr in C 
programmiert habe.

Auf jedenfall schonmal Danke für die Hilfe. Ich werde jetzt einfach ein 
Delay setzen und es wieder ausprobieren.

An dem Timer Interrupt arbeit ich auch schon und ich werde einfach 
später das Ganze richtig programmieren, sollte jetzt einfach nur ein 
Test sein.

Danke für die Hilfe!

von Flo (Gast)


Lesenswert?

> Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es
> einfacher zum nachdenken

Solange du auch dran denkst, dass led[100] nicht das 100. Element ist 
sondern bereits nichtmehr zum Speicherbereich deines 100 elementigen 
Arrays gehört :-)

von Thomas P. (pototschnig)


Lesenswert?

qa729 wrote:
> Das ein Array mit 0 beginnt ist mir schon klar, trotzdem ist es
> einfacher zum nachdenken, und das 0te Teil im Array wird
> höchstwahrscheinlich sowieso wegoptimiert.

Dir ist auch klar, dass led[100] dann außerhalb des Arrays liegt und dir 
was kaputt schreibt?
1
  int led[100];
2
  
3
  for(i = 1;i<101;i++)
4
  {
5
    led[i] = 0;
6
  };

MfG
Thomas Pototschnig

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.